首页 > 解决方案 > 如何为推送运行单个作业并为日程安排运行“矩阵”作业?

问题描述

说,我在我的 中有这个工作配置.gitlab-ci.yml,使用并行矩阵工作:

job:
  image: $IMAGE
  parallel:
    matrix:
      - ARCHIVE: ["archive-a.tgz", "archive-b.tgz" ]
        IMAGE: ["image1", "image2"]
  script:
    - echo $ARCHIVE $IMAGE

我需要如何更改它以便:

标签: gitlabgitlab-ci

解决方案


您可以通过使用规则来实现这一点:https ://docs.gitlab.com/ee/ci/yaml/#rules

喜欢:

job:
  image: $IMAGE
  parallel:
    matrix:
      - ARCHIVE: ["archive-a.tgz", "archive-b.tgz" ]
        IMAGE: ["image1", "image2"]
  script:
    - echo $ARCHIVE $IMAGE
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $ARCHIVE == "archive-a.tgz" && $IMAGE == "image1"'
    - if: $CI_PIPELINE_SOURCE == "schedule"

虽然这不是一个真正漂亮的解决方案,但它适用于您的情况 - 您也可以尝试否定它并使用when: never. 根据rules定义,这也应该有效:

规则在创建管道时进行评估,并按顺序评估,直到第一次匹配。找到匹配项后,该作业将包含在管道中或从管道中排除,具体取决于配置。

job:
  image: $IMAGE
  parallel:
    matrix:
      - ARCHIVE: ["archive-a.tgz", "archive-b.tgz" ]
        IMAGE: ["image1", "image2"]
  script:
    - echo $ARCHIVE $IMAGE
  rules:
    - if: '$ARCHIVE == "archive-a.tgz" && $IMAGE == "image1"'
      when: never
    - when: always

免责声明:我提供的片段未经测试!

第三种选择将是一个中间作业,它持有逻辑并有两个具有自己的规则的专用作业,例如并提供变量。有很多方法可以实现这一点,你必须看看哪一种最适合你的情况。

.job:
  image: $IMAGE
  script:
    - echo $ARCHIVE $IMAGE

matrix:
  extends: .job
  parallel:
    matrix:
      - ARCHIVE: ["archive-a.tgz", "archive-b.tgz" ]
        IMAGE: ["image1", "image2"]
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"

push:
  extends: .job
  variables:
    ARCHIVE: "archive-a.tgz"
    IMAGE: "image1"
  rules:
    - if: $CI_PIPELINE_SOURCE == "push"


推荐阅读