不幸的是,GitLab CI 上有很多关于构建多架构镜像的过时且不正确的信息。由于它仍然是一个实验性功能,因此似乎经常发生变化。但截至本文撰写时,我的多架构构建在 GitLab 公共运行器(armv6、armv6、arm64、amd64)上运行:
首先,必须构建并推送一个包含以下内容的 Docker 镜像:buildx
二进制。这是我为此使用的 Dockerfile:
FROM docker:latest
ARG BUILDX_VER=0.4.2
RUN mkdir -p /root/.docker/cli-plugins && \
wget -qO ~/.docker/cli-plugins/docker-buildx \
https://github.com/docker/buildx/releases/download/v${BUILDX_VER}/buildx-v${BUILDX_VER}.linux-amd64 && \
chmod +x /root/.docker/cli-plugins/docker-buildx
当前的 GitLab 运行器镜像未初始化binfmt
尽管运行了初始化代码,但处理程序仍然正确:https://gitlab.com/gitlab-org/gitlab-runner/-/blob/523854c8/.gitlab/ci/_common.gitlab-ci.yml#L91 https://gitlab.com/gitlab-org/gitlab-runner/-/blob/523854c8/.gitlab/ci/_common.gitlab-ci.yml#L91
所以我们必须在我们的管道中做到这一点。我们参考了中的评论MR 1861 https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1861的 GitLab Runner 代码并将以下魔法酱添加到我们的.gitlab-ci.yml
:
before_script:
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
然后我们可以运行管道脚本的其余部分docker login
, docker buildx build --use
, docker buildx build --push ...
等等。
现在,运行程序已准备好构建多种架构。
我的决赛.gitlab-ci.yml
可以在这里看到:https://github.com/oofnikj/nuttssh/blob/multiarch/.gitlab-ci.yml https://github.com/oofnikj/nuttssh/blob/multiarch/.gitlab-ci.yml