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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:57:18