GitLab CI单阶段判断分支是否为tag并执行对应命令的方法
单作业内判断tag触发并执行对应命令的实现
GitLab CI提供了内置预定义变量CI_COMMIT_TAG:流水线由tag触发时,该变量值为对应tag的名称;普通分支、合并请求触发时,该变量为空值。你不需要拆分多个作业,直接在同一个作业的script块中通过shell条件判断即可分流执行不同命令。
基础配置示例
# 替换为你实际的作业名 deploy_job: stage: deploy # 替换为你实际归属的stage名称 # 不要配置only: tags,保证作业在分支、tag触发时都能进入执行逻辑 script: # 核心判断逻辑 - | if [ -n "$CI_COMMIT_TAG" ]; then echo "Tag触发流水线,当前Tag为:$CI_COMMIT_TAG" # 以下放Tag场景需要执行的命令集 # echo "执行正式版本构建发布" # docker build -t registry.example.com/app:$CI_COMMIT_TAG . # docker push registry.example.com/app:$CI_COMMIT_TAG else echo "普通分支触发流水线,当前分支为:$CI_COMMIT_BRANCH" # 以下放非Tag场景需要执行的命令集 # echo "执行开发版本构建测试" # docker build -t registry.example.com/app:dev-$CI_COMMIT_SHORT_SHA . # ./run-test.sh fi
特殊场景适配
- 如果你的作业运行在Windows PowerShell环境的Runner上,把判断逻辑替换为PowerShell语法即可:
deploy_job_win: stage: deploy tags: - windows script: - | if ($env:CI_COMMIT_TAG) { Write-Host "Tag触发,执行正式发布逻辑" # Tag场景命令 } else { Write-Host "普通分支触发,执行测试构建逻辑" # 非Tag场景命令 }
- 如果需要前置过滤触发条件,比如只允许main分支和所有Tag触发该作业,可以搭配
rules配置使用,避免其他分支触发无意义的作业运行:
deploy_job: stage: deploy rules: - if: '$CI_COMMIT_TAG' - if: '$CI_COMMIT_BRANCH == "main"' script: # 和前面的判断逻辑一致即可 - | if [ -n "$CI_COMMIT_TAG" ]; then # Tag命令集 else # main分支命令集 fi
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

