GitLab引入父子管道改进,扩展应用程序存储库结构。
存储库结构复杂性增加,.gitlab-ci.yml文件难管理。越来越流行“ monorepo ”模式,团队将多个相关服务代码保存一个存储库。开发人员用同.gitlab-ci.yml文件为不同应用组件触发不同自动化过程,导致合并冲突和生产率下降,团队等待管道“其一部分”运行和完成。
大型复杂项目管理自动化工作流程,Gitlab添加两新功能以使管道强大:父子管道及动态生成管道配置功能。
- 认识父子管道
解决团队同存储库协作多关联服务痛苦?GitLab 12.7发布父子管道。允许子管道同时运行,将复杂管道拆分父子关系多管道提高性能。使配置和可视化分不同文件和视图。
项目结构如下
-
创建子管道
通过include
将父项包含子项为密钥参数,trigger
触发子管道配置文件。命名子管道文件,须是YAML。
C++程序:
#include <iostream>
int main()
{
std::cout << "Hello GitLab!" << std::endl;
return 0;
}
配置触发两子管道,构建Windows和Linux版C ++程序。
stages:
- triggers
build_windows:
stage: triggers
trigger:
include: ci/.win-gitlab-ci.yml
rules:
- changes:
- cpp_app/*
build_linux:
stage: triggers
trigger:
include: ci/.linux-gitlab-ci.yml
rules:
- changes:
- cpp_app/*
流水线含stage名为triggers, 有两并行作业,为build_windows,build_linux。每作业设rules限制只cap_app目录文件变化才运行作业。trigger定义触发运行子配置文件,父管道触发后继续运行。用include用本地,远程或模板配置文件,最多三子管道。
父子管道另一有用模式rules触发子管道密钥。对cpp_app文件夹中文件更改时触发。
Windows构建子管道(.win-gitlab-ci.yml)有以下配置,除要触发其他子管道,遵循标准配置格式:
image: gcc
build:
stage: build
before_script:
- apt update && apt-get install -y mingw-w64
script:
- x86_64-w64-mingw32-g++ cpp_app/hello-gitlab.cpp -o helloGitLab.exe
artifacts:
paths:
- helloGitLab.exe
不要忘-y
参数为apt-get install
命令一部分,否则作业卡住,等用户输入。
Linux构建子管道(.linux-gitlab-ci.yml
)有以下配置,除非触发其他子管道,遵循标准配置格式:
image: gcc
build:
stage: build
script:
- g++ cpp_app/hello-gitlab.cpp -o helloGitLab
artifacts:
paths:
- helloGitLab
子管道生成工件,“作业结果”屏幕“ *作业工件”*部分下载。
创建文件推送新分支,管道结果,看到两作业及后续子作业。
创建下游管道,trigger
作业以success
状态完成。父管道不在子管道运行成功后再显示流水线成功,而子管道触发成功则父管道成功。strategy: depend
自身状态从触发管道合并到源作业。
stages:
- triggers
build_windows:
stage: triggers
trigger:
include: ci/.win-gitlab-ci.yml
strategy: depend
rules:
- changes:
- cpp_app/*
build_linux:
stage: triggers
trigger:
include: ci/.linux-gitlab-ci.yml
strategy: depend
rules:
- changes:
- cpp_app/*
-
动态生成管道
进一步扩展父子管道,从父管道动态生成子配置文件。存储库清除分散管道配置文件,允许应用中生成配置,将变量传递给文件。
父管道配置文件:
stages:
- setup
- triggers
generate-config:
stage: setup
image: ruby
script:
- ruby write-config.rb
- git status
- cat .linux-gitlab-ci.yml
- cat .win-gitlab-ci.yml
artifacts:
paths:
- .linux-gitlab-ci.yml
- .win-gitlab-ci.yml
trigger-linux-build:
stage: triggers
trigger:
include:
- artifact: .linux-gitlab-ci.yml
job: generate-config
trigger-win-build:
stage: triggers
trigger:
include:
- artifact: .win-gitlab-ci.yml
job: generate-config
自定义setup阶段,管道运行write-config.rb脚本。Ruby脚本编写子管道配置文件,可用任何脚本语言。子管道配置文件与非动态子管道配置文件同。artifacts存为CI运行子配置文件,用于子管道阶段。
Ruby脚本生成YAML,确保缩进正确,否则管道作业失败。
#!/usr/bin/env ruby
linux_build = <<~YML
image: gcc
build:
stage: build
script:
- g++ cpp_app/hello-gitlab.cpp -o helloGitLab
artifacts:
paths:
- helloGitLab
YML
win_build = <<~YML
image: gcc
build:
stage: build
before_script:
- apt update && apt-get install -y mingw-w64
script:
- x86_64-w64-mingw32-g++ cpp_app/hello-gitlab.cpp -o helloGitLab.exe
artifacts:
paths:
- helloGitLab.exe
YML
File.open('.linux-gitlab-ci.yml', 'w'){ |f| f.write(linux_build)}
File.open('.win-gitlab-ci.yml', 'w'){ |f| f.write(win_build)}
triggers
阶段,父管道运行生成子管道,与本非动态运行方式相似,用保存artifact
文件和指定job
。
创建所有文件推送新分支,管道结果,看到三作业(一个连接其他两个)及随后两个子作业。
一个父,多个子并动态生成配置,找到构建CI/CD工作流所有工具。