GitLab CI条件触发stage配置及Terraform Apply执行逻辑咨询
嘿,我来帮你搞定这两个GitLab CI的配置问题,都是实际工作里经常碰到的场景,咱们一个个说清楚:
问题1:配置某个Stage在另外两个Stage的任意一个完成后触发
GitLab CI里的needs关键字是处理这类依赖的核心,不过默认情况下needs要求所有指定的job都成功才能触发当前job。要实现“任意一个完成(成功)就触发”,你只需要给每个依赖的job加上optional: true就行。
举个具体的配置示例:
stages: - build_feature_a - build_feature_b - deploy_preview # 第一个Stage的Job build_a: stage: build_feature_a script: - echo "构建Feature A完成" # 第二个Stage的Job build_b: stage: build_feature_b script: - echo "构建Feature B完成" # 需要被触发的Stage的Job deploy_preview: stage: deploy_preview needs: - job: build_a optional: true # 这个依赖不是必须的 - job: build_b optional: true # 这个依赖也不是必须的 script: - echo "只要build_a或build_b有一个成功,我就会运行"
这个配置里,deploy_preview会在build_a或者build_b任意一个成功完成后自动触发。如果两个都失败,它就不会运行;如果两个都成功,它也会正常运行。
问题2:Terraform Apply的条件执行 + 实现“步骤A/B完成则执行步骤C”
先解决Terraform Apply的场景需求
你需要根据Terraform计划的变更类型,来决定Apply是手动还是自动执行。核心思路是先在Plan步骤里解析变更类型,生成一个环境变量,然后在Apply步骤里用这个变量来控制执行规则。
这里有个可直接参考的配置:
stages: - terraform_plan - terraform_apply - post_apply_steps # 你的后续步骤 terraform_plan: stage: terraform_plan script: - terraform init # 生成计划文件并保存 - terraform plan -out=tfplan # 解析计划的JSON输出,判断变更类型 - | # 提取所有资源的变更动作,去重后合并成字符串 CHANGE_ACTIONS=$(terraform show -json tfplan | jq -r '.resource_changes[] | .change.actions | unique | join(",")') # 判断是否是重建场景(同时包含create和delete动作) if echo "$CHANGE_ACTIONS" | grep -q "create,delete"; then echo "TF_CHANGE_TYPE=REBUILD" >> tf_change.env else echo "TF_CHANGE_TYPE=OTHER" >> tf_change.env fi # 把生成的变量文件作为 artifact 传递给后续Job artifacts: reports: dotenv: tf_change.env terraform_apply: stage: terraform_apply script: - terraform init - terraform apply -auto-approve tfplan needs: ["terraform_plan"] rules: # 重建场景:手动触发,必须确认才能继续 - if: '$TF_CHANGE_TYPE == "REBUILD"' when: manual allow_failure: false # 其他场景(新增/销毁/更新):自动执行 - if: '$TF_CHANGE_TYPE == "OTHER"' when: on_success
这个配置里,Plan步骤会自动判断是否是资源重建的场景,然后把结果存在变量里。Apply步骤根据这个变量,在重建时要求手动确认,其他场景自动执行,而且完全不影响后续步骤的运行。
再解决“步骤A完成或步骤B完成则执行步骤C”
这个和问题1的思路一致,还是用needs加optional: true,再配合rules确保只有当至少一个依赖成功时才运行:
job_a: stage: stage_a script: - echo "Job A执行完成" job_b: stage: stage_b script: - echo "Job B执行完成" job_c: stage: stage_c needs: - job: job_a optional: true - job: job_b optional: true rules: # 确保至少有一个依赖Job成功,才运行当前Job - if: '$CI_JOB_STATUS == "success"' when: on_success script: - echo "只要Job A或Job B有一个成功,我就会启动"
这样就能完美实现“步骤A或B完成(成功)则执行步骤C”的需求啦。
内容的提问来源于stack exchange,提问作者SarahC
相关产品推荐
相关产品推荐

