GitLab CI:能否用Workflow Rules实现多参数变量赋值?
GitLab CI流水线变量设置问题
我正在创建一个带两个输入参数的GitLab CI流水线,示例脚本如下:
stages: # List of stages for jobs, and their order of execution - download - execute variables: # Input variables BRANCH_REFERENCE: value: "" description: "This variable will hold value for Branch Reference" RELEASE_TYPE: value: "" description: "Release Type" RUNNER_TAG: "wave" TEST_VAR: "TEST" workflow: rules: - if: $BRANCH_REFERENCE == "dev" variables: RUNNER_TAG: "wave-dev" when: always - if: $BRANCH_REFERENCE == "prd" variables: RUNNER_TAG: "wave-prd" - if: $RELEASE_TYPE == "pplus" variables: TEST_VAR: "product_plus.tar.gz" when: always - if: $RELEASE_TYPE == "pmod" variables: TEST_VAR: "product.tar.gz" when: always - when: always download-job: stage: download script: - echo "Download Stage Starts" - echo ${TEST_VAR} - echo ${RUNNER_TAG} - echo "Download Stage Ends" tags: - $RUNNER_TAG execute-job: stage: execute script: - echo "Execute Stage Starts" - echo ${TEST_VAR} - echo ${RUNNER_TAG} - echo "Execute Stage Ends" tags: - $RUNNER_TAG
执行流水线时传入两个输入参数:
BRANCH_REFERENCE = dev RELEASE_TYPE = pplus
预期RUNNER_TAG被设为wave-dev,TEST_VAR被设为product_plus.tar.gz,但实际TEST_VAR还是默认值TEST。原因是Workflow Rules只会匹配第一条满足条件的规则,后续规则直接跳过。
请问能不能通过Workflow Rules实现这个需求?如果不行,还有其他实现方法吗?
解决方案
能否用Workflow Rules实现?
不能直接用原有规则结构实现,因为GitLab CI的Workflow Rules是顺序匹配,一旦命中第一条符合条件的规则,后续规则就会被忽略,无法同时触发多个规则设置不同变量。
如果硬要通过Workflow Rules实现,只能合并参数组合写规则,但这种方式扩展性极差,参数值新增时需要同步添加对应规则,维护成本很高:
workflow: rules: - if: $BRANCH_REFERENCE == "dev" && $RELEASE_TYPE == "pplus" variables: RUNNER_TAG: "wave-dev" TEST_VAR: "product_plus.tar.gz" when: always - if: $BRANCH_REFERENCE == "dev" && $RELEASE_TYPE == "pmod" variables: RUNNER_TAG: "wave-dev" TEST_VAR: "product.tar.gz" when: always - if: $BRANCH_REFERENCE == "prd" && $RELEASE_TYPE == "pplus" variables: RUNNER_TAG: "wave-prd" TEST_VAR: "product_plus.tar.gz" when: always - if: $BRANCH_REFERENCE == "prd" && $RELEASE_TYPE == "pmod" variables: RUNNER_TAG: "wave-prd" TEST_VAR: "product.tar.gz" when: always - when: always
不推荐这种写法。
推荐实现方法
方法1:使用变量的rules字段(GitLab 15.4+支持)
给每个变量单独设置规则,替代Workflow里的变量设置逻辑,每个变量的规则独立生效,不会互相影响:
stages: - download - execute variables: BRANCH_REFERENCE: value: "" description: "This variable will hold value for Branch Reference" RELEASE_TYPE: value: "" description: "Release Type" RUNNER_TAG: value: "wave" description: "Runner tag" rules: - if: $BRANCH_REFERENCE == "dev" value: "wave-dev" - if: $BRANCH_REFERENCE == "prd" value: "wave-prd" TEST_VAR: value: "TEST" description: "Test variable" rules: - if: $RELEASE_TYPE == "pplus" value: "product_plus.tar.gz" - if: $RELEASE_TYPE == "pmod" value: "product.tar.gz" download-job: stage: download script: - echo "Download Stage Starts" - echo ${TEST_VAR} - echo ${RUNNER_TAG} - echo "Download Stage Ends" tags: - $RUNNER_TAG execute-job: stage: execute script: - echo "Execute Stage Starts" - echo ${TEST_VAR} - echo ${RUNNER_TAG} - echo "Execute Stage Ends" tags: - $RUNNER_TAG
这种方式逻辑清晰,维护方便,是最优解。
方法2:在作业脚本中动态设置变量
如果使用的GitLab版本低于15.4,不支持变量的rules字段,可以在作业脚本里通过条件判断设置变量:
stages: - download - execute variables: BRANCH_REFERENCE: value: "" description: "This variable will hold value for Branch Reference" RELEASE_TYPE: value: "" description: "Release Type" RUNNER_TAG: "wave" TEST_VAR: "TEST" download-job: stage: download script: - | # 根据BRANCH_REFERENCE设置RUNNER_TAG if [ "$BRANCH_REFERENCE" = "dev" ]; then RUNNER_TAG="wave-dev" elif [ "$BRANCH_REFERENCE" = "prd" ]; then RUNNER_TAG="wave-prd" fi # 根据RELEASE_TYPE设置TEST_VAR if [ "$RELEASE_TYPE" = "pplus" ]; then TEST_VAR="product_plus.tar.gz" elif [ "$RELEASE_TYPE" = "pmod" ]; then TEST_VAR="product.tar.gz" fi # 导出变量让后续脚本步骤可用 export RUNNER_TAG TEST_VAR - echo "Download Stage Starts" - echo ${TEST_VAR} - echo ${RUNNER_TAG} - echo "Download Stage Ends" tags: - $RUNNER_TAG execute-job: stage: execute script: - | if [ "$BRANCH_REFERENCE" = "dev" ]; then RUNNER_TAG="wave-dev" elif [ "$BRANCH_REFERENCE" = "prd" ]; then RUNNER_TAG="wave-prd" fi if [ "$RELEASE_TYPE" = "pplus" ]; then TEST_VAR="product_plus.tar.gz" elif [ "$RELEASE_TYPE" = "pmod" ]; then TEST_VAR="product.tar.gz" fi export RUNNER_TAG TEST_VAR - echo "Execute Stage Starts" - echo ${TEST_VAR} - echo ${RUNNER_TAG} - echo "Execute Stage Ends" tags: - $RUNNER_TAG
注意:这种方式设置的变量仅在当前作业脚本中生效,多个作业需要用到时,可把逻辑抽成单独脚本文件,通过source命令引入。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

