如何使用工作流规则设置GitLab的流水线变量

编程语言 2026-07-09

当仓库引入来自其他仓库的作业时,往往并非所有所需的变量都被设置,因此应在作业规则中设定。例子:

workflow:
  rules:
    - if: $VAR == null # VAR not defined
      variables:
        VAR: "no_value"
    - if: $CI_COMMIT_BRANCH != 'main' && $VAR == "no_value"
      variables:
        VAR: "LAB"
    - if: $CI_COMMIT_BRANCH == 'main'
      variables:
        VAR: "DTAP"
    - when: always

job:
  script: 
    - |
      echo "VAR : $VAR"

不幸的是,这并不能按预期工作,VAR总是被设定为 "no_value",只有在该作业之外定义时才会例外。

根据 https://docs.gitlab.com/ci/jobs/job_rules/ 的规定,规则在首次匹配后就会停止检查。有人知道如何实现上述场景吗?

解决方案

你永远无法得到你想要的行为。

你唯一能做的,就是设定默认值,并对每一个条件明确写清,因为不会再有任何进一步的处理。

在你的场景中,你可以把它写成下面这样。

variables:
  VAR: "no_value"

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $VAR == "no_value"
      variables:
        VAR: "LAB"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      variables:
        VAR: "DTAP"
    - when: always

job:
  script: 
    - |
      echo "VAR : $VAR"

当然,如果目的是即使上游流水线确实设置了它也要修改 "VAR",那就行不通。上游流水线的变量具有最高优先级,会覆盖下游对变量的任何设置。

如果你想要更精确的控制,可以改用GitLab新的 输入变量

spec:
  inputs:
    var:
      default: "no-value"
      description: "some awsome variable"
---
variables:
  VAR: $[[ inputs.var ]] 

workflow:
  ...

传递值也很简单。来自你上游的触发器,或include子句:

include:
- local: ./gitlab/somefile.yaml # or component / project etc
  inputs:
    var: "some-value"
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章