wvx*_*xvw 3 continuous-integration gitlab gitlab-ci
在 GitLab 作业描述中,可以指定阶段,其中作业将按阶段分组并并行执行。想象一下我想要执行以下操作:
由于没有嵌套阶段,我可以尝试同时构建发布和调试二进制文件,然后构建两个映像。但是,这是非常低效的,因为其中一个构建比另一个构建花费的时间要长得多,但是,我无法开始为先完成的构建创建图像。
如果能够安排 Docker 镜像构建工作在第一个构建完成后立即开始,那就完美了。一种可能的方法是,如果我可以指定嵌套阶段,其中,阶段build-all有两个嵌套阶段:build-release和build-debug,每个阶段由两个作业组成:build-release-binary, build-release-image, 以及类似的build-debug-binary, build-debug-image。
由于我是 GitLab 的新手,我也希望得到否定的答案,即知道这是不可能的也很有用。
首先确认您的问题,我想您有这样的设置:
.gitlab-ci.yml:
stages:
- build-binaries
- build-images
# Binaries
build-release-binary:
stage: build-binaries
script:
- make release
build-debug-binary:
stage: build-binaries
script:
- make debug
# Docker Images
build-release-image:
stage: build-images
dependencies:
- build-release-binary
script:
- docker build -t wvxvw:release .
build-debug-image:
stage: build-images
dependencies:
- build-debug-binary
script:
- docker build -t wvxvw:debug .
Run Code Online (Sandbox Code Playgroud)
这应该会产生这样的管道:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
Run Code Online (Sandbox Code Playgroud)
您是正确的,在该build-images阶段的所有作业完成之前,该阶段的任何作业都不会开始build-binaries(即使满足作业的依赖关系)。
有一个开放的 GitLab 问题讨论了这个问题::
gitlab-org/gitlab-ce#49964如果依赖项成功,则允许运行 CI 作业
我添加了一条评论,指出在这种情况下可以进行的改进。将来,管道可能看起来像这样(注意单独的连接线):
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----------->| build-release-image |
|______________________| |_____________________|
______________________ _____________________
| | | |
| build-debug-binary |----------->| build-debug-image |
|______________________| |_____________________|
Run Code Online (Sandbox Code Playgroud)
有时,如果您有连续的任务,那么在单个作业中运行它们会更容易。当您已经准备好第一份工作的所有内容时,这可以避免启动另一份工作的开销。
作为解决方法,您可以简单地将管道扁平化为单个阶段,该阶段将构建二进制文件和 Docker 映像:
.gitlab-ci.yml:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
Run Code Online (Sandbox Code Playgroud)
您的管道当然会如下所示:
build
_______________
| |
| build-release |
|_______________|
_______________
| |
| build-debug |
|_______________|
Run Code Online (Sandbox Code Playgroud)
我曾与一个团队合作以类似的方式简化他们的流程,我们对结果感到满意。
| 归档时间: |
|
| 查看次数: |
3691 次 |
| 最近记录: |