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 不会并行执行。感谢大家的帮助! :-)