
# 使用自定义构建环境执行构建任务（内置执行机/图形化构建）
#### 应用场景
在构建过程中，通常会遇到以下这样的场景：
- CodeArts Build默认构建环境中支持的Java版本是1.8，而实际用户需要使用java 21。

- 构建时需要使用企业专有工具，CodeArts Build平台未支持。
针对于以上构建场景，本实践将为您介绍如何使用自定义构建环境执行构建任务。
 #### 约束限制
- 已在容器镜像服务中[创建组织](https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html)，组织名称为"hwstaff_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)。
   
 
#### 操作流程
表1操作流程 
| **流程**                                                                                        | **说明**                          |
|:---|:---|
| [新建项目]                                            | 为本实践新建项目。                       |
| [新建CodeArts Repo代码仓] | 为本实践创建构建过程中使用的代码文件。             |
| [制作自定义构建环境镜像]        | 制作自定义环境使用的镜像。                   |
| [新建构建任务并执行]        | 新建本实践中需要使用的构建任务并按照本实践场景配置任务并执行。 |
| [查看构建结果]            | 查看本实践的构建结果，包括查看构建日志和结果文件。       |
   
 #### 新建项目
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. 填写代码仓库名称为"custom_env_repo"，其他参数保持默认即可。单击"确定"，代码仓创建完成，跳转到代码仓详情页面。
5. 在代码仓根目依次单击"新建 \> 新建文件"。 
   图1新建文件   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051093720.png)
   
   
6. 文件名命名为"Dockerfile"，复制如下代码，粘贴到文件内容，单击"提交"。 
   ```
   # 使用官方的 ubuntu 作为基础镜像
   FROM ubuntu:latest
   # 安装 wget 工具
   RUN apt-get update && apt-get install -y wget 
   # 1、创建安装JDK工具的目录
   # 2、通过官方下载指定版本的JDK安装包到临时目录
   # 3、通过tar命令解压JDK安装包到指定目录
   # 4、删除下载的JDK安装包
   RUN mkdir /usr/local/jdk \
     && wget "https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-x64_bin.tar.gz" -P /tmp/jdk \
     && tar -zxf /tmp/jdk/jdk-17.0.12_linux-x64_bin.tar.gz -C /usr/local/jdk --strip-components 1 \
     && rm -rf /tmp/jdk/jdk-17.0.12_linux-x64_bin.tar.gz
   # 1、创建安装MAVEN工具的目录
   # 2、通过官方下载指定版本的MAVEN安装包到临时目录
   # 3、通过tar命令解压MAVEN安装包到指定目录
   # 4、删除下载的MAVEN安装包
   RUN mkdir /usr/local/maven \
     && wget "https://dlcdn.apache.org/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz" -P /tmp/maven \
     && tar -zxf /tmp/maven/apache-maven-3.9.8-bin.tar.gz -C /usr/local/maven --strip-components 1 \
     && rm -rf /tmp/maven/apache-maven-3.9.8-bin.tar.gz
   # 配置 JAVA、MAVEN 运行的环境变量
   ENV JAVA_HOME /usr/local/jdk
   ENV MAVEN_HOME /usr/local/maven
   ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
   # 运行命令，验证工具是否正常安装，并打印工具的版本信息
   RUN java -version && mvn -v
   ```
   图2Dockerfile文件内容   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002140993602.png)
   "Dockerfile"文件为制作容器镜像环境的主体，文件中定义了如下内容。
   表2Dockerfile文件指令说明 
   | **指令** | **说明**                                                                                                      |
   |:---|:---|
   | FROM   | 指定基础镜像，必须为第一个命令。当前案例指定基础镜像为官方的最新ubuntu镜像。                                                                   |
   | RUN    | 构建镜像docker build时执行的命令。当前案例安装了三个工具：wget、jdk17、maven 3.9.8。并在设置了环境变量后，执行了jdk、maven对应的版本命令，确认jdk、maven是否正常安装。 |
   | ENV    | 设置环境变量。当前案例设置了jdk、maven的环境变量，并加入到PATH环境变量里面去，方便用户使用jdk、maven的快捷命令。                                          |
      
   
   
 
 #### 制作自定义构建环境镜像
1. 在页面导航中选择"持续交付 \> 编译构建"。
2. 单击"新建任务"，根据[表3]填写参数信息，单击"下一步"。
   
    表3基本信息配置 
   | **参数** | **说明**                                                                                                                      |
   |:---|:---|
   | 任务名称   | 自定义任务名称，例如：custom_env_task。                                                                                                 |
   | 代码源    | 选择构建时拉取的代码源，这里选择"Repo"。                                                                                                     |
   | 代码仓    | 选择[新建CodeArts Repo代码仓]中新建的代码仓库名称"custom_env_repo"。 |
   | 默认分支   | 选择默认"master"即可。                                                                                                             |
      
   
   
3. 选择"空白构建模板"，单击"确定"按钮，构建任务创建完成，自动跳转至构建步骤配置页面。
4. 在"构建步骤"页签，单击"图形化"，单击"点击添加构建步骤"。 
   图3添加构建步骤   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087252525.png)
   
   
5. 在右侧区域"容器类"页签中，单击"制作镜像并推送到SWR仓库"所在行的"添加"，按照[图4]配置参数。其中"组织"选择[约束限制]中创建的组织名称"hwstaff_codeci_gray"，"镜像名称"输入"custom_ubuntu_image"，"镜像标签"输入"v1.0"，其他参数保持默认即可。
   
   图4配置构建步骤   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087371113.png)
   
   
6. 单击页面右上角"保存并执行"，在弹出的窗口中单击"确定"，自动跳转到构建任务执行页面。
7. "步骤日志"页签中，"构建日志"控制台会滚动打印构建任务执行日志信息。如[图5]所示，构建日志控制台打印了根据代码仓的"Dockerfile"文件制作容器镜像的日志。
   
   图5构建任务执行日志   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051093724.png)
   
   
8. 待构建任务成功执行完成后，跳转到"容器镜像服务"控制台页面，单击"我的镜像"，单击"自有镜像"页签，单击[5]中制作的镜像名称"custom_ubuntu_image"，跳转到镜像详情页面。
9. 在镜像详情页面单击"编辑"，在弹出的窗口中"类型"设置为"公开"，单击"确定"。 
   图6镜像详情   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051252030.png)
   
   
10. 在"下载指令"列，复制docker pull后面的完整镜像名称"swr.{regionID}.myhuaweicloud.com/hwstaff_codeci_gray/custom_ubuntu_image:v1.0"并保存到本地，便于后续的构建步骤使用。其中"{regionID}"为当前使用的区域的ID。
    
    图7完整镜像名称   
    ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087252529.png)
    
    
 
 #### 新建构建任务并执行
1. 在编译构建服务页面，单击"新建任务"，按照如下参数说明配置参数，其他参数保持默认即可。 
   - 名称：自定义构建任务名称，例如"custom_env_build_task"。
   
   - 代码源：选择本次构建拉取的代码源，这里选择"Repo"。
   
   - 代码仓：选择[新建CodeArts Repo代码仓]中新建的代码仓"custom_env_repo"。
   
   
   
   
2. 单击"下一步"，选择"空白构建模板"。然后单击"确定"，自动跳转到构建步骤配置页面。
3. 在"构建步骤"页签，单击"图形化"，单击"点击添加构建步骤"。
4. 在右侧区域"容器类"页签中，单击"使用SWR公共镜像"所在行的"添加"，按照[图4]配置参数。其中"镜像地址"填写[10]中保存的完整镜像名称"swr.{regionID}.myhuaweicloud.com/hwstaff_codeci_gray/custom_ubuntu_image:v1.0"，将如下代码示例拷贝至"命令"中，其余参数保持默认即可。
   
   ```
   java -version  # 打印当前镜像里安装的jdk版本号
   mvn -v    # 打印当前镜像里安装的maven版本号
   mvn package -Dmaven.test.skip=true -U -e -X -B  # 执行maven构建命令
   ```
   图8配置使用SWR公共镜像   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087371117.png)
   
   
5. 单击"添加步骤"，添加"上传软件包至软件发布库"构建步骤，"构建包路径"输入"\*\*/target/\*.?ar"，其他参数保持默认即可。
6. 单击页面右上角"保存并执行"，在弹出的窗口中单击"确定"，跳转到构建任务执行页面。
 
 #### 查看构建结果
1. 待构建任务成功执行后，在"步骤日志"页签，单击"构建日志"控制台上的"查看上面日志"，将日志向上滚屏。在日志中找到"Status: Downloaded newer image for swr.{regionID}.myhuaweicloud.com/hwstaff_codeci_gray/custom_ubuntu_image:v1.0"行，说明当前构建环境是基于自定义镜像进行构建的。 
   图9查看构建日志   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051093728.png)
   
   
2. 单击左侧"上传软件包到软件发布库"构建步骤，在右侧日志控制台打印了本次构建产物上传到软件发布库的信息。 
   图10构建产物上传到软件发布库的信息   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002051252034.png)
   
   
3. 选择页面导航栏"制品仓库 \> 软件发布库"，在软件发布库查看发布的软件包。 
   软件包所在目录与[构建任务]的名称一致，如[图11]所示。
   图11查看软件包   
   ![](https://support.huaweicloud.com/bestpractice-codeci/zh-cn_image_0000002087252533.png)
   
   
 
#### 相关操作
- 关于制作镜像的更多说明，可参考[制作镜像并推送到SWR仓库](https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0013.html)。
- 关于Maven构建相关常见问题，可参考[Maven构建常见问题](https://support.huaweicloud.com/codeci_faq/codeci_02_0002.html)。
- 关于镜像相关常见问题，可参考[镜像常见问题](https://support.huaweicloud.com/codeci_faq/codeci_faq_0021.html)。
 
