【发布时间】:2019-08-06 11:13:13
【问题描述】:
我们有几个通过 jenkins 管道使用 gradle 构建的独立项目,并将一些 c++ 代码编译为 gradle 作业的一部分。我们使用vc17。
通过并行构建它们,我们有时会遇到文件损坏的相关问题(经常被忽视)。
有没有办法强制一次只为 1 个 gradle 作业编译 c++ 代码?
最好尽快完成,即不削减工人或线程或其他此特定代码编译的资源。
PS:我知道我可以在运行其他构建的同时阻止一些 jenkins 构建,但这远非最佳 - 每个 jenkins 工作在 1-2 小时内完成,而 gradle 只需要大约 2/3,其中大约 2/3 时间轮流编译c++代码
【问题讨论】:
-
如果并行构建创建“损坏的文件”,它们并不是真正独立的,是吗?我建议您通过提取 stompy 位并引入依赖项来解决这种损坏的原因(通常是中间文件被踩到)
-
嗯,源是独立的,但编译器和构建器很常见,这就是问题所在
-
但是编译器和构建器很常见,这就是问题所在 - 很可能不是
-
您可以将编译器包装在某个脚本文件中,该文件将首先获取一些“锁”,并在完成后释放它,但取决于导致损坏的确切原因,如果它只是两个编译器同时运行的实例,或者它是编译器实例之间的构建缓存共享(那么如果这种锁定的包装器将在两个作业之间交错构建,您可能仍然会以损坏的文件结束)。另外,我不是 Jenkins 专家,但是否有某种方法可以隔离不同作业的构建目录(包括 VC17 的内部缓存)?我实际上希望这是默认的......
-
项目被隔离,但编译同时进行,因此有几个实例在运行