
# 使用Maven构建上传软件包和推送镜像到SWR（内置执行机/代码化构建）
#### 应用场景
编译构建服务支持通过yaml文件配置构建脚本，用户可以将构建时需要配置的构建环境、构建参数、构建命令、构建步骤等操作，通过yaml语法编写成build.yml文件实现，并且将build.yml文件和被构建的代码一起存储到代码仓库。执行构建任务时，系统会以build.yml文件作为构建脚本执行构建任务，使构建过程可追溯、可还原，安全可信。本实践以使用Maven构建为例，为您演示上传软件包至软件发布库和推送镜像到SWR。
本实践需要依赖使用的其他服务如下：
- SWR，即[容器镜像服务](https://support.huaweicloud.com/productdesc-swr/swr_03_0001.html)。SWR镜像仓库用于存储用户上传的Docker镜像，可以在构建、部署或其他场景使用。
- [代码托管服务](https://support.huaweicloud.com/codeartsrepo/index.html)，用于存储实践中项目所使用的代码。
- [制品仓库服务](https://support.huaweicloud.com/cloudartifact/index.html)，用于存储实践中使用的私有依赖包。
 
#### 约束限制
- 已在容器镜像服务中[创建组织](https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html)，组织名称为"codeci_gray"。
- 需已具备CodeArts Artifact服务的操作权限，具体操作可参考[授权使用CodeArts Artifact服务](https://support.huaweicloud.com/usermanual-cloudartifact/cloudartifact_bill_9000.html)。
- 需已具备CodeArts Repo服务的操作权限，具体操作可参考[授权使用CodeArts Repo服务](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0132.html)。
- 代码化构建仅支持使用CodeArts Repo中的代码。
 
#### 操作流程
表1操作流程 
| **流程**                                                                                          | **说明**                   |
|:---|:---|
| [新建项目]                 | 为本实践新建项目。                |
| [新建CodeArts Repo代码仓] | 为本实践新建Repo代码仓用于存储代码文件。   |
| [新建build.yml文件]        | 通过"build.yml"定义整个构建的流程。  |
| [新建Dockerfile文件]      | 通过修改Dockerfile文件实现自定义镜像。 |
| [新建编译构建任务]             | 新建本实践的编译构建任务。            |
| [查看并验证构建结果]          | 查看并验证构建结果。               |
   
 #### 新建项目
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. 在新建代码仓页面，"代码仓库名称"命名为"maven_yml_build"，其他参数保持默认即可。
5. 单击"确定"，进入代码仓详情页。
 
 #### 新建build.yml文件
1. 在代码仓详情页，单击"新建 \> 新建目录"，如[图1]所示。
   
   图1新建目录   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087370869.png)
   
   
2. 在新建目录页面，根据[表2]填写参数信息，单击"确定"。
   
    表2新建目录 
   | **参数** | **说明**                                                                              |
   |:---|:---|
   | 目录名称   | 填写目录名称，例如".cloudbuild"。文件目录名称仅支持中文，英文字母，数字，单斜杠"/"，下划线"_"，中横线"-"和点"."，字符长度范围为1\~100。 |
   | 提交信息   | 目录的备注信息，用于记录该文件夹文件的描述信息。字符长度范围1\~2000。                                              |
      
   
   
3. 单击[2]中新建的目录名称。
4. 单击"新建 \> 新建文件"，如[图2]所示。
   
   图2新建文件   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051093460.png)
   
   
5. 文件命名为"build.yml"，并将如下代码拷贝到文件中。 
   ```
   # This YAML is the default template and can be modified based on this 
   ---
   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
     - upload_artifact:
         inputs:
           path: "**/target/*.?ar"
     - build_image:
         inputs:
           organization: codeci_gray # 组织名称
           image_name: maven_demo # 镜像名称
           image_tag: 1.0 # 镜像版本
           dockerfile_path: ./Dockerfile
   ```
   
   
6. 单击"提交"。
 
 #### 新建Dockerfile文件
1. 在根目录下，参考[4]新建名为"Dockerfile"的文件。文件中代码如下：
   
   ```
   FROM swr.cn-north-5.myhuaweicloud.com/codeci/special_base_image:centos7-base-1.0.2
   MAINTAINER <devcloud@demo.com> 
   USER root 
   RUN mkdir /demo 
   COPY ./target/server-1.0.jar /demo/app.jar
   ```
   其中server-1.0.jar为"pom.xml"文件中artifactId、packaging和version的参数值组合。
   
   
2. 单击"提交"。
 
 #### 新建编译构建任务
1. 在导航栏选择"持续交付 \> 编译构建"。
2. 单击"新建任务"，根据[表3]填写参数信息。
   
    表3基本信息配置 
   | **参数** | **说明**                                                                                                               |
   |:---|:---|
   | 任务名称   | 自定义任务名称，例如：maven_yml_build。                                                                                          |
   | 代码源    | 选择"Repo"。                                                                                                            |
   | 代码仓    | 选择[新建CodeArts Repo代码仓]中创建的代码仓库名称"Repo01"。 |
   | 默认分支   | 保持默认"master"即可。                                                                                                      |
   | 任务描述   | 对该构建任务的描述。                                                                                                           |
      
   
   
3. 单击"下一步"，选择"空白构建模板"。单击"确定"，进入构建步骤配置页面。
4. 单击"代码化"页签，可查看到导入的构建脚本，如[图3]所示。
   
   图3代码化页签   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087252261.png)
   
   
5. 单击页面右上角的"保存并执行"。
 
 #### 查看并验证构建结果
- 查看上传的软件包。
  1. 选择页面导航栏"制品仓库 \> 软件发布库"。
  
  2. 在软件发布库查看发布的软件包。软件包所在目录与[新建编译构建任务]时的任务名称一致，如[图4]所示。
     图4查看软件包   
     ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051251778.png) 
   
- 查看推送的镜像。
  1. 进入[容器镜像服务SWR](https://console.huaweicloud.com/swr/)。
  
  2. 单击导航栏"我的镜像"，在组织中筛选[新建build.yml文件]时代码中填写的"组织名称"，如：codeci_gray。
  
  3. 在筛选结果中单击[新建build.yml文件]时代码中填写的"镜像名称"，如：maven_demo。
   
 
#### 相关操作
- 关于Maven构建相关常见问题，可参考[Maven构建常见问题](https://support.huaweicloud.com/codeci_faq/codeci_02_0002.html)。
- 关于镜像相关常见问题，可参考[镜像常见问题](https://support.huaweicloud.com/codeci_faq/codeci_faq_0021.html)。
 
