
# 使用编译构建服务的Maven构建上传软件包和推送镜像（X86，预置镜像，代码化构建）
编译构建服务支持通过yaml文件配置构建脚本，用户可以将构建时需要配置的构建环境、构建参数、构建命令、构建步骤等操作，通过yaml语法编写成build.yml文件实现，并且将build.yml文件和被构建的代码一起存储到代码仓库。执行构建任务时，系统会以build.yml文件作为构建脚本执行构建任务，使构建过程可追溯、可还原，安全可信。
本节以使用Maven构建为例，演示基于X86服务器和预置镜像使用代码化构建方式，上传软件包至软件包发布库和制作镜像推送至SWR仓库。
#### 前提条件
- 已注册华为云并实名认证，如果还没有华为账号，请参考以下步骤创建。
  1. 打开[华为云网站](https://www.huaweicloud.com/)。
  
  2. 单击"注册"，根据提示信息完成注册。 注册成功后，系统会自动跳转至您的个人信息界面。
     
  
  3. 参考[实名认证](https://support.huaweicloud.com/usermanual-account/zh-cn_topic_0071343161.html)完成个人或企业账号实名认证。
   
- 已开通CodeArts体验版套餐，如果还没有开通，可参考[购买CodeArts套餐](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0002.html#section1)。
- 已在容器镜像服务中创建组织，如果没有组织，可参考[创建组织](https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html#section1)
 
#### 准备项目
1. 使用华为云账号[登录华为云控制台页面](https://console.huaweicloud.com/console)。
2. 单击页面左上角![](https://support.huaweicloud.com/qs-codeci/zh-cn_image_0000002087369269.png)，在服务列表中选择"开发与运维 \> 编译构建 CodeArts Build"。
3. 单击"立即使用"，进入编译构建服务首页。单击导航栏"首页"。
4. 单击"新建项目"，选用"Scrum"项目模板并将项目名称命名为"Scrum01"，其他参数保持默认即可，然后单击"确定"，进入到"Scrum01"项目下。
 
 #### 新建CodeArts Repo代码仓
1. 在页面导航栏中选择"代码 \> 代码托管"，进入代码托管页面。
2. 单击"新建仓库"，选择"普通仓库"，单击"下一步"。
3. 根据[表1]填写参数后，单击"确定"。
   
    表1新建代码仓 
   | **参数名称**    | **参数说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|
   | 代码仓库名称      | 自定义代码仓名称。例如：maven_yml_build。 - 以数字、字母或者"_"开头。  - 可包含"."和"-"。  - 不能以".git"、".atom"或者"."结尾。                                                                                                              |
   | 描述          | 对代码仓的描述。字符长度范围为0\~2000。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 选择gitignore | 根据编程语言选择".gitignore"，例如：Java。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 初始化设置       | 勾选全部。 - 允许项目内人员访问仓库：选择后会自动将项目中的项目经理设为仓库管理员，开发人员设为仓库普通成员。当项目新增这两个角色时，也会自动同步到已经存在的仓库中。  - 允许生成README文件：可以通过编辑README文件，记录项目的架构、编写目的等信息，相当于对整个仓库的一种注释。  - 自动创建代码检查任务（免费）：仓库创建完成后在代码检查任务列表中，可看到对应仓库的检查任务。   |
   | 可见范围        | 设置为"私有"。仓库仅对仓库成员可见，仓库成员可访问仓库或者提交代码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
      
   
   
 
 #### 创建build.yml文件
1. 在页面导航中选择"代码 \> 代码托管"。
2. 单击[新建CodeArts Repo代码仓]中创建的代码仓名称。
3. 单击"新建 \> 新建目录"，如[图1]所示。
   
   图1新建目录   
   ![](https://support.huaweicloud.com/qs-codeci/zh-cn_image_0000002087250893.png)
   
   
4. 根据[表2]填写参数信息，单击"确定"。
   
    表2新建目录 
   | **参数名称** | **参数说明**                                                                          |
   |:---|:---|
   | 目录名称     | 可自定义，例如".cloudbuild"。文件目录名称仅支持中文，英文字母，数字，单斜杠"/"，下划线"_"，中横线"-"和点"."，字符长度范围为1\~100。 |
   | 提交信息     | 目录的备注信息，用于记录该文件夹。字符长度范围1\~2000。                                                   |
      
   
   
5. 单击[步骤4]创建的目录名称。
6. 单击"新建 \> 新建文件"，如[图2]所示。
   
   图2新建文件   
   ![](https://support.huaweicloud.com/qs-codeci/zh-cn_image_0000002051250398.png)
   
   
7. 文件命名为"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
   ```
   
   
8. 单击"确定"。
 
#### 创建Java文件
1. 参考[4]，创建名为"src/main/java"的目录。
2. 在"src/main/java"的目录下，参考[6]和[7]，创建名为"HelloWorld.java"的文件。文件中代码如下：
   
   ```
   /**
    * Hello world
    *
    */
   public class HelloWorld {
     public static void main(String[] args) {
       System.out.println("Hello World!");
     }
   }
   ```
   
   
3. 单击"确定"。
 
#### 创建Dockerfile文件
1. 在根目录下，参考[6]和[7]，创建名为"Dockerfile"的文件。文件中代码如下：
   
   ```
   FROM swr.cn-north-5.myhuaweicloud.com/codeci/special_base_image:centos7-base-1.0.2-in
   MAINTAINER <devcloud@demo.com> 
   USER root 
   RUN mkdir /demo 
   COPY ./target/server-1.0.jar /demo/app.jar
   ```
   
   
2. 单击"确定"。
 
#### 创建pom.xml文件
1. 在根目录下，参考[6]和[7]，创建名为"pom.xml"的文件。文件中代码如下：
   
   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.huawei.demo</groupId>
     <artifactId>server</artifactId>
     <packaging>jar</packaging>
     <version>1.0</version>
     <name>server</name>
     <url>http://maven.apache.org</url>
     <dependencies>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>3.8.1</version>
           <scope>test</scope>
       </dependency>
     </dependencies>
     <build>
       <pluginManagement>
         <plugins>
           <plugin>  
             <groupId>org.apache.maven.plugins</groupId>  
             <artifactId>maven-jar-plugin</artifactId>  
             <version>2.6</version>  
             <configuration>  
               <archive>  
                 <manifest>  
                   <addClasspath>true</addClasspath>  
                 </manifest>  
                 <manifestEntries>  
                   <Main-Class>  
                     HelloWorld
                   </Main-Class>  
                 </manifestEntries>  
               </archive>  
             </configuration>  
           </plugin> 
         </plugins>
       </pluginManagement>
     </build>
   </project>
   ```
   
   
2. 单击"确定"。
 
 #### 创建编译构建任务
1. 在页面导航栏中选择"持续交付 \> 编译构建"。
2. 单击"新建任务"，在新建任务页面根据[表3]填写参数信息后，单击"下一步"。
   
    表3基本信息配置 
   | 参数名称 | 参数说明                                                                                                              |
   |:---|:---|
   | 任务名称 | 自定义任务名称，例如：maven_yml_build。                                                                                       |
   | 代码源  | 选择"Repo"。                                                                                                         |
   | 代码仓  | 选择[新建CodeArts Repo代码仓]中创建的代码仓库名称"Repo01"。    |
   | 默认分支 | 选择[新建CodeArts Repo代码仓]中创建的分支。选择默认"master"即可。 |
      
   
   
3. 选择"空白构建模板"，单击"确定"，进入配置构建步骤页面。
4. 单击"代码化"页签，可查看到导入的构建脚本，如[图3]所示。
   
   图3代码化页签   
   ![](https://support.huaweicloud.com/qs-codeci/zh-cn_image_0000002051092094.png)
   
   
5. 单击"保存并执行"，执行编译构建任务。
 
#### 查看并验证构建结果
- 查看上传的软件包。
  1. 选择页面导航栏"制品仓库 \> 软件发布库"。
  
  2. 在软件发布库查看发布的软件包。软件包所在目录与[创建编译构建任务]时的任务名称一致，如[图4]所示。
     图4查看软件包   
     ![](https://support.huaweicloud.com/qs-codeci/zh-cn_image_0000002087369525.png) 
   
- 查看推送的镜像。
  1. 进入[容器镜像服务SWR](https://console.huaweicloud.com/swr/)。
  
  2. 在容器镜像服务页面，单击导航栏"我的镜像"，在组织中筛选[创建build.yml文件]时代码中填写的"组织名称"，如：codeci_gray。
  
  3. 在筛选结果中单击[创建build.yml文件]时代码中填写的"镜像名称"，如：maven_demo，如[图5]所示。
     图5筛选镜像   
     ![](https://support.huaweicloud.com/qs-codeci/zh-cn_image_0000002087250897.png) 
   
 
#### 相关信息
- 如果您需要了解更多构建工具的使用方法，可参考[配置构建步骤](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0059.html)。
- 关于Maven构建更多常见问题，可参考[Maven构建常见问题](https://support.huaweicloud.com/codeci_faq/codeci_02_0002.html)。
 
