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:只要App1目录下有任何变更,直接触发构建,覆盖应用自身迭代的场景。
- 规则2:
- 处理首次提交的特殊情况(无前置提交SHA时默认运行App1构建)。
- 通过
git diff获取本次提交的所有变更文件,过滤掉App2/和App3/开头的文件后,若剩余文件数大于0,说明存在非App2/App3的变更,触发构建。
- 规则3:当以上两个规则都不匹配时,说明所有变更都在App2/和App3/目录,跳过App1构建。
该配置无需关注新增的Common类目录(如Common4/),只要变更不在App2/App3下,就会自动触发App1构建,无需修改CI脚本。
内容的提问来源于stack exchange,提问作者NSouth
相关产品推荐
相关产品推荐

