问题
首先确认您的问题,我想您的设置类似于以下情况:
.gitlab-ci.yml
:
stages:
- build-binaries
- build-images
build-release-binary:
stage: build-binaries
script:
- make release
build-debug-binary:
stage: build-binaries
script:
- make debug
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
: 允许运行CI作业,如果其依赖项成功
我已添加了一条评论,指出在这种情况下可以进行改进。将来,管道可能会像这样(请注意单独的连接线):
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 |
|_______________|
我曾与一个团队合作,以类似的方式简化他们的流程,并且我们对结果感到满意。