在 Gitlab-CI 中启用并行构建

Posted

技术标签:

【中文标题】在 Gitlab-CI 中启用并行构建【英文标题】:Enabling parallel builds in Gitlab-CI 【发布时间】:2022-01-17 05:20:12 【问题描述】:

目前我有一个构建 C++ 程序的管道,目前如下:

build:
  stage: build
  script:
    - rm -rf .git/modules/docs .git/modules/libraries/fc ./docs ./libraries/fc
    - git submodule sync
    - git submodule update --init --recursive
    - rm -rf build
    - mkdir build
    - cd build
    - cmake -DCMAKE_BUILD_TYPE=Release ..
    - make -j$(nproc)

这个构建必须仍然构建,但我也想并行构建它,但使用不同的 cmake 选项;cmake -DBOOST_ROOT="$BOOST_ROOT" -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTNET=1

我已经阅读了 gitlab-ci 中包含的并行选项,但没有成功整合它。

任何见解都非常感谢!如果在答案之前解决,将更新

【问题讨论】:

【参考方案1】:

你需要有两份工作。 This article 有一些关于如何设置的好主意。

现在,Gitlab 推断依赖关系并假设您希望按顺序运行它们,因此如果您添加一个 needs: [] 列表,它会帮助它构建一个图表。如果您希望它们中的两个同时运行,那么您需要删除它们的依赖关系。

如果您在此构建之前有一些东西,例如测试或比较,您可以使用 needs: ["test"]needs: ["prepare"] 或您想要在此构建步骤之前运行的任何作业,但您可以使用 [] 告诉 CI不需要依赖项并尽快运行它们。

build:
  stage: build
  needs: []
  script:
    - .. common stuff
    - cmake -DCMAKE_BUILD_TYPE=Release ..
    - make # I'd probably remove this in a CI situation -j$(nproc)

build2:
  stage: build
  needs: []
  script:
    - .. common stuff
    - cmake -DCMAKE_BUILD_TYPE=Release AND OTHER OPTIONS ..
    - make # I'd probably remove this in a CI situation -j$(nproc)

【讨论】:

我明白了,但这只是在构建阶段增加了另一个工作;但我希望这两者同时构建;目前它只是等待构建完成,然后运行 ​​build2【参考方案2】:

您可以使用parallel:matrix 工作。此功能多次运行一项作业,但每次设置不同的变量。 在您的情况下,它看起来类似于:

build:
  stage: build
  script:
    - rm -rf .git/modules/docs .git/modules/libraries/fc ./docs ./libraries/fc
    - git submodule sync
    - git submodule update --init --recursive
    - rm -rf build
    - mkdir build
    - cd build
    - cmake -DCMAKE_BUILD_TYPE=$DCMAKE_BUILD_TYPE
    - make -j$(nproc)
  parallel:
    matrix:
      # Initial state of your job
      - DCMAKE_BUILD_TYPE="Release .."
        # Other options...
      - DCMAKE_BUILD_TYPE=Release 
        DBOOST_ROOT="$BOOST_ROOT" 
        DBUILD_TESTNET=1

此技术假定您的作业使用相同的变量子集,但每次执行使用不同的值。

你可以在官方docs和here中找到更多信息,另一个例子,docker构建在这种情况下,但原理应该很清楚。

【讨论】:

您能否详细说明变量子集的含义? 这里的子集是指原始问题的两个作业都将使用相同的变量,但可能具有不同的值。

以上是关于在 Gitlab-CI 中启用并行构建的主要内容,如果未能解决你的问题,请参考以下文章

通过 CI runner 将文件推送到 gitlab-ci

.gitlab-ci.yml配置参数

gitlab-ci 运行器中具有不同到期时间的多条路径

构建后的测试将在 gitlab-ci 上的新环境中运行

如何在 .gitlab-ci.yml 中指定通配符工件子目录?

多个分支中的.gitlab-ci.yml的多个版本