问题描述
项目包含了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任务。