GitLab CI作业if规则中$CI_COMMIT_TAG为空如何实现指定分支镜像构建
问题根因
GitLab CI 预定义变量$CI_COMMIT_BRANCH与$CI_COMMIT_TAG为互斥关系:
- 分支推送事件触发的流水线,仅会填充
$CI_COMMIT_BRANCH,就算当前提交关联了标签,$CI_COMMIT_TAG也为空 - 标签推送事件触发的流水线,仅会填充
$CI_COMMIT_TAG,$CI_COMMIT_BRANCH为空
你原有配置的规则需要两个变量同时存在,不可能匹配到任何有效场景,因此无法拿到标签值、也不会触发预期的作业。
实现方案
调整规则匹配逻辑,同时补充标签所属分支校验即可满足需求,完整配置如下:
Build and publish docker image: stage: build rules: # 匹配标签推送场景 - if: $CI_COMMIT_TAG && $CI_PIPELINE_SOURCE == "push" variables: TAG: $CI_COMMIT_TAG # 匹配develop分支推送场景 - if: $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push" variables: TAG: develop # 其余所有场景不触发该作业 - when: never script: # 标签推送场景下校验提交是否属于main分支,不属于则直接跳过构建 - | if [ -n "$CI_COMMIT_TAG" ]; then # 拉取远端main分支信息,若构建镜像未预装git可提前安装或换用GitLab API判断 git fetch origin main > /dev/null 2>&1 if ! git branch -r --contains $CI_COMMIT_SHA | grep -q "origin/main"; then echo "当前标签对应提交不在main分支,跳过构建" exit 0 fi fi - echo "待构建镜像标签为 $TAG" # 此处补充你的docker build、docker push等剩余命令
逻辑说明
- 标签推送会触发独立的流水线,我们先全量匹配标签推送事件,再在作业逻辑中校验标签对应提交是否属于main分支,不符合就直接退出,不会执行后续构建
- develop分支推送的逻辑保持不变,直接固定镜像标签为
develop即可 - 所有不符合上述两个场景的推送都会自动跳过该作业
内容的提问来源于stack exchange,提问作者Archirk。
相关产品推荐
相关产品推荐

