如何配置GitLab CI规则:仅单改README.md时跳过构建阶段
解决方案
要实现仅当推送只改了README.md时跳过构建阶段,其他情况(包括同时改README.md和其他文件)正常运行,得调整规则逻辑,精准判断修改的文件是不是只有README.md,而不是只要包含README.md就跳过。
方法一:用CI_COMMIT_CHANGES变量(GitLab 13.10及以上可用)
GitLab 13.10之后提供了CI_COMMIT_CHANGES内置变量,这个变量里是当前推送所有修改文件的列表,每行一个路径。我们可以直接判断这个变量的值是不是正好等于README.md:
stages: - A Stage A: stage: A rules: # 只有当修改的文件仅为README.md时,跳过阶段 - if: '$CI_COMMIT_CHANGES == "README.md"' when: never # 其他所有推送场景,正常运行阶段 - when: always
方法二:兼容旧版GitLab的通用方案
如果你的GitLab版本低于13.10,没法用CI_COMMIT_CHANGES,可以在规则里通过git diff命令判断修改的文件集合:
stages: - A Stage A: stage: A rules: - script: - | # 获取本次推送修改的文件列表 CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD) # 判断是否只有README.md被修改 if [ "$CHANGED_FILES" = "README.md" ]; then exit 0 # 满足条件,触发when: never else exit 1 # 不满足条件,跳过这条规则 fi when: never # 其他情况正常运行 - when: always
注意点
- 如果
README.md不在仓库根目录,要对应调整路径(比如docs/README.md),确保和变量输出或命令获取的路径一致。 - 要是需要匹配所有子目录下的
README.md,可以把方法一的条件改成正则匹配:if: '$CI_COMMIT_CHANGES =~ /^README.md$/m'(m表示多行匹配)。
内容的提问来源于stack exchange,提问作者LWixson
相关产品推荐
相关产品推荐

