我如何 运行 一个用于推送的作业和一个用于调度的“矩阵”作业?
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
我需要如何更改才能:
- 对于推送,只有 一个 工作是 运行 (
archive-a.tgz
+ image1
)
- 对于时间表,四个 作业是 运行
您可以使用以下规则来实现: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"
说,我的 .gitlab-ci.yml
中有这个工作配置,利用了 parallel matrix 个工作:
job:
image: $IMAGE
parallel:
matrix:
- ARCHIVE: ["archive-a.tgz", "archive-b.tgz" ]
IMAGE: ["image1", "image2"]
script:
- echo $ARCHIVE $IMAGE
我需要如何更改才能:
- 对于推送,只有 一个 工作是 运行 (
archive-a.tgz
+image1
) - 对于时间表,四个 作业是 运行
您可以使用以下规则来实现: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"