GitLab CI:如何结合并行矩阵实现仅目录变更时运行任务
解决GitLab CI并行矩阵结合目录变更触发任务的问题
问题根源
你的配置无效是因为GitLab CI的规则(rules)评估时机与并行矩阵变量展开的顺序问题:
- 若GitLab版本低于15.4:rules会在并行矩阵展开前执行,此时
$DIR只是占位符,changes: [$DIR]实际检查的是名为$DIR的文件/目录,而非矩阵中定义的路径,导致任务无法触发。 - 若GitLab版本≥15.4:rules会为每个矩阵实例单独评估,但你的路径写法(
path/to/A/*)仅匹配目录下的直接文件,若变更在子目录或目录本身(如新增文件到子目录),则不会触发规则。
针对性解决方案
方案1:适用于GitLab 15.4+版本
调整路径匹配规则,确保覆盖目标目录下的所有变更,同时利用新版本对矩阵变量的支持:
image: alpine stages: - run my-job: stage: run rules: - changes: # 匹配$DIR目录下的所有文件(包括子目录) - $DIR/**/* script: - echo "Running job for directory: $DIR" parallel: matrix: - DIR: path/to/A - DIR: path/to/B
说明:
- 用
$DIR/**/*替代$DIR/*,确保匹配目录下所有层级的文件变更。 - 矩阵中直接写目录路径(
path/to/A),无需加*,避免glob路径在变量中带来的匹配问题。
方案2:适用于GitLab 15.4以下版本
由于旧版本中rules无法获取矩阵变量,需通过git diff命令在rules:if中检查目录变更,确保每个矩阵实例单独评估:
image: alpine stages: - run my-job: stage: run rules: # 处理首次提交(无前驱提交的情况) - if: '$CI_COMMIT_BEFORE_SHA == "0000000000000000000000000000000000000000"' changes: - $DIR/**/* # 处理普通提交,对比当前与前驱提交的差异 - if: 'git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep -q "^$DIR"' script: - echo "Running job for directory: $DIR" parallel: matrix: - DIR: path/to/A - DIR: path/to/B
说明:
- 首次提交时,通过
changes规则检查目标目录是否有文件(因为首次提交所有文件都是新的)。 - 普通提交时,用
git diff列出变更文件,通过grep判断目标目录是否有变更。
额外注意事项
- 确保GitLab Runner的git版本支持
git diff的相关参数。 - 若目标目录是新增的,
git diff可能无法检测到,此时首次提交的规则会生效。
内容的提问来源于stack exchange,提问作者buratino
相关产品推荐
相关产品推荐

