You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:06:23