我如何 运行 一个用于推送的作业和一个用于调度的“矩阵”作业?

How do I run a single job for pushes and a `matrix` job for schedules?

说,我的 .gitlab-ci.yml 中有这个工作配置,利用了 parallel matrix 个工作:

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

我需要如何更改才能:

您可以使用以下规则来实现: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 定义,这也应该有效:

Rules are evaluated when the pipeline is created, and evaluated in order until the first match. When a match is found, the job is either included or excluded from the pipeline, depending on the configuration.

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"