问题
为了首先确认您的问题,我想您有这样的设置:
.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 .
这应该会产生这样的管道:
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----+--+--->| build-release-image |
|______________________| / \ |_____________________|
| |
______________________ | | _____________________
| | | | | |
| build-debug-binary |---/ \-->| build-debug-image |
|______________________| |_____________________|
评估
您是正确的,在 build-binaries 阶段的所有作业完成之前,build-images 阶段的所有作业都不会开始(即使满足作业的依赖关系)。
有一个未解决的 GitLab 问题讨论了这个问题:
gitlab-org/gitlab-ce#49964: Allow running a CI job if its dependencies succeeded
我添加了一条评论,指出在这种情况下可以进行的改进。将来,管道可能看起来像这样(注意单独的连接线):
build-binaries build-images
______________________ _____________________
| | | |
| build-release-binary |----------->| build-release-image |
|______________________| |_____________________|
______________________ _____________________
| | | |
| build-debug-binary |----------->| build-debug-image |
|______________________| |_____________________|
解决方法
有时,如果您有顺序任务,只需在单个作业中运行它们会更容易。这避免了在第一个工作中已经准备好一切准备工作时启动另一个工作的开销。
作为一种变通方法,您可以简单地将管道扁平化为一个阶段,该阶段将构建二进制文件和 Docker 映像:
.gitlab-ci.yml:
stages:
- build
build-release:
stage: build
script:
- make release
- docker build -t wvxvw:release .
build-debug:
stage: build
script:
- make debug
- docker build -t wvxvw:debug .
您的管道当然会如下所示:
build
_______________
| |
| build-release |
|_______________|
_______________
| |
| build-debug |
|_______________|
我曾与一个团队合作,以类似的方式简化他们的管道,我们对结果感到满意。