在单个GitLab仓库中使用GitLab CI/CD运行多个流水线

139次阅读
没有评论

问题描述

想要在单个GitLab仓库中运行多个流水线,每个流水线具有不同的触发条件和执行逻辑。他知道一个仓库不能有多个gitlab-ci.yml文件,但这仍然显得相对有限。例如,他希望在每次推送更改或创建合并请求时运行一组测试,另一组测试则需要每隔24小时运行一次。他想知道是否有方法可以实现这样的需求,还是他只能使用一组测试来运行CI?

解决方案

请注意以下操作可能受到GitLab版本的影响,或者需要对现有的GitLab CI/CD配置进行修改。确保在尝试之前备份配置文件。

方案1:使用Rules语法

你可以使用GitLab CI/CD的rules语法来实现在单个仓库中运行多个流水线,并根据不同的条件触发不同的作业。rules语法可以与正则表达式、ci_pipeline_source等CI变量结合使用。以下是一个示例配置,演示了如何根据不同的条件运行不同的作业:

job1:
  script:
    - 执行定时任务
  rules:
    - if: '"$CI_PIPELINE_SOURCE" == "schedule"'
      when: always

job2:
  script:
    - 在合并请求流水线上运行
  rules:
    - if: $CI_MERGE_REQUEST_ID
      when: always

job3:
  script:
    - 在src目录中的任何更改或Dockerfile更改时运行
  rules:
    - changes:
      - src/*
      - Dockerfile

在上面的示例中,我们定义了三个作业:job1job2job3。通过rules属性,我们根据不同的条件来定义每个作业的运行时机。例如,job1会在定时任务触发时始终运行,job2会在合并请求流水线触发时始终运行,而job3会在src目录或Dockerfile发生更改时运行。

方案2:使用模板和扩展

另一种方法是使用模板和扩展来管理不同的流水线配置。你可以将具体的流水线配置放在不同的模板文件中,然后在主的gitlab-ci.yml文件中使用includeextends来引用这些模板。这样可以帮助保持配置的可维护性和清晰性。以下是一个示例配置:

# 主的gitlab-ci.yml文件
include:
  - local: '/templates/.scheduled-job-template.yml' # 包含运行定时任务的模板
  - local: '/templates/.merge-request-job-template.yml' # 包含在合并请求流水线上运行的模板

job1:
  extends:
    - .scheduled_job
  rules:
    - if: '"$CI_PIPELINE_SOURCE" == "schedule"'
      when: always

job2:
  extends:
    - .merge_request_job
  rules:
    - if: $CI_MERGE_REQUEST_ID
      when: always
      when: never

在上面的示例中,我们在主的gitlab-ci.yml文件中使用include引用了两个模板文件。这些模板文件分别包含了不同的作业配置。通过使用extends,我们可以将模板中的作业配置扩展到实际的流水线中。

请注意,你可以根据需要组织多个模板和作业配置,以满足不同的流水线需求。

使用这两种方法之一,你可以在单个GitLab仓库中运行多个流水线,并根据不同的条件和触发事件来选择性地执行作业。这有助于更好地组织和管理你的CI/CD流程。

正文完