GitLab CI:lint任务未加入流水线时跳过后续job及MR验证处理
解决方案:复用文件变更条件控制任务执行,添加dummy任务满足MR合并要求
为什么你之前的规则无效
$CI_JOB_STATUS 和 $CI_JOB_STAGE 是当前任务的上下文变量,只能获取当前任务的状态和所属阶段,没法引用前置任务或阶段的状态,所以你之前尝试的规则逻辑不成立。
核心思路
既然test_lint是否运行的核心是Terraform文件是否有变更,那我们直接复用这个「文件变更」的判断逻辑,来控制test_plan、test_apply的执行,同时添加一个dummy任务在无变更时运行,满足MR的流水线合并要求。
具体配置修改
1. 优化test_lint的规则(逻辑更清晰)
test_lint: stage: lint script: - | cd xxx terraform init terraform fmt -check -recursive -diff terraform validate rules: # 仅在MR事件且Terraform文件有变更时运行 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: compare_to: 'refs/heads/main' paths: - 'projects/xxx/*' - 'xxx/*' # 其他情况都不运行 - when: never
2. 修改test_plan的规则
只有当Terraform文件变更时才运行,同时保留main分支的执行逻辑:
test_plan: stage: plan script: - | cd xxx terraform init terraform plan -out=$PLAN -parallelism=30 terraform show --json $PLAN | convert_report > $PLAN_JSON artifacts: paths: - xxx/$PLAN reports: terraform: xxx/$PLAN_JSON resource_group: terraform-state rules: # MR事件+文件变更时运行 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: compare_to: 'refs/heads/main' paths: - 'projects/xxx/*' - 'xxx/*' # main分支+文件变更时运行(用于合并后的自动执行) - if: '$CI_COMMIT_REF_NAME == "main"' changes: compare_to: 'refs/heads/main' paths: - 'projects/xxx/*' - 'xxx/*' # 其他情况不运行 - when: never
3. 修改test_apply的规则
同样只在main分支且文件变更时运行:
test_apply: stage: apply script: - | cd xxx terraform apply $PLAN rules: - if: '$CI_COMMIT_REF_NAME == "main"' changes: compare_to: 'refs/heads/main' paths: - 'projects/xxx/*' - 'xxx/*' - when: never resource_group: terraform-state
4. 添加dummy任务满足MR合并要求
这个任务仅在MR事件且无Terraform文件变更时运行,确保MR有成功的流水线:
dummy_mr_validation: stage: lint # 放在lint阶段,确保早于合并检查 script: - echo "No Terraform changes, pipeline is valid for MR merge" rules: # 有Terraform变更时不运行 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' changes: compare_to: 'refs/heads/main' paths: - 'projects/xxx/*' - 'xxx/*' when: never # 仅在MR且无变更时运行 - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: always
逻辑验证
- 当Terraform文件有变更时:
test_lint、test_plan(MR/main分支)、test_apply(main分支)会加入流水线,dummy任务不运行。 - 当Terraform文件无变更时:
test_lint、test_plan、test_apply都不会加入流水线,dummy任务自动运行,满足MR的「必须有通过的流水线」要求。 - main分支合并后,若没有文件变更,
test_apply不会运行,dummy任务也不会运行(因为不是MR事件)。
内容的提问来源于stack exchange,提问作者a1dude
相关产品推荐
相关产品推荐

