
# 构建应用并推送镜像至SWR
编译构建服务提供配置简单的混合语言构建平台，支持任务一键创建、配置和执行，实现获取代码、构建、打包等活动自动化。
在项目部署过程中，经常遇到由于环境不一致而导致的部署失败，例如研发调试环境的JDK升级后，未在环境清单中标记清楚，导致生产环境未做相应升级而引发失败。为了避免因为环境不一致导致的各种问题，本样例项目中将各微服务应用与环境统一打包到镜像，保持环境（开发调测环境、测试环境、QA环境、生产环境）一致。
本章节介绍开发人员Chris如何构建并归档镜像至SWR。
#### 预置任务简介
样例项目中预置了以下5个构建任务。
表1预置任务 
| 预置任务                     | 任务说明             |
|:---|:---|
| phoenix-sample-ci        | 基本的构建任务。         |
| phoenix-sample-ci-test   | 构建测试环境可用镜像的任务。   |
| phoenix-sample-ci-worker | 构建Worker功能镜像的任务。 |
| phoenix-sample-ci-result | 构建Result功能镜像的任务。 |
| phoenix-sample-ci-vote   | 构建Vote功能镜像的任务。   |
   
本章节以任务"phoenix-sample-ci"为例进行讲解，任务内置的步骤及作用如下表所示，用户完成任务的参数配置后即可执行该任务。
表2构建步骤 
| **构建步骤**                        | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
|:---|:---|
| 制作Vote镜像并推送到SWR仓库               | 根据文件"vote/Dockerfile"制作Vote功能镜像，并将镜像推送到SWR服务中保存。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 制作Result镜像并推送到SWR仓库             | 根据文件"result/Dockerfile"制作并推送Result功能镜像，并将镜像推送到SWR服务中保存。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 使用Maven安装Worker依赖包              | 使用Maven安装Worker功能所需的依赖。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 制作Worker镜像并推送到SWR仓库             | 根据文件"worker/Dockerfile"制作并推送Worker功能镜像，并将镜像推送到SWR服务中保存。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 生成Postgres and Redis Dockerfile | 通过shell命令生成文件"Dockerfile"，用以制作Postgres（数据库）和Redis（缓存）镜像。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 制作Postgres镜像并推送到SWR仓库           | 根据"生成Postgres and Redis Dockerfile"步骤中所生成的Dockerfile文件制作Postgres镜像，并将镜像推送到SWR服务中保存。                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 制作Redis镜像并推送到SWR仓库              | 根据"生成Postgres and Redis Dockerfile"步骤中所生成的Dockerfile文件制作Redis镜像，并将镜像推送到SWR服务中保存。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 替换Docker-Compose部署文件镜像版本        | 为了将镜像部署到ECS时，能够拉取到正确的镜像，使用shell命令完成以下操作。 - 使用sed命令，依次将文件"docker-compose-standalone.yml"中的参数替换为构建任务的参数"dockerServer"、"dockerOrg"、"BUILDNUMBER"的值。  - 使用tar命令，将文件"docker-compose-standalone.yml"压缩为"docker-stack.tar.gz"，将部署所需文件进行打包，以便于后续步骤将该文件上传归档。                                             |
| 替换Kubernetes部署文件镜像版本            | 为了将镜像部署到CCE时，能够拉取到正确的镜像，使用shell命令完成以下操作。 - 使用sed命令，将目录"kompose"下所有以"deployment"结尾的文件中的"docker-server"、"docker-org"，替换为构建任务的参数"dockerServer"、"dockerOrg"的值。  - 使用sed命令，依次将文件"result-deployment.yaml"、"vote-deployment.yaml"、"worker-deployment.yaml"中的"image-version"替换为构建任务的参数"BUILDNUMBER"的值。   |
| 上传Kubernetes部署文件到软件发布库          | 将"替换Kubernetes部署文件镜像版本"步骤中修改后的所有".yaml"文件上传到软件发布库中归档。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 上传docker-compose部署文件到软件发布库      | 将"替换Docker-Compose部署文件镜像版本"步骤中压缩好的"docker-stack.tar.gz"上传到软件发布库中归档。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
 #### 配置SWR服务
1. 登录[SWR控制台](https://console.huaweicloud.com/swr)。
2. 单击"登录指令"，页面弹框显示登录指令。 
   其中，
   - "-u"之后的字符串为用户名。
   
   - "-p"之后的字符串为密码。
   
   - 最后的字符串为SWR服务器地址。
   
   
   图1登录指令   
   ![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002541851971.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-devcloud/public_sys-resources/note_3.0-zh-cn.png)
   此处生成的登录指令为临时登录指令，有效期为24小时。如果需要长期有效的登录指令，请参见[获取长期有效登录或推拉镜像指令](https://support.huaweicloud.com/usermanual-swr/swr_01_1000.html)。
   
   
3. 单击"创建组织"，在弹框中输入组织名称"phoenix"（如果页面提示"组织已存在"，请自定义其他名称），单击"确定"。 
   新建成功后，在左侧导航栏中单击"组织管理"，在组织管理页面中显示已创建的组织。
   图2组织管理   
   ![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002513107761.png "点击放大")
   
   
 
#### 配置并执行任务
配置构建任务前，请参考[更新Dockerfile中npm全局依赖安装版本](https://support.huaweicloud.com/bestpractice-devcloud/devcloud_practice_2004.html#devcloud_practice_2004__section191975415123)，检查代码仓库中的配置。
1. 进入项目"凤凰商城"，单击导航"持续交付 \> 编译构建"，进入编译构建服务。
2. 在任务"phoenix-sample-ci"的"操作"列中单击![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000001507761188.png)，选择"编辑"，进入编辑页面。
3. 选择"参数设置"页签，为以下参数配置默认值。 
   表3参数设置 
   | 名称           | 默认值                                                                      |
   |:---|:---|
   | codeBranch   | master。                                                                  |
   | dockerOrg    | 输入在[配置SWR服务]中创建的组织名称。     |
   | version      | 1.0.0                                                                    |
   | dockerServer | 输入在[配置SWR服务]中获取的SWR服务器地址。 |
      
   
   
4. 单击"保存并执行"，在弹框中单击"确定"，启动构建任务。
   
   当页面中显示![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000001327023737.png)时，表示任务执行成功。请记录以"#"开头的字符串（例如![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002320119849.png)）。
   如果构建失败，请查看失败步骤信息与日志中的报错信息。
   - 如果报错信息为"Timeout exceeded while awaiting headers"或"too many requests"，请参考[拉取镜像失败导致构建失败](https://support.huaweicloud.com/bestpractice-devcloud/devcloud_practice_2014.html)处理。
   
   - 如果报错信息为"The command '/bin/sh -c npm install -g nodemon' returned a non-zero code: 1"，请参考[更新Dockerfile中npm全局依赖安装版本](https://support.huaweicloud.com/bestpractice-devcloud/devcloud_practice_2004.html#devcloud_practice_2004__section191975415123)处理。
   
   - 其他报错，请参考[编译构建常见问题](https://support.huaweicloud.com/codeci_faq/codeci_02_0001.html)排查处理。
   
   
   
   
5. 检查发布件。 
   1. 单击导航"制品仓库 \> 软件发布库"，进入软件发布库。
   
   2. 在与项目同名的仓库中，可以找到"docker-stack"、"phoenix-sample-ci"两个文件夹。
      - 在"docker-stack"文件夹中，可找到与[4]中记录的字符串同名的文件夹，在此文件夹中可以找到发布件"docker-stack.tar.gz"。
      
      - 在文件夹"phoenix-sample-ci/1.0.0"中，可以找到归档的10个".yaml"格式文件。
      
      
      图3检查软件发布库   
      ![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002510259656.png) 
   
   3. 进入容器镜像服务，在导航中选择"组织管理"，单击在[配置SWR服务]中创建的组织名称。
      选择"镜像"页签，可以在列表中找到5个镜像"redis"、"postgres"、"worker"、"result"、"vote"。
      图4查看SWR   
      ![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002353611000.png "点击放大") 
   
   4. 依次在列表中单击5个镜像的名称进入详情页。在"镜像版本"页签中查看镜像版本。
      - redis的镜像版本为"alpine"。
      
      - postgres的镜像版本为"9.4"。
      
      - worker、result、vote的镜像版本均与在[4]中记录的字符串相同。
       
   
   
   
   
 
#### 设置提交代码触发自动编译
通过以下配置，可实现代码变更后自动触发构建任务的执行，从而实现项目的持续集成。
1. 进入项目"凤凰商城"，单击导航"持续交付 \> 编译构建"，进入编译构建服务。
2. 在任务"phoenix-sample-ci"的"操作"列中单击![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002286905850.png)，选择"编辑"，进入编辑页面。
3. 选择"执行计划"页签。
4. 打开"提交代码触发执行"开关![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000001421400278.png)，保存任务。
   
   由于在"参数设置"页签中"codeBranch"配置的默认值为"master"，因此本次设置的结果是当master有代码变更时自动触发构建。
   图5配置执行计划   
   ![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002286903670.png)
   
   
5. 验证配置结果：修改项目代码并提交至master，然后查看构建任务是否自动启动执行。
 
#### 设置定时执行任务
通过以下设置，可实现构建任务的定时执行。
1. 进入项目"凤凰商城"，单击导航"持续交付 \> 编译构建"，进入编译构建服务。
2. 在任务"phoenix-sample-ci"的详情页，单击"编辑"。
3. 选择"执行计划"页签。
4. 打开"启用定时执行"开关![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000001508082020.png)，根据需要选择执行日与执行时间，关闭"代码变化才执行"，保存任务。
   
   本文档中勾选"全选"，执行时间为"12:00"（本文中使用默认时区，可以根据实际需要修改时区）。
   图6配置定时执行   
   ![](https://support.huaweicloud.com/bestpractice-devcloud/zh-cn_image_0000002321465317.png "点击放大")
   
   
5. 验证配置结果：根据配置时间查看构建任务是否自动执行，本节不再赘述。
 
