azure 有自己的容器镜像仓库服务 acr(azure container registry)。用户可以构建容器镜像之后推送到 acr 中。当然,还可以直接借助极狐GitLab CI/CD 实现容器镜像构建和推送的自动化。下面演示如何使用极狐GitLab CI/CD 构建容器镜像并自动推送到 acr 中。
首先,需要在 azure 上创建一个 acr 服务。创建成功之后,可以看到对应的信息:
acr 详情页面
镜像仓库的登录地址为 jihugitlab.azurecr.cn
。点击页面上的 Push an Image 可以看到右侧的登录方法:
az acr login --name JiHuGitLab
Uppercase characters are detected in the registry name. When using its server url in docker commands, to avoid authentication errors, use all lowercase.
Login Succeeded
之后就可以使用 docker pull、push
等命令了:
docker pull mcr.microsoft.com/mcr/hello-world
docker tag mcr.microsoft.com/mcr/hello-world jihugitlab.azurecr.cn/samples/hello-world
如果要使用 docker login
的方式登录 acr,需要在 Access Key 中找到对应的用户名和密码:
Access key 页面
同样可以登录成功:
docker login jihugitlab.azurecr.cn
Username: JiHuGitLab
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
一般来讲,在极狐GitLab CI/CD 中构建容器镜像的 .gitlab-ci.yml
文件内容如下:
build:
image: docker:latest
stage: build
services:
- docker:20.10.7-dind
script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:1.0.0 .
- docker push $CI_REGISTRY_IMAGE:1.0.0
只需要将环境变量 CI_REGISTRY_USER
、CI_REGISTRY_PASSWORD
、CI_REGISTRY
修改为 acr 中的数值即可。也就是将这些变量都以环境变量的形式存储到极狐GitLab CI/CD 变量中(项目 --> 设置 --> CI/CD --> 变量):
极狐GitLab 添加 CI/CD 环境变量
因此,.gitlab-ci.yml
文件中的内容如下:
build:
image: docker:latest
stage: build
services:
- docker:20.10.7-dind
tags:
- gitlab
script:
- docker login -u "$ACR_REGISTRY_USER" -p "$ACR_REGISTRY_PASSWORD" $ACR_REGISTRY
- docker build -t $ACR_REGISTRY_IMAGE:1.0.0 .
- docker push $ACR_REGISTRY_IMAGE:1.0.0
出发 CI/CD 流水线之后,可以查看构建结果:
极狐GitLab CI/CD 流水线构建页面
镜像构建成功,并且推送到了 acr 中,可以在 acr 中查看。在 acr 的 repositories 中看到推送成功的镜像:
Azure container registry 页面
为了提高 CI/CD 流水线的复用性、易用性,极狐GitLab 从 16.0 引入了 component 功能,16.1 引入了 catalog 功能。对于这两个功能的详细介绍可以参考过往的技术文章极狐GitLab CI/CD Component & Catalog 功能揭秘。
对于上面的流程,可以采用直接引用 component 的方式来简化 CI/CD 流水线的构建。在极狐GitLab SaaS(JihuLab.com)上点击搜索或转到 --> 探索 --> CI/CD 目录,可以看到已经发布的 CI/CD Component:
极狐GitLab CI/CD 目录页面
第一个 docker-image-build
就是构建容器镜像,并将其推送到镜像仓库的 component:
极狐GitLab CI/CD Component 页面
Component 的实际内容如下:
spec:
inputs:
stage:
default: test
image:
default: docker:20.10.7-dind
image_tag:
default: 1.0.0
tags:
default: jh-gitlab
---
component-job-build-image:
image: $[[ inputs.image ]]
stage: $[[ inputs.stage ]]
tags:
- $[[ inputs.tags ]]
script:
- docker login -u "$ACR_REGISTRY_USER" -p "$ACR_REGISTRY_PASSWORD" $ACR_REGISTRY
- docker build -t $ACR_REGISTRY_IMAGE:$[[ inputs.image_tag ]] .
- docker push $ACR_REGISTRY_IMAGE:$[[ inputs.image_tag ]]
在项目中的引用方式为:
include:
- component: jihulab.com/jh-xiaomage-devops/docker-image-build/docker-image-build@5.0.0
inputs:
stage: build
image: docker:20.10.7-dind
tags: gitlab
image_tag: 2.0.0
然后触发流水线,直接查看构建结果:
极狐GitLab CI/CD 流水线构建页面
然后在 acr 上查看 tag 为 2.0.0
的镜像是否被推送过去:
Azure container registry 页面
2.0.0
的镜像已经存在于 acr 中了,说明引用 component 将镜像构建并推送成功。