
# 使用Maven构建执行多任务构建工程（内置执行机/代码化构建）
#### 应用场景
在编译构建中，构建任务是构建的最小单元，适用于业务比较简单的场景，但是在有些复杂的构建场景下，构建任务可能并不能满足复杂的构建要求。例如，用户希望更模块化、更加细粒度的拆分构建任务，并按照构建任务之间的依赖顺序进行构建。
为此，编译构建服务支持使用BuildFlow将多个存在依赖关系的构建任务按照有向无环图（DAG）的方式组装起来，BuildFlow将会按照构建的依赖关系并发进行构建。
本实践为您演示构建任务Job3依赖于构建任务Job1和构建任务Job2的构建工程，实践中依赖使用[代码托管服务](https://support.huaweicloud.com/codeartsrepo/index.html)，用于存储实践中项目所使用的代码。
#### 约束限制
- 使用BuildFlow构建仅支持使用CodeArts Repo中的代码。
- 需已具备CodeArts Repo服务的操作权限，具体操作可参考[授权使用CodeArts Repo服务](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0132.html)。
 
#### 操作流程
表1操作流程 
| **流程**                                                                                                                           | **说明**                  |
|:---|:---|
| [新建项目]                                                                               | 为本实践新建项目。               |
| [新建CodeArts Repo代码仓]                                    | 为本实践新建Repo代码仓用于存储代码文件。  |
| [新建build.yml文件]            | 通过"build.yml"定义整个构建的流程。 |
| [新建build.yml中使用的子任务执行脚本] | 新建整个构建过程中依赖的构建任务的执行脚本。  |
| [新建并执行编译构建任务]              | 新建BuildFlow编译构建任务并执行。   |
| [查看编译构建结果]              | 查看编译构建结果。               |
   
 #### 新建项目
1. 使用华为云账号[登录华为云控制台页面](https://console.huaweicloud.com/console)。
2. 单击页面左上角![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051251774.png)，在服务列表中选择"开发与运维 \> 华为云码道 CodeArts"。
3. 单击"立即使用"，进入CodeArts服务首页。
4. 在首页单击"新建项目"，选用"Scrum"项目模板。
5. 项目名称填写"build-bestpractice"，其他保持默认即可。
6. 单击"确定"后，进入到"build-bestpractice"项目下。
 
 #### 新建CodeArts Repo代码仓
1. 在页面导航栏选择"代码 \> 代码托管"。
2. 单击"新建仓库"，选择"模板仓库"，单击"下一步"。
3. 选择"Java Maven Demo"模板，单击"下一步"。
4. 填写代码仓库名称为"Repo01"，其他参数保持默认即可。
5. 单击"确定"。
 
 #### 新建build.yml文件
1. 在代码仓详情页，选择"新建 \> 新建目录"。
2. 目录名称填写".cloudbuild"，描述信息自定义即可，单击"确定"。
3. 在".cloudbuild"目录下，选择"新建 \> 新建文件"，文件名命名为"build.yml"，文件中代码内容如下。 
   ```
   version: 2.0 # 必须是2.0，该版本号必填且唯一
   params: # 构建参数，可在构建过程中引用
     - name: condition_param
       value: 1
   # envs配置为非必填项。
   envs: 
     - condition: condition_param == 0 # 主机规格与类型的判断条件，不满足条件则不使用以下主机规格与类型
       resource:
         type: docker 
         arch: ARM
     - condition: condition_param == 1 # 主机规格与类型的判断条件，满足条件会使用以下主机规格与类型
       resource:
         type: docker
         arch: X86
   buildflow:
     jobs: # 构建任务
       - job: Job3 # 子任务的名称，可自定义
         depends_on: # 定义job的依赖,此处表示Job3依赖Job1和Job2
           - Job1
           - Job2
         build_ref: .cloudbuild/build_job3.yml # 定义Job3在构建过程中需要运行的yaml构建脚本
       - job: Job1
         build_ref: .cloudbuild/build_job1.yml # 定义Job1在构建过程中需要运行的yaml构建脚本
       - job: Job2
         build_ref: .cloudbuild/build_job2.yml # 定义Job2在构建过程中需要运行的yaml构建脚本
   ```
   "build.yml"定义了整个构建的流程，当前定义了3个构建任务，Job3依赖于Job1和Job2，即构建优先级Job1、Job2 \> Job3，且Job1和Job2优先级相同会同步触发。"build_ref"定义了构建子任务所需运行的构建脚本。
   
   
 
 #### 新建build.yml中使用的子任务执行脚本
1. 在".cloudbuild"目录下，选择"新建 \> 新建文件"，文件名命名为"build_job1.yml"，文件中代码示例如下。
   
   ```
   version: 2.0
   steps:
     BUILD:
     - maven:
         image: cloudbuild@maven3.5.3-jdk8-open # 使用的构建镜像，用户可以自定义镜像
         inputs:
           settings:
             public_repos:
               - https://mirrors.huawei.com/maven # 配置依赖仓
           cache: true # 是否开启缓存
           command: mvn package -Dmaven.test.failure.ignore=true -U -e -X -B # 执行命令
   ```
   
   
2. 参考[1]新建"build_job2.yml"和"build_job3.yml"，代码示例保持一致即可。
3. 文件新建完成后，代码仓文件目录如下图所示。 
   图1文件目录   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087252433.png)
   
   
 
 #### 新建并执行编译构建任务
1. 在页面导航中选择"持续交付 \> 编译构建"。
2. 单击"新建任务"，根据[表2]填写参数信息。
   
    表2基本信息配置 
   | **参数** | **说明**                                                                                                             |
   |:---|:---|
   | 任务名称   | 自定义任务名称，例如：BuildFlow。                                                                                              |
   | 代码源    | 选择"Repo"。                                                                                                          |
   | 代码仓    | 选择[新建CodeArts Repo代码仓]中新建的代码仓库名称"Repo01"。 |
   | 默认分支   | 保持默认"master"即可。                                                                                                    |
   | 任务描述   | 对该构建任务的描述。                                                                                                         |
      
   
   
3. 单击"下一步"，选择"Maven"模板。单击"确定"，进入构建步骤配置页面。
4. 单击"代码化"页签，会自动加载"Repo01"代码仓中的构建运行脚本。
5. 单击"保存并执行"，在弹出的窗口中单击"确定"即可跳转到构建任务运行页面。
 
 #### 查看编译构建结果
"构建流程"页签中展示了当前构建任务运行的全量流程图，在构建任务未执行完成时，可以清晰的看到Job1和Job2是并行执行，Job3是等待Job1和Job2执行完成后才执行。
1. 单击"构建流程"页签中左侧菜单的"Job1"或右侧界面的绿色矩形图形的"Job1"，进入Job1构建任务的执行详情页面，可以查看Job1构建任务的构建日志，如[图2]所示。
   
   图2查看构建结果   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087371025.png)
   其中，
   - "步骤日志"页签展示了当前构建任务运行顺序和资源调度情况。
   
   - "构建参数"页签展示了当前构建任务全局的参数信息。
   
   - "构建脚本"页签展示了当前构建任务执行的脚本内容。
   
   
   
   
2. 参考[1]可查看"Job2"和"Job3"的构建任务执行详情。
 
#### 相关操作
关于Maven构建相关常见问题，可参考[Maven构建常见问题](https://support.huaweicloud.com/codeci_faq/codeci_02_0002.html)。
