多任务配置
背景说明
在编译构建中,构建任务是构建的最小单元,适用于业务比较简单的场景,但是在有些复杂的构建场景下,构建任务可能并不能满足复杂的构建要求。例如:
- 多仓工程需要分布到多个机器上去构建,并且构建工程之间还存在一定的依赖关系。
- 希望更模块化、更加细粒度的拆分构建任务,并按照依赖顺序进行构建。
对于上述这类比较复杂的构建场景,编译构建支持使用BuildFlow将多个存在依赖关系的构建任务按照有向无环图(DAG)的方式组装起来,BuildFlow将会按照构建的依赖关系并发进行构建。
BuildFlow整体介绍
BuildFlow示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: 2.0 # 必须是2.0 params: - name: buildFlowParam value: buildFlowValue buildflow: strategy: lazy # 定义buildFlow运行的策略,lazy/eager jobs: # 构建任务 - job: Job3 depends_on: # 定义job的依赖,实例中Job3依赖Job1,Job2 - Job1 - Job2 build_ref: .cloudbuild/build3.yml # 定义Job在构建过程中需要运行的yaml构建脚本 - job: Job1 build_ref: .cloudbuild/build1.yml - job: Job2 build_ref: .cloudbuild/build2.yml |
在这个BuildFlow中,包含几个关键要素:
- version:版本号,必填且唯一,示例文件中定义的“version”为2.0。
- params:构建参数,BuildFlow的全局参数,该参数会被所有的Job共享。
- strategy:运行策略,共有两种运行模式,如果没有显式的定义,默认使用Eager模式。
- Lazy:先触发优先级高的子任务构建,优先级高的子任务执行成功之后,再触发优先级低的子任务。
构建时间相对较长,但是可以节省构建资源,推荐在并发数不足时使用。
- Eager:同步触发所有子任务的构建,有依赖其它任务的子任务会先准备好环境和代码,等待所依赖的任务构建成功。
可能造成资源空闲等待,但是可以缩短构建时间,推荐在并发数足够大的情况下使用。
- Lazy:先触发优先级高的子任务构建,优先级高的子任务执行成功之后,再触发优先级低的子任务。
- Jobs:需要进行编排的任务,示例文件中“Jobs”层级下又分出3个参数。
- job:构建任务的名称,可自定义修改。
- depends_on:该构建任务所依赖的构建任务。
- build_ref:该构建任务在构建过程中需要运行的yaml构建脚本。
可以发现该BuildFlow示例中,共配置了三个构建任务:Job1、Job2、Job3,三个构建任务共享已被定义的参数params,并且构建任务Job3依赖Job1和Job2。
BuildFlow jobs介绍
BuildFlow Jobs用来定义BuildFlow中需要进行编排的任务,每一个Job都必须要有一个唯一的名字作为构建任务的唯一标识。
- 若子任务A依赖子任务B,则构建优先级B > A。
- 优先级相同的子任务会同步触发。
BuildFlow jobs示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
buildflow: strategy: lazy jobs: - job: Job3 depends_on: - Job1 - Job2 build_ref: .cloudbuild/build3.yml - job: Job1 build_ref: .cloudbuild/build1.yml - job: Job2 build_ref: .cloudbuild/build2.yml |
如上所示,Job3依赖于Job1和Job2,即构建优先级Job1、Job2 > Job3,且Job1和Job2同步触发。
BuildFlow params介绍
BuildFlow params可以定义全局参数,即所有job共享。但是有些时候全局参数的粒度可能太大了,只需要在部分的Job上定义参数。编译构建也支持只在部分Job上定义参数使用,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
buildflow: jobs: - job: Job3 depends_on: - Build Job1 - Build job2 build_ref: .cloudbuild/build3.yml - job: Job1 params: - name: isSubmodule value: true build_ref: .cloudbuild/build1.yml - job: Job2 params: - name: isSubmodule value: true build_ref: .cloudbuild/build2.yml |
如上所示,BuildFlow中并未定义全局参数params,而是将参数“isSubmodule”直接定义在Job1与Job2中。
在使用yaml构建时,需注意参数使用的优先级:
运行时参数 > 构建任务参数设置里配置的参数 > BuildFlow子任务yaml文件中定义的参数 > BuildFlow父任务yaml文件中Job上定义的参数 > BuildFlow父任务yaml文件中定义的全局参数。