如何创建跨越多个阶段的CI作业,以提高并行性?
如下图所示:
我们的想法是,slow_build
应该尽早开始build
,但test
并不依赖于它,因此test
应该能够以build
开头build
完成后。
(请注意,这是一个简化:每个阶段都有多个进程并行运行,否则我可以将test
和<div class="container">
<div class="row no-gutters d-block">
<div class="col-md-4 float-left">
<div class="a">
A
</div>
</div>
<div class="col-md-8 float-left">
<div class="b">
B
</div>
</div>
<div class="col-md-8 float-right">
<div class="c">
C
</div>
</div>
<div class="col-md-4 float-left">
<div class="d">
D
</div>
</div>
</div>
</div>
捆绑在一起。)
答案 0 :(得分:2)
从 Gitlab 12.2 版开始,这已经成为可能。通过向依赖于其他作业的作业添加关键字 needs
,阶段现在可以并发运行。 needs
关键字的完整文档在这里,但文档中的示例如下:https://docs.gitlab.com/ee/ci/yaml/#needs
linux:build:
stage: build
mac:build:
stage: build
lint:
stage: test
needs: []
linux:rspec:
stage: test
needs: ["linux:build"]
linux:rubocop:
stage: test
needs: ["linux:build"]
mac:rspec:
stage: test
needs: ["mac:build"]
mac:rubocop:
stage: test
needs: ["mac:build"]
production:
stage: deploy
由于 lint
作业不需要任何东西,它会立即运行,linux:build
和 mac:build
也是如此。但是,如果 linux:build
在 mac:build
之前完成,则 linux:rspec
和 linux:rubocop
都可以开始,甚至在 mac:build
和 build
阶段完成之前。>
像往常一样,如果没有 needs
关键字,production
作业需要在开始之前完成所有先前的作业。
在管道中使用 needs
时,您还可以在管道视图中查看作业的有向无环图。有关更多信息,请访问:https://docs.gitlab.com/ee/ci/directed_acyclic_graph/index.html