在单个Git仓库中使用多个gitlab-ci文件的可能性

128次阅读
没有评论

问题描述

项目包含了4个不同的软件项目的集成测试,这些项目共享一些通用资源,用户希望创建一个通用文件,用于在CI/CD任务中设置这些共同的特性。项目的组织结构如下:

project_root:
  > folder_1
  > folder_2
  > folder_3
  > folder_4

用户了解到GitLab文档中关于include关键字的说明,认为可以在一个文件中处理这些共同特性,从而避免在4个不同的gitlab-ci.yml文件中重复编写相同的命令。因此,用户尝试了以下结构:

project_root:
  common-features-handler.yml
  > folder_1
    gitlab-ci.yml
  > folder_2
    gitlab-ci.yml
  > folder_3
    gitlab-ci.yml
  > folder_4
    gitlab-ci.yml

但是,GitLab文档对于是否可以在同一个仓库中拥有多个gitlab-ci.yml文件的问题不够清晰。文档中只提到这个文件应该“放置在[仓库的]根目录”,这似乎排除了在同一个仓库中拥有多个gitlab-ci.yml文件的可能性。用户尝试将common-features-handler.yml文件包含到folder_1中的gitlab-ci.yml中,但任务并未启动。用户猜测,由于common-features-handler.yml不在项目的根目录,CI流水线未能检测到该文件。这让用户怀疑一个仓库是否能够处理多个gitlab-ci文件,但是他在文档和在线搜索中没有找到关于这个假设的确认或否定。

所以,问题是:是否有一种方式在单个Git仓库中使用多个gitlab-ci文件?如果没有,是否有一种方法可以避免重复编写相同的设置命令?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据最佳答案中的回复,GitLab当前不支持在单个仓库中使用多个gitlab-ci.yml文件。但是,你可以通过使用include关键字来处理通用特性并减少主要gitlab-ci.yml文件的大小。
以下是一种处理方式,可以通过GitLab的变量和extends关键字来实现:

# my_folder/build.yml
# 使用“.”(点)表示不要单独运行该部分,必须通过extends来运行.build部分。
.build:
  variables:
    SOFTWARE_ROOT: ""
  script:
    - build ${SOFTWARE_ROOT}

# .gitlab-ci.yml
include:
  - local: 'my_folder/build.yml'

my_first_build:
  extends: .build
  variables:
    SOFTWARE_ROOT: "first_software/"

my_second_build:
  extends: .build
  variables:
    SOFTWARE_ROOT: "second_software/"

在这个示例中,我们首先在my_folder/build.yml中定义了一个部分.build,该部分包含了变量和构建命令。然后,在.gitlab-ci.yml文件中,我们通过include关键字引入了my_folder/build.yml。接下来,我们使用extends关键字来继承.build部分,并根据需要设置不同的变量值。

方案2

另一种解决方法是使用GitLab的子父流水线来处理多个项目的CI/CD任务。你可以参考GitLab文档中关于子/父流水线的说明来实现这一点。

结论

根据GitLab文档和最佳答案中的回复,目前GitLab不支持在同一个仓库中使用多个gitlab-ci.yml文件。但可以通过使用include关键字处理共享特性和通过子父流水线来管理多个项目的CI/CD任务。

正文完