GitLab CI:如何在Job的rules中使用workflow定义的变量?
问题原因
GitLab CI 在解析 Job 的 rules 条件时,全局 variables 块中定义的变量不会自动展开到 if 表达式里。你的第二个 Job 条件里的 $GOOGLE_PLAY_TRACK_NAME_PRODUCTION 会被当作字符串字面量(即 "$GOOGLE_PLAY_TRACK_NAME_PRODUCTION"),而不是它的实际值 "production",所以对比$GOOGLE_PLAY_DEPLOYMENT_TRACK == $GOOGLE_PLAY_TRACK_NAME_PRODUCTION 实际是 "production" == "$GOOGLE_PLAY_TRACK_NAME_PRODUCTION",结果不成立,Job 不会被调度。
解决方法
有两种可靠的解决方式:
方式一:将全局变量移至 workflow 层级
把全局变量放到 workflow 的 variables 块中,这样所有变量都属于流水线初始化阶段定义的上下文,rules 的 if 条件能正确解析变量值:
workflow: variables: GOOGLE_PLAY_TRACK_NAME_PRODUCTION: "production" rules: - if: $CI_COMMIT_BRANCH == "main" variables: GOOGLE_PLAY_DEPLOYMENT_TRACK: $GOOGLE_PLAY_TRACK_NAME_PRODUCTION stages: - setup this-runs: stage: setup image: python:3.13.3 script: - echo $GOOGLE_PLAY_DEPLOYMENT_TRACK - echo $GOOGLE_PLAY_TRACK_NAME_PRODUCTION rules: - if: $GOOGLE_PLAY_DEPLOYMENT_TRACK this-should-run: stage: setup image: python:3.13.3 script: - echo $GOOGLE_PLAY_DEPLOYMENT_TRACK - echo $GOOGLE_PLAY_TRACK_NAME_PRODUCTION rules: - if: $GOOGLE_PLAY_DEPLOYMENT_TRACK == $GOOGLE_PLAY_TRACK_NAME_PRODUCTION
方式二:在条件中使用 CI_VARIABLES 访问全局变量
如果不想移动全局变量的位置,可以用 GitLab 提供的 $CI_VARIABLES["变量名"] 语法,在 if 条件中直接获取全局变量的实际值:
variables: GOOGLE_PLAY_TRACK_NAME_PRODUCTION: "production" workflow: rules: - if: $CI_COMMIT_BRANCH == "main" variables: GOOGLE_PLAY_DEPLOYMENT_TRACK: $GOOGLE_PLAY_TRACK_NAME_PRODUCTION stages: - setup this-runs: stage: setup image: python:3.13.3 script: - echo $GOOGLE_PLAY_DEPLOYMENT_TRACK - echo $GOOGLE_PLAY_TRACK_NAME_PRODUCTION rules: - if: $GOOGLE_PLAY_DEPLOYMENT_TRACK this-should-run: stage: setup image: python:3.13.3 script: - echo $GOOGLE_PLAY_DEPLOYMENT_TRACK - echo $GOOGLE_PLAY_TRACK_NAME_PRODUCTION rules: - if: $GOOGLE_PLAY_DEPLOYMENT_TRACK == $CI_VARIABLES["GOOGLE_PLAY_TRACK_NAME_PRODUCTION"]
以上两种方式都能让第二个 Job 的条件判断生效,部署到 main 分支时两个 Job 都会正常运行。
内容的提问来源于stack exchange,提问作者Gamer2015
相关产品推荐
相关产品推荐

