如何通过GitLab Pipeline实现Docker镜像标签版本自动递增
Docker镜像标签随分支提交自动递增实现方案
以下两种方案都可以直接基于现有GitLab CI配置修改,不需要额外部署服务。
方案1:分支内严格连续递增(完全匹配场景需求)
实现逻辑:固定主版本号、次版本号,通过Git提交计数计算补丁号,当前分支每多一次提交,补丁号自动+1,严格从v1.0.1开始递增。
注意点:
- 需要使用带Git客户端的Docker镜像,否则无法统计提交数
- 需要关闭浅克隆,否则拿不到完整提交历史会导致计数错误
修改后的完整配置如下:
stages: - build-docker-image variables: # 关闭浅克隆,拉取完整提交历史用于计数 GIT_DEPTH: 0 docker-build: # 替换为自带Git的Docker镜像 image: docker:20.10.16-git stage: build-docker-image # 启动docker服务端依赖 services: - docker:20.10.16-dind script: - | if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then tag="" echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'" else # 固定主、次版本,补丁号取当前分支领先默认分支的提交数+1,首次提交即为1 MAJOR=1 MINOR=0 PATCH=$(git rev-list --count "$CI_DEFAULT_BRANCH"..HEAD) tag=":v${MAJOR}.${MINOR}.${PATCH}" echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag" fi - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY" - docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" . - docker push "$CI_REGISTRY_IMAGE${tag}" rules: - if: $CI_COMMIT_BRANCH exists: - Dockerfile
该配置下,从默认分支切出新分支后,第一次提交构建的镜像标签就是v1.0.1,第二次提交就是v1.0.2,完全匹配示例要求。
方案2:极简配置实现全局递增
如果不需要严格要求分支内补丁号从1开始,只需要保证每次提交的镜像标签唯一且递增,可以直接用GitLab内置的CI_PIPELINE_IID变量,这个变量是项目级自增ID,每触发一次流水线就自动+1,不需要依赖Git命令、不需要修改克隆配置。
只需要把非默认分支的tag赋值逻辑替换成下面的内容即可:
tag=":v1.0.${CI_PIPELINE_IID}"
这个方案配置量最小,缺点是版本号不会从1开始,比如切分支时项目已经跑过12次流水线,那分支第一次构建的版本就是v1.0.13,但能保证每次提交的版本号一定递增、不重复。
扩展说明
如果后续需要升级主/次版本,只需要修改脚本里写死的MAJOR、MINOR变量值即可,比如要发布v1.1.0版本,就把MINOR改成1,也可以加标签判断逻辑,匹配到正式版本tag时直接用Git tag作为镜像标签即可。
内容的提问来源于stack exchange,提问作者user19493767
相关产品推荐
相关产品推荐

