在 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 中启用并行构建的主要内容,如果未能解决你的问题,请参考以下文章