GitLab CI流水线rules中exists条件配置不生效如何解决
问题原因
配置失效的核心问题出在exists字段的匹配规则上:
GitLab CI的exists规则默认只匹配文件路径,你直接写tests,只会判断项目根目录下是否存在名为tests的普通文件,不会识别同名目录,所以条件始终不成立,test阶段被判定为不需要运行。
另外同一条规则下的if和exists默认是逻辑与关系,你原来的条件逻辑(master分支+tests存在才运行)是对的,不需要调整逻辑结构。
修正后的配置
exists判断目录是否存在,需要通过匹配目录下的文件实现(Git本身不跟踪空目录,只要仓库里能拉到tests目录,里面必然存在至少一个文件),把exists的路径改成通配匹配tests目录下任意文件即可:
test: # 建议显式指定job名称,避免隐式命名带来的问题 stage: test image: python:3.10.3-bullseye rules: - if: $CI_COMMIT_BRANCH == "master" exists: - tests/**/* before_script: *setup-python script: - pip install -e .[dev] - pytest tests/
其中tests/**/*的含义是匹配tests目录下任意层级的任意文件,只要tests目录存在且非空,这个匹配就会命中。
可选补充
如果后续需要兼容向master发起合并请求的场景,可以把if条件调整为:
if: $CI_COMMIT_BRANCH == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
这样合并请求阶段也会提前跑测试,不需要等代码合入master再验证。
内容的提问来源于stack exchange,提问作者Lawrence I. Siden
相关产品推荐
相关产品推荐

