gitlab - 如何为推送运行单个作业并为日程安排运行“矩阵”作业?
问题描述
说,我在我的 中有这个工作配置.gitlab-ci.yml
,使用并行矩阵工作:
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
定义,这也应该有效:
规则在创建管道时进行评估,并按顺序评估,直到第一次匹配。找到匹配项后,该作业将包含在管道中或从管道中排除,具体取决于配置。
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"
推荐阅读
- laravel - 在 Laravel 中 - 将变量添加到模型中,而不将其放入数据库中
- javascript - 如何设置超时功能
- java - Spark:partitionBy(DataFrameWriter)实际上是如何工作的?
- java - 查找树中最深的文件/目录,Java
- javascript - How to change the value of a JSON key when a checkbox is ticked?
- java - Jboss 7.2.2 应用程序部署问题
- asp.net-mvc - 在 MVC 中上传图片时如何解决此错误?
- javascript - 我需要在 JavaScript 中获取任意两个日期之间的所有日期
- python - 使用 Python 从 CSV 文件中删除新行
- sql - 当 SQL Server 中的另一列为真时对一列求和