gitlab-ci 父子包含不工作
gitlab-ci parent-child include not working
我正在尝试将另一个文件包含在作业(父子文件)中,但它没有执行任何操作:
.gitlab-ci.yml 看起来像这样:
workflow:
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
variables:
CODENAME: all
- when: always
stages:
- stage1
- stage2
job1:
stage: stage1
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job1/*
variables:
CODENAME: all
trigger:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
job2:
stage: stage2
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job2/*
variables:
CODENAME: bionic
trigger:
include:
- project: 'project-name'
file: 'job2/pipeline.yml'
job1/pipeline.yml:
include:
- project: 'project-name'
file: file.yml
.template: &template
extends: .kaniko-build # extend of the above include
job1-1:
<<: *template
rules:
- if: '$CODENAME == "xenial" || $CODENAME == "all"'
when: always
- when: never
job1-2:
<<: *template
rules:
- if: '$CODENAME == "bionic" || $CODENAME == "all"'
when: always
- when: never
job1-3:
<<: *template
rules:
- if: '$CODENAME == "focal" || $CODENAME == "all"'
when: always
- when: never
job1-4:
<<: *template
rules:
- if: '$CODENAME == "latest" || $CODENAME == "all"'
when: always
- when: never
job2/pipeline.yml:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
include:
- project: 'project-name'
file: file.yml
.template-custom-image1: &template-custom-image1
extends: .kaniko-build # extend of the above include
custom-image1-1:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "xenial" || $CODENAME == "all"'
when: always
- when: never
custom-image1-2:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "bionic" || $CODENAME == "all"'
when: always
- when: never
custom-image1-3:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "focal" || $CODENAME == "all"'
when: always
- when: never
custom-image1-4:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "latest" || $CODENAME == "all"'
when: always
- when: never
现在 job2 文件夹中的更改正在触发 job2,这将触发 job2/pipeline.yml,一切都很好。但现在我只看到一份工作,意思是 custom-image1-x。我还希望看到 job1/pipeline.yml job1-x 包含在 job2/pipeline.yml:
中
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
我还要求它们按顺序 运行,所以我不能使用另一个触发器,因为它们会并行 运行。任何线索或技巧如何解决?可能是我看错了?
其次:
job1/* 中的更改应该只会触发子管道中 stage1 的 specific 作业。 job2/* 中的更改应该依次触发 stage1 和 stage2(取决于),但使用 .gitlab-ci:
中定义的变量
job2:
stage: stage2
rules:
- changes:
- job2/*
variables:
CODENAME: bionic
抱歉不得不 post 将此作为答案,因此格式正确 :-/
所以我的主要问题是,当 stage2 发生变化时,我还需要 运行 stage1。我通过添加工作流规则来解决这个问题,并对 stage2 (job2/*) 进行了更改:
之前我在我的 .gitlab-ci 中有 job2:
job2:
stage: stage2
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job2/*
trigger:
include:
- project: 'project-name'
file: 'job2/pipeline.yml'
这将触发 job2/pipeline.yml:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
include:
- project: 'project-name'
file: file.yml
.template-custom-image1: &template-custom-image1
extends: .kaniko-build # extend of the above include
custom-image1-1:
<<: *template-custom-image1
custom-image1-2:
<<: *template-custom-image1
custom-image1-3:
<<: *template-custom-image1
custom-image1-4:
<<: *template-custom-image1
在顶部,您注意到 job1/pipeline.yml
的包含
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
我以某种方式期望它神奇地执行 - 没有扩展或任何东西但它从未执行过。我在 .gitlab-ci:
中这样修复了这个问题
workflow:
rules:
- changes:
- job2/*
variables:
SET_STAGE: TWO
CODENAME: bionic
...
job1:
stage: stage1
rules:
- if: $SET_STAGE == "TWO"
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job1/*
trigger:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
strategy: depend
job2:
stage: stage2
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job2/*
trigger:
include:
- project: 'project-name'
file: 'job2/pipeline.yml'
strategy: depend
所以实际上我所做的一切都在我的 .gitlab-ci 我定义了工作流规则,这些规则将在 job2/* 的变化上设置一个变量 (SET_STAGE) 并在中使用该变量我的第一个阶段。如果已设置,那么 运行 那个阶段也会如此。当然我可以这样解决:
...
- changes:
- job1/*
- changes:
- job2/*
...
而不是这个:
...
- changes:
- job1/*
- if: $SET_STAGE == "TWO"
...
但是我需要在工作流程中的某处设置一个整体公共变量 (CODENAME),并将其移至单独的文件中,从而使我的 .gitlab-ci 文件更简洁。
它看起来很简单,但我花了一些时间才弄明白。 Simon 在第一个 post 评论中提到的 Matrix 很有趣,但对于我的用例来说并不是很有用。所以我保持原样并且工作正常。我在此线程中解决的另一个问题是“strategy: depend”,因此 stage1 和 stage2 不会并行执行。感谢大家的帮助! :-)
我正在尝试将另一个文件包含在作业(父子文件)中,但它没有执行任何操作:
.gitlab-ci.yml 看起来像这样:
workflow:
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
variables:
CODENAME: all
- when: always
stages:
- stage1
- stage2
job1:
stage: stage1
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job1/*
variables:
CODENAME: all
trigger:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
job2:
stage: stage2
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job2/*
variables:
CODENAME: bionic
trigger:
include:
- project: 'project-name'
file: 'job2/pipeline.yml'
job1/pipeline.yml:
include:
- project: 'project-name'
file: file.yml
.template: &template
extends: .kaniko-build # extend of the above include
job1-1:
<<: *template
rules:
- if: '$CODENAME == "xenial" || $CODENAME == "all"'
when: always
- when: never
job1-2:
<<: *template
rules:
- if: '$CODENAME == "bionic" || $CODENAME == "all"'
when: always
- when: never
job1-3:
<<: *template
rules:
- if: '$CODENAME == "focal" || $CODENAME == "all"'
when: always
- when: never
job1-4:
<<: *template
rules:
- if: '$CODENAME == "latest" || $CODENAME == "all"'
when: always
- when: never
job2/pipeline.yml:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
include:
- project: 'project-name'
file: file.yml
.template-custom-image1: &template-custom-image1
extends: .kaniko-build # extend of the above include
custom-image1-1:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "xenial" || $CODENAME == "all"'
when: always
- when: never
custom-image1-2:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "bionic" || $CODENAME == "all"'
when: always
- when: never
custom-image1-3:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "focal" || $CODENAME == "all"'
when: always
- when: never
custom-image1-4:
<<: *template-custom-image1
rules:
- if: '$CODENAME == "latest" || $CODENAME == "all"'
when: always
- when: never
现在 job2 文件夹中的更改正在触发 job2,这将触发 job2/pipeline.yml,一切都很好。但现在我只看到一份工作,意思是 custom-image1-x。我还希望看到 job1/pipeline.yml job1-x 包含在 job2/pipeline.yml:
中include:
- project: 'project-name'
file: 'job1/pipeline.yml'
我还要求它们按顺序 运行,所以我不能使用另一个触发器,因为它们会并行 运行。任何线索或技巧如何解决?可能是我看错了?
其次: job1/* 中的更改应该只会触发子管道中 stage1 的 specific 作业。 job2/* 中的更改应该依次触发 stage1 和 stage2(取决于),但使用 .gitlab-ci:
中定义的变量job2:
stage: stage2
rules:
- changes:
- job2/*
variables:
CODENAME: bionic
抱歉不得不 post 将此作为答案,因此格式正确 :-/
所以我的主要问题是,当 stage2 发生变化时,我还需要 运行 stage1。我通过添加工作流规则来解决这个问题,并对 stage2 (job2/*) 进行了更改:
之前我在我的 .gitlab-ci 中有 job2:
job2:
stage: stage2
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job2/*
trigger:
include:
- project: 'project-name'
file: 'job2/pipeline.yml'
这将触发 job2/pipeline.yml:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
include:
- project: 'project-name'
file: file.yml
.template-custom-image1: &template-custom-image1
extends: .kaniko-build # extend of the above include
custom-image1-1:
<<: *template-custom-image1
custom-image1-2:
<<: *template-custom-image1
custom-image1-3:
<<: *template-custom-image1
custom-image1-4:
<<: *template-custom-image1
在顶部,您注意到 job1/pipeline.yml
的包含include:
- project: 'project-name'
file: 'job1/pipeline.yml'
我以某种方式期望它神奇地执行 - 没有扩展或任何东西但它从未执行过。我在 .gitlab-ci:
中这样修复了这个问题workflow:
rules:
- changes:
- job2/*
variables:
SET_STAGE: TWO
CODENAME: bionic
...
job1:
stage: stage1
rules:
- if: $SET_STAGE == "TWO"
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job1/*
trigger:
include:
- project: 'project-name'
file: 'job1/pipeline.yml'
strategy: depend
job2:
stage: stage2
rules:
- if: $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"
- changes:
- job2/*
trigger:
include:
- project: 'project-name'
file: 'job2/pipeline.yml'
strategy: depend
所以实际上我所做的一切都在我的 .gitlab-ci 我定义了工作流规则,这些规则将在 job2/* 的变化上设置一个变量 (SET_STAGE) 并在中使用该变量我的第一个阶段。如果已设置,那么 运行 那个阶段也会如此。当然我可以这样解决:
...
- changes:
- job1/*
- changes:
- job2/*
...
而不是这个:
...
- changes:
- job1/*
- if: $SET_STAGE == "TWO"
...
但是我需要在工作流程中的某处设置一个整体公共变量 (CODENAME),并将其移至单独的文件中,从而使我的 .gitlab-ci 文件更简洁。
它看起来很简单,但我花了一些时间才弄明白。 Simon 在第一个 post 评论中提到的 Matrix 很有趣,但对于我的用例来说并不是很有用。所以我保持原样并且工作正常。我在此线程中解决的另一个问题是“strategy: depend”,因此 stage1 和 stage2 不会并行执行。感谢大家的帮助! :-)