You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 移除固定的when:manual:将触发逻辑移到rules中,根据变量动态判断。
  2. 分条件设置触发方式:
    • 当INFRASTRUCTURE_CHANGED为true时,设置when:manual,必须手动确认才能执行apply。
    • 当INFRASTRUCTURE_CHANGED为false时,设置when:on_success(自动执行),如果想直接跳过无变更的apply,可以把when改成never。
  3. 变量传递保障:通过needs获取validate作业的dotenv artifacts,确保INFRASTRUCTURE_CHANGED变量能被apply作业的规则评估阶段读取到。

原理补充

GitLab CI在评估作业规则时,会自动加载通过reports:dotenv传递的环境变量,因此可以在rules的if条件中直接引用这些运行时生成的变量,从而实现基于前置作业输出的动态控制。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:45:19