如何使用工作流规则设置GitLab的流水线变量
当仓库引入来自其他仓库的作业时,往往并非所有所需的变量都被设置,因此应在作业规则中设定。例子:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。