Continuous integration CI作业中的嵌套阶段
在GitLab作业描述中,可以指定阶段,其中作业将按阶段分组并并行执行。假设我想做以下工作:Continuous integration CI作业中的嵌套阶段,continuous-integration,gitlab,gitlab-ci,Continuous Integration,Gitlab,Gitlab Ci,在GitLab作业描述中,可以指定阶段,其中作业将按阶段分组并并行执行。假设我想做以下工作: 构建发布二进制文件 为发布二进制文件构建发布Docker映像 构建调试二进制文件 为调试二进制文件构建调试Docker映像 如果没有嵌套的阶段,我可以尝试同时构建发行版和调试二进制文件,然后构建这两个映像。但是,这是非常低效的,因为其中一个构建要比另一个构建花费更长的时间,但是,我无法开始为首先完成的构建创建映像 如果能够安排Docker形象构建工作在第一次构建完成后立即开始,那就太完美了。一种可能的方
build all
有两个嵌套的阶段:build release
和build debug
,每个阶段由两个作业组成:build release binary
,build release image
,同样地,build debug binary
,生成调试映像
由于我是GitLab的新手,我也希望得到一个否定的答案,即知道这是不可能的也是有用的。问题
首先要确认您的问题,我想您有如下设置:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
build
_______________
| |
| build-release |
|_______________|
_______________
| |
| build-debug |
|_______________|
.gitlab ci.yml
:
阶段:
-构建二进制文件
-建立形象
#二进制文件
生成版本二进制文件:
阶段:构建二进制文件
脚本:
-释放
生成调试二进制文件:
阶段:构建二进制文件
脚本:
-进行调试
#Docker图像
生成发布映像:
阶段:塑造形象
依赖项:
-构建版本二进制文件
脚本:
-docker build-t wvxvw:发布。
生成调试映像:
阶段:塑造形象
依赖项:
-生成调试二进制文件
脚本:
-docker构建-t wvxvw:debug。
这将产生这样一条管道:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
build
_______________
| |
| build-release |
|_______________|
_______________
| |
| build-debug |
|_______________|
评估
在生成二进制文件
阶段的所有作业完成之前,生成映像
阶段的任何作业都不会开始,这是正确的(即使满足作业的依赖项)
GitLab的一个公开问题讨论了这一点:我添加了一条评论,指出在这种情况下可以做的改进。将来,管道可能会是这样的(请注意单独的连接线): 变通办法 有时,如果您有连续的任务,只需在单个作业中运行它们就更容易了。这避免了启动另一个作业的开销,因为您已经在第一个作业中准备好了一切 作为一种解决方法,您可以简单地将管道扁平化为一个阶段,以构建二进制图像和Docker图像:
.gitlab ci.yml
:
阶段:
-建造
生成版本:
阶段:建造
脚本:
-释放
-docker build-t wvxvw:发布。
生成调试:
阶段:建造
脚本:
-进行调试
-docker构建-t wvxvw:debug。
当然,您的管道将如下所示:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
build
_______________
| |
| build-release |
|_______________|
_______________
| |
| build-debug |
|_______________|
我曾与一个团队合作,以类似的方式简化了他们的管道,我们对结果感到满意。从Gitlab 12.2开始,这是用修复的,因此现在允许任意操作。您可以从Gitlab 13.1(Beta版)开始使用 例如,假设您希望并行运行pylint和单元测试,然后检查单元测试的覆盖率,但不必等待pylint完成
stages:
- Checks
- SecondaryChecks
pylint:
stage: Checks
script: pylint
unittests:
stage: Checks
script: coverage run -m pytest -rs --verbose
testcoverage:
stage: SecondaryChecks
needs: ["unittests"]
script: coverage report -m | grep -q "TOTAL.*100%"
请注意,“需求”仅适用于前几个阶段中定义的目标。因此,这里需要两个阶段