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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:36:07