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

如何在GitLab-CE中为成功完成的CI/CD流水线打Git标签?

在GitLab-CE中实现流水线成功后自动打指定格式Tag的方案

核心思路

在CI/CD流水线末尾新增tag阶段,仅当前面的compile、test、package、deploy全部执行成功时触发打Tag操作,确保只有通过全流程验证的分支状态会被标记。


步骤1:修改.gitlab-ci.yml配置

在流水线配置文件中添加专门的打Tag Job,放在所有阶段之后:

# 定义流水线阶段顺序
stages:
  - compile
  - test
  - package
  - deploy
  - tag

# 打稳定部署Tag的Job
create_stable_deploy_tag:
  stage: tag
  # 仅在分支流水线运行,排除Tag触发的流水线
  only:
    - branches
  except:
    - tags
  # 仅当前面所有阶段成功时执行
  when: on_success
  # 不依赖前面阶段的产物,加快执行速度
  dependencies: []
  script:
    # 配置Git提交用户信息(CI环境默认无此配置)
    - git config --global user.name "GitLab CI Bot"
    - git config --global user.email "ci-bot@your-domain.com"
    # 构造符合要求的Tag名称:/分支名/stableDeploy/
    - TAG_NAME="/${CI_COMMIT_BRANCH}/stableDeploy/"
    # 检查Tag是否已存在,避免重复推送失败
    - if git ls-remote --tags origin | grep -q "${TAG_NAME}"; then echo "Tag ${TAG_NAME} already exists, skipping"; exit 0; fi
    # 创建带注释的Tag
    - git tag -a "${TAG_NAME}" -m "Stable deploy verified for branch: ${CI_COMMIT_BRANCH}"
    # 使用PAT推送Tag到远程仓库
    - git push https://${GITLAB_USERNAME}:${GITLAB_PAT}@${CI_REPOSITORY_URL#*@} "${TAG_NAME}"

步骤2:配置CI/CD变量

在项目的Settings > CI/CD > Variables中添加两个变量:

  • GITLAB_PAT:拥有write_repository权限的个人访问令牌(PAT),创建时选择api范围并勾选write_repository权限。
  • GITLAB_USERNAME:拥有仓库推送权限的GitLab用户名。

关键细节说明

  1. 触发条件控制:only: branches和except: tags确保该Job仅在分支推送的流水线中运行,完全规避“先打Tag再构建”的场景。
  2. 重复Tag规避:脚本加入Tag存在性检查,防止流水线重跑时因重复推送Tag失败。
  3. 权限保障:使用个人访问令牌(PAT)而非默认CI_JOB_TOKEN,因为默认令牌通常没有推送Tag的权限(GitLab-CE默认配置)。
  4. Tag格式合规性:Git允许Tag名称包含/,这种格式能清晰区分不同分支的稳定部署标记,方便后续cherry-pick操作。

内容的提问来源于stack exchange,提问作者cilap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:11:15