正如你提到的,
workflow:rules
将在第一个规则匹配时停止评估,这意味着最多一个
rules:variables:
应用。
就你的情况而言,你
真正地
只需要在中设置用于runner标记的变量
tags:
。其他一切都可以在运行时处理。换句话说:您的其他变量也可以直接在使用合成变量的作业中设置。
在这种情况下,设置所需的逻辑
RUNNER_TAG
可以使用表示
workflow:rules:
,所以您可以执行以下操作:
variables:
# Input variables
BRANCH_REFERENCE:
value: ""
description: "This variable will hold value for Branch Reference"
RELEASE_TYPE:
value: ""
description: "Release Type"
TEST_VAR: "TEST"
RUNNER_TAG:
value: "wave-$BRANCH_REFERENCE"
expand: true
workflow:
rules:
- if: $BRANCH_REFERENCE != "dev" && $BRANCH_REFERENCE != "prd"
variables:
RUNNER_TAG: "wave"
- when: always
before_script: # set all variables at the start of each job
- |
if [[ "$RELEASE_TYPE" == "pmod" ]]; then
export TEST_VAR="product.tar.gz"
fi
# ...etc
如果不能使用来表达runner标记或其他变量所需的逻辑
工作流:规则:
通常,对于涉及许多变量的复杂规则,最简单的方法是使用
dotenv artifact
为后续作业设置变量。然后,您可以实现任意设置变量的逻辑。
这也适用于设置中使用的变量
标签:
.
set-variables:
stage: .pre
script:
- if [[ "$CI_COMMIT_BRANCH" == "dev" ]]; then echo "RUNNER_TAG=wave-dev" >> vars.env; fi
- if [[ "$RELEASE_TYPE" == "pplus" ]]; then echo "TEST_VAR=product_plus.tar.gz" >> vars.env; fi
# etc...
artifacts:
reports:
dotenv: vars.env
job:
script:
- echo $CI_RUNNER_TAGS
- echo $TEST_VAR
tags:
- $RUNNER_TAG
但是,如果需要在作业中评估要设置的变量,则这将不起作用
rules:
--因为规则是在创建管道时评估的。
另一个解决的局限性
工作流:规则:
是使用
include:rules:
和
每一个
include规则是单独评估的。你可以使用它
conditionally include yml files
声明将与您的配置合并的其他变量。
即使设置用于作业的变量,这也会起作用
规则:
因为包括是在管道创建时处理的。
只要确保你按照你想要的优先顺序确定这些方向,并注意
how
include:
configurations are merged
.
variables:
BRANCH_REFERENCE: ""
include:
- local: ./default-variables.yml
- local: ./dev-variables.yml
rules:
- if: $BRANCH_REFERENCE == "dev"
- local: ./prod-variables.yml
rules:
- if: $BRANCH_REFERENCE == "prd"
- local: ./pplus-variables.yml
rules:
- if: $RELEASE_TYPE == "pplus"
- local: ./pmod-variables.yml
rules:
- if: $RELEASE_TYPE == "pmod"
# etc...