GitLab CI 多项目流水线

4
在Gitlab中,我正在尝试从父管道触发子管道。子管道位于同一项目的子目录下。然而,在合并请求事件时,它会出现错误:“无法创建下游管道,该管道没有阶段/作业”。 文件夹结构:
  • 命名空间/项目/.gitlab-ci.yml(父管道)
  • 命名空间/项目/服务名称/.gitlab-ci.yml(子管道)
父管道:
trigger_servicename:
 stage: triggers  
  rules:        
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'
      changes: 
        - app-notifier/*      
      when: always  
  trigger:
    include: servicename/.gitlab-ci.yml    
    strategy: depend     

子流水线:

image:

    name: registry.gitlab.com/who-docker/aws-cli:latest

    entrypoint: 
      - /usr/bin/env
      - 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
stages:  
  -build
build:
  stage: build                 
  script:    
    - echo "run build..."
        
test:
  stage: test                 
  script:             
    - echo "run test...."
3个回答

28

通常情况下,当子流水线中没有规则与任何作业匹配时,您将收到错误消息“downstream pipeline cannot be created,No stages/jobs for this pipeline”。子流水线将继承上游流水线的规则。

在查看您的示例时,规则if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "dev"'被继承到子流水线中。但是该规则在子流水线中不匹配,因为子流水线中的$CI_PIPELINE_SOURCEtrigger,而不是上游流水线中的那个。因此,GitLab无法执行任何作业。

如果您添加

workflow:
  rules:
    - when: always

对于您的子管道,它将起作用。如有需要,请相应地修改规则。


谢谢!理解规则会被子管道继承解决了实际问题。我在文档中没有找到这一点说明。 - chronicc
3
这实在是荒谬的,为什么当你明确地将其包含在要执行的内容中时,它会自动继承规则。就像你可以在触发器作业上设置一个规则,指定子作业应该何时执行,不需要任何进一步的规则。 - Beefcake

2

子流水线不会自动触发。子YAML文件中的作业会与作业的规则部分进行匹配。要将作业添加到任务列表中,请向工作流添加规则。

例如:

父GitLab配置

trigger_servicename:
   trigger:
       include: servicename/.gitlab-ci.yml    
       strategy: depend 

Child gitlab配置

child_service:
    image: my-image-name
    rules:
        - if: '$CI_PIPELINE_SOURCE == "parent_pipeline"'
  • 规则:'$CI_PIPELINE_SOURCE == "pipeline"' 在(父)流程中运行作业。
  • 规则:'$CI_PIPELINE_SOURCE == "parent_pipeline"' 在父流程的下游运行作业。

0

对于包含多个项目的单体库,我实际上做了以下操作:

nameofjob:
  stage: trigger
  trigger:
    include:
      - artifact: folder/.gitlab-ci.yml
    strategy: depend

针对一个外部项目 -

include:
  - project: 'my-group/my-pipeline-library'
    ref: 'main'
    file: '/path/to/child-pipeline.yml'

https://docs.gitlab.com/ee/ci/pipelines/parent_child_pipelines.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接