GitLab CI/CD如何基于前置作业结果条件触发手动执行Job?
解决方案
要实现这个需求,你需要利用GitLab CI的rules规则结合前置作业传递的环境变量,动态控制apply作业的触发方式。核心思路是根据validate作业输出的INFRASTRUCTURE_CHANGED变量值,分别设置手动触发或自动执行/跳过逻辑。
修改后的完整配置
default: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' before_script: - echo ${AWS_PROFILE} - echo ${TF_ROOT} plan: script: - cd ${TF_ROOT} - terraform init - terraform plan -var "profile=${AWS_PROFILE}" -out tfplan.binary - terraform show -json tfplan.binary > tfplan.json artifacts: paths: - ${TF_ROOT}/.terraform - ${TF_ROOT}/.terraform.lock.hcl - ${TF_ROOT}/tfplan.binary - ${TF_ROOT}/tfplan.json validate: image: name: openpolicyagent/opa:latest-debug entrypoint: [""] script: - cd ${TF_ROOT} - /opa eval --format pretty --data ../../policy/terraform.rego --input tfplan.json "data.policy.denied" - AUTHORISED=`/opa eval --format raw --data ../../policy/terraform.rego --input tfplan.json "data.policy.authorised"` - echo INFRASTRUCTURE_CHANGED=`/opa eval --format raw --data ../../policy/terraform_infrastructure_changed.rego --input tfplan.json "data.policy.changed"` >> validate.env - cat validate.env - if [ $AUTHORISED == 'false' ]; then exit 1; else exit 0; fi artifacts: paths: - ${TF_ROOT}/.terraform - ${TF_ROOT}/.terraform.lock.hcl - ${TF_ROOT}/tfplan.binary reports: dotenv: ${TF_ROOT}/validate.env needs: ["plan"] apply: script: - echo ${INFRASTRUCTURE_CHANGED} - cd ${TF_ROOT} - terraform apply tfplan.binary artifacts: paths: - ${TF_ROOT}/.terraform - ${TF_ROOT}/.terraform.lock.hcl - ${TF_ROOT}/tfplan.binary needs: - job: validate artifacts: true rules: # 基础设施有变更时,手动触发 - if: '$INFRASTRUCTURE_CHANGED == "true"' when: manual allow_failure: false # 基础设施无变更时,自动执行(若想直接跳过,把when改成never即可) - if: '$INFRASTRUCTURE_CHANGED == "false"' when: on_success allow_failure: false # 兜底规则,防止其他未覆盖的情况 - when: never
关键修改说明
- 移除固定的
when:manual:将触发逻辑移到rules中,根据变量动态判断。 - 分条件设置触发方式:
- 当
INFRASTRUCTURE_CHANGED为true时,设置when:manual,必须手动确认才能执行apply。 - 当
INFRASTRUCTURE_CHANGED为false时,设置when:on_success(自动执行),如果想直接跳过无变更的apply,可以把when改成never。
- 当
- 变量传递保障:通过
needs获取validate作业的dotenvartifacts,确保INFRASTRUCTURE_CHANGED变量能被apply作业的规则评估阶段读取到。
原理补充
GitLab CI在评估作业规则时,会自动加载通过reports:dotenv传递的环境变量,因此可以在rules的if条件中直接引用这些运行时生成的变量,从而实现基于前置作业输出的动态控制。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

