CI 作业中的嵌套阶段

wvx*_*xvw 3 continuous-integration gitlab gitlab-ci

在 GitLab 作业描述中,可以指定阶段,其中作业将按阶段分组并并行执行。想象一下我想要执行以下操作:

  1. 构建发布二进制文件。
  2. 为发布二进制文件构建发布 Docker 映像。
  3. 构建调试二进制文件。
  4. 为调试二进制文件构建调试 Docker 映像。

由于没有嵌套阶段,我可以尝试同时构建发布和调试二进制文件,然后构建两个映像。但是,这是非常低效的,因为其中一个构建比另一个构建花费的时间要长得多,但是,我无法开始为先完成的构建创建图像。

如果能够安排 Docker 镜像构建工作在第一个构建完成后立即开始,那就完美了。一种可能的方法是,如果我可以指定嵌套阶段,其中,阶段build-all有两个嵌套阶段:build-releasebuild-debug,每个阶段由两个作业组成:build-release-binary, build-release-image, 以及类似的build-debug-binary, build-debug-image

由于我是 GitLab 的新手,我也希望得到否定的答案,即知道这是不可能的也很有用。

Jon*_*art 5

问题

首先确认您的问题,我想您有这样的设置:

.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)

我曾与一个团队合作以类似的方式简化他们的流程,我们对结果感到满意。