更新时间:2024-01-23 GMT+08:00

多任务配置

背景说明

在编译构建中,构建任务是构建的最小单元,适用于业务比较简单的场景,但是在有些复杂的构建场景下,构建任务可能并不能满足复杂的构建要求。例如:

  • 多仓工程需要分布到多个机器上去构建,并且构建工程之间还存在一定的依赖关系。
  • 希望更模块化、更加细粒度的拆分构建任务,并按照依赖顺序进行构建。

对于上述这类比较复杂的构建场景,编译构建支持使用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:同步触发所有子任务的构建,有依赖其它任务的子任务会先准备好环境和代码,等待所依赖的任务构建成功。

      可能造成资源空闲等待,但是可以缩短构建时间,推荐在并发数足够大的情况下使用。

  • 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文件中定义的全局参数。