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

GitLab CI/CD如何仅在非指定目录变更时运行App1构建任务?

GitLab CI配置:仅当变更全在App2/App3时跳过App1构建任务

要实现需求,核心是判断是否所有变更都仅存在于App2/和App3/目录——只有当这个条件成立时才跳过App1的构建,其他场景(包括App1自身变更、Common目录变更、新增任意非App2/App3的目录变更)都要触发App1构建。

直接用GitLab CI原生的changes规则无法完全满足“所有变更都在指定目录”的判断,需要结合Git命令做精确校验,以下是具体配置:

# 定义构建阶段(已有则可省略)
stages:
  - build

app1-build:
  stage: build
  script:
    - echo "执行App1构建命令..."
    # 替换为你的实际构建步骤,例如 npm install && npm run build 等
  rules:
    # 规则1:变更包含App1目录文件时,强制运行
    - changes:
        - 'App1/**/*'
      when: always
    # 规则2:存在非App2/App3目录的变更时,强制运行
    - if: |
        # 首次提交(无前置SHA)默认运行
        $CI_COMMIT_BEFORE_SHA == "0000000000000000000000000000000000000000" ||
        # 检查变更文件中是否有不在App2/App3下的内容
        (git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep -vE "^App2/|^App3/" | wc -l) > 0
      when: always
    # 规则3:除上述场景外(所有变更都在App2/App3),跳过任务
    - when: never

逻辑说明:

  1. 规则1:只要App1目录下有任何变更,直接触发构建,覆盖应用自身迭代的场景。
  2. 规则2:
    • 处理首次提交的特殊情况(无前置提交SHA时默认运行App1构建)。
    • 通过git diff获取本次提交的所有变更文件,过滤掉App2/和App3/开头的文件后,若剩余文件数大于0,说明存在非App2/App3的变更,触发构建。
  3. 规则3:当以上两个规则都不匹配时,说明所有变更都在App2/和App3/目录,跳过App1构建。

该配置无需关注新增的Common类目录(如Common4/),只要变更不在App2/App3下,就会自动触发App1构建,无需修改CI脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:36:22