GitLab CI流水线中如何按代码变更条件运行并行矩阵作业?
GitLab CI矩阵作业按对应目录变更触发的正确配置
你原来的并行矩阵作业配置如下:
sast-container: <<: *branches allow_failure: true parallel: matrix: - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/address-check-stub - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/manual-service-stub - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/employment-record-stub
需求是让每个矩阵作业仅在对应的代码目录(如stub-services/address-check-stub)发生变更时才运行。你之前的写法存在语法错误:matrix数组中只能定义变量键值对,不能直接嵌套only规则,且部分目录路径也写错了。
正确的配置方式是给每个矩阵项添加对应目录的自定义变量,然后通过rules结合changes实现触发控制:
sast-container: <<: *branches allow_failure: true parallel: matrix: - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/address-check-stub STUB_SERVICE_DIR: stub-services/address-check-stub - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/manual-service-stub STUB_SERVICE_DIR: stub-services/manual-service-stub - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/employment-record-stub STUB_SERVICE_DIR: stub-services/employment-record-stub rules: # 继承branches模板中的原有触发规则 - !reference [*branches, rules] # 新增目录变更检查,仅对应目录有变更时触发 - changes: - $STUB_SERVICE_DIR/**/* if: '$CI_PIPELINE_SOURCE == "push"'
配置说明:
- 在每个矩阵项中新增
STUB_SERVICE_DIR变量,明确对应各自的代码目录路径 - 使用
rules替代only(GitLab CI推荐用rules实现更灵活的流水线逻辑控制),通过变量引用对应目录,**/*表示检查该目录下所有文件及子目录的变更 - 如果你的
*branches模板用的是only/except而非rules,可以改用以下兼容写法:
sast-container: <<: *branches allow_failure: true parallel: matrix: - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/address-check-stub STUB_SERVICE_DIR: stub-services/address-check-stub - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/manual-service-stub STUB_SERVICE_DIR: stub-services/manual-service-stub - CI_REGISTRY_IMAGE: $CI_REGISTRY_IMAGE/employment-record-stub STUB_SERVICE_DIR: stub-services/employment-record-stub only: changes: - $STUB_SERVICE_DIR/**/* refs: !reference [*branches, only, refs]
配置完成后,每个矩阵作业只会在对应的STUB_SERVICE_DIR目录下文件发生变更时才会被触发运行。
内容的提问来源于stack exchange,提问作者Bragon
相关产品推荐
相关产品推荐

