Continuous integration CI作业中的嵌套阶段

Continuous integration CI作业中的嵌套阶段,continuous-integration,gitlab,gitlab-ci,Continuous Integration,Gitlab,Gitlab Ci,在GitLab作业描述中,可以指定阶段,其中作业将按阶段分组并并行执行。假设我想做以下工作: 构建发布二进制文件 为发布二进制文件构建发布Docker映像 构建调试二进制文件 为调试二进制文件构建调试Docker映像 如果没有嵌套的阶段,我可以尝试同时构建发行版和调试二进制文件,然后构建这两个映像。但是,这是非常低效的,因为其中一个构建要比另一个构建花费更长的时间,但是,我无法开始为首先完成的构建创建映像 如果能够安排Docker形象构建工作在第一次构建完成后立即开始,那就太完美了。一种可能的方

在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%"
    
    请注意,“需求”仅适用于前几个阶段中定义的目标。因此,这里需要两个阶段