使用 Github Action 构建并推送 Docker 镜像到 Gitlab 的镜像托管中心
Github 和 Gitlab 两家都有免费的持续集成和发布功能,本文综合 Github 和 Gitlab 两者免费账户的各自特点,取长补短,以达到一定程度的优化体验。
起因
Github VS Gitlab 对比如下:
| 功能 | Github | Gitlab |
|---|---|---|
| 私人仓库数 | 无限制 | 无限制 |
| Actions | 2000 分钟,或自建 runner | 2000 分钟,或自建 runner |
| Actions 和 Packages 存储空间 | 500MB | 10GB |
| Packages 上行流量 | 1GB | 暂未查到 |
Github 500MB 的镜像存储空间相对有些掣肘。
两家都支持用户自建 runner,我之前都是自建服务器来构建 Docker 镜像,但是性价比不高,虽然两家都提供免费 2000 分钟的 CI/CD 时间,但是因为 Github 会启动一个双核 CPU,7GB 内存的虚拟机来跑,而 Gitlab 是共享十几台服务器来跑,所以 Github 可以说相当良心了。同一个镜像的构建,Github 的虚拟机跑不到8分钟,而我 1 核 1G 内存的高性能 VPS,则要跑17分钟左右,对比很明显了。
我们的目标,版本库同时使用 Github 和 Gitlab(Gitlab 只做 Push,以作备份),源码推送到 Github 后,开始启动 Action,待镜像构建完毕即推送到 Gitlab Container Registry,然后我们从 Gitlab 下载镜像来进行后续的应用部署。
新建或者旧有 Github 仓库中增加推送到 Gitlab 的链接
1
git remote set-url --add --push origin your-gitlab-repostory-link
用命令:
1
git remote -v
查看最后的链接,大约是这个样子:
origin git@github.com:your-user/your-repo.git (fetch)
origin git@gitlab.com:your-user/your-repo.git (push)
origin git@github.com:your-user/your-repo.git (push)
申请 Gitlab token
这一步是为了让 Github 能使用 Gitlab 相关的功能,在 Gitlab 网站,如下路径:User Settings > Access Tokens,新建 Token,只勾择如下功能即可:read_registry, write_registry。或许也可以取消 read_registry 功能,但我没试。
生成完毕后,复制出现的 Token,备用。
设置 Github 中的仓库
进入仓库的 Settings > Secrets 中,点击 New repostory secrets 按钮,增加名为:GITLAB_TOKEN 的项,值就是上一步申请的 Token。 然后再增加 GITLAB_USERNAME 项,值就是你的 Gitlab 登录名。
创建 Github Action 文件
按照 Github 的规则,在仓库根目录下创建如下两级目录:.github\workflows。在新创建的目录下,创建 YAML 文件,比如叫:build-push-docker-image.yml。内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
name: build and push docker image to github package
on:
push:
branches: master
jobs:
path-context:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up QEMU
uses: docker/setup-qemu-action@v1
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Login to Gitlab Container Registry
uses: docker/login-action@v1
with:
registry: registry.gitlab.com
username: ${{ secrets.GITLAB_USERNAME }}
password: ${{ secrets.GITLAB_TOKEN }}
-
name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: registry.gitlab.com/${{ secrets.GITLAB_USERNAME }}/your-repo/your-app:latest
build-args: |
arg1=var1
arg2=var2
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
上述内容主要来自于:Docker 官方 build-push-action 库的描述,我只是增加了对 Gitlab Container Registry 推送描述。
如上设置完毕后,实现了两库推送(Github,Gitlab),使用 Github Action,完成镜像构建并推送到 Gitlab。