实现目的
公司后端的服务采用Docker镜像的方式进行分发与部署,之前选用DockerHub作为托管平台,但由于DockerHub对于私有仓库数的限制以及最近各种网络状况频出,选用GitHub在2020年推出的ghcr以及阿里云的容器镜像服务都可以更好的满足公司内部对于安全以及持续集成的需求。
GitHub Actions
整个CICD的流程都采用GitHub Actions来进行,采用GitHub Actions的优点有很多,不仅可以很方便的看到整个自动化的进度,而且从维护成本来看只需要管理好GitHub Actions的配置文件即可,配置文件也叫做工作流文件(workflow),采用yml格式文件进行编写。
推送至ghcr与阿里云
在Actions中,我们采用几个核心的步骤来进行镜像的打包,标记与分发。
- 首先进行不同库的登录操作,目的是获取对应仓库的操作权限。
- 对镜像进行不同仓库的对应标记,使其可以上传到对应的仓库中。
- 进行分发。
在GitHub Actions中有许多已经封装好核心逻辑的Action可供使用,有官方的也有第三方的,在本Action中与Docker相关的操作都采用了docker官方出品的Action。
登录操作
由于ghcr是GitHub官方的镜像库,因此用户名与密码并不需要显式定义出来,用户名用
${{ github.repository_owner }}
,password用${{ secrets.GITHUB_TOKEN }}
即可,需要注意的是,上传至ghcr需要开放github_token对于库的读写权限,可在仓库设置中开启。在Settings-Actions-General中,将Workflow permissions的权限勾选为读写权限。
对于阿里云的镜像管理服务,则需要在secret中定义从阿里云获取的用户名与密码。
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to AliYun Container Registry
uses: docker/login-action@v2
with:
registry: registry.cn-guangzhou.aliyuncs.com
username: ${{ secrets.ALI_USERNAME }}
password: ${{ secrets.ALI_TOKEN }}
对镜像进行标记
在images一栏中填入ghcr与阿里云的镜像地址即可,下方的tags为标记的逻辑。
默认采用latest与当前tag版本号即可。
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ github.repository }}
registry.cn-guangzhou.aliyuncs.com/hamster-home/kes-speed-backend
tags: |
type=raw,value=latest
type=ref,event=tag
进行镜像的推送
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
推送后续
推送后即可在GitHub以及阿里云中看到最新推送的镜像。