如何创建跨越多个阶段的 CI 作业以提高并行性?
如下图所示:
这个想法是slow_build
应该尽早开始build
,但test
不依赖于它,所以test
应该能够在build
完成后立即开始。
(注意,这是一个简化:每一级具有并行运行多个进程,否则我可以捆绑build
和test
在一起。)
从 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
Run Code Online (Sandbox Code Playgroud)
由于该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_acirclic_graph/index.html