# 使用 Jenkins 实现镜像的 CI/CD
#### 操作场景
在云原生应用持续交付过程中，您需要将代码提交后自动构建为容器镜像，推送到镜像仓库后自动部署到容器集群。Jenkins 作为主流的 CI/CD 工具，可以串联从源码构建到镜像推送再到集群部署的全流程。
容器镜像服务（SWR）提供镜像存储能力，与 Jenkins 结合可以实现完整的 CI/CD 流水线。
通过本章节的操作，您可以实现使用 Jenkins Pipeline 自动拉取源码、构建 Docker 镜像并推送到 SWR。
#### 约束与限制
- Jenkins 需安装 Docker 插件，且 Jenkins agent 节点上需安装 Docker 运行环境。
- 在 Jenkins 中直接控制部署时机，可使用 kubectl 或 CCE API 直接部署。
 
#### 前提条件
表1前提条件 
| 前提条件                            | 确认方法                                                                                                                                                                                                                                                                                                                                                                                  | 参考文档                                                                                                                                                                                    |
|:---|:---|:---|
| 已创建组织                             | 在[SWR控制台](https://console.huaweicloud.com/swr/#/swr/dashboard)，确认组织已存在                                                                                                                                                                                                                                                                                                                | [创建组织](https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html#section2)                                                                                                        |
| 已获取SWR登录指令                      | 在[SWR控制台](https://console.huaweicloud.com/swr/#/swr/dashboard)"总览"页面，单击"登录指令"可复制                                                                                                                                                                                                                                                                                                       | [获取长期有效的登录或推拉镜像指令](https://support.huaweicloud.com/usermanual-swr/swr_01_1000.html)。                                                                                                      |
| 已创建CCE集群，且Jenkins节点可访问集群API Server | 在[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)确认集群状态为"运行中"，并在Jenkins节点执行kubectl cluster-info验证连通性                                                                                                                                                                                                                                                              | [购买CCE集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)                                                                                                               |
| 已安装Jenkins（2.300及以上版本）            | 访问Jenkins页面，在"系统管理 \> 系统信息"中查看版本号                                                                                                                                                                                                                                                                                                                                                     | [Jenkins Master安装部署](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0067.html)                                                                                         |
| 已安装Jenkins插件                      | 在"系统管理 \> 插件管理"中确认以下插件已安装： - Docker Pipeline plugin  - Git plugin  - kubectl（可选，用于直接部署）   | [Jenkins插件管理](https://www.jenkins.io/doc/book/managing/plugins/)                                                                                                                         |
| 已配置代码仓库Webhook                    | 在GitLab/GitHub仓库设置中，确认Webhook已配置，推送到指定分支时可触发Jenkins构建                                                                                                                                                                                                                                                                                                                                  | GitLab：[Webhook官方文档](https://docs.gitlab.com/ee/user/project/integrations/webhooks.html) GitHub：[Webhook官方文档](https://docs.github.com/en/webhooks) |
   
#### 操作步骤
1. **准备Jenkins环境**
   
   1. 安装并配置Jenkins Master，详细操作请参见[Jenkins Master安装部署](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0067.html)。
   
   2. 配置Jenkins Agent，确保Agent节点具备Docker构建能力，详细操作请参见[Jenkins Agent配置](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0068.html)。
   
   3. 在Jenkins中添加SWR凭据。
      1. 在Jenkins页面，选择"系统管理 \> Manage Credentials \> Jenkins"。
      
      2. 单击"Global"域，然后单击"Add Credentials"。
      
      3. 配置以下参数：
         表2参数说明 
         | 参数      | 说明                                       |
         |:---|:---|
         | Kind     | 选择"Username with password"               |
         | Username | SWR登录用户名，格式为{区域名}@{账号名}                   |
         | Password | SWR登录密码                                  |
         | ID       | 凭据标识（用户自定义），如swr-credentials，后续Pipeline中引用 |
            
         ![](https://support.huaweicloud.com/bestpractice-swr/public_sys-resources/note_3.0-zh-cn.png)
         SWR登录用户名和SWR登录密码获取方式参见[获取长期有效的登录或推拉镜像指令](https://support.huaweicloud.com/usermanual-swr/swr_01_1000.html)。
         
      
      4. 单击"Create"保存凭据。
       
   
   4. 添加 Git 仓库凭据 如果代码仓库为私有仓库，需按相同方式添加 Git 凭据，ID 设置为 git-credentials，与后续 Pipeline 中的 credentialsId 保持一致。
      
   
   5. 添加kubeconfig文件
      1. 从集群导出 kubeconfig 文件，参考[配置文件下载](https://support.huaweicloud.com/cce_faq/cce_faq_00041.html)。
      
      2. 存入 Jenkins 凭据 在Jenkins页面，选择"系统管理 \> Manage Credentials \> Jenkins"。
         单击"Global"域，然后单击"Add Credentials"。
         配置以下参数：
         表3参数说明 
         | 参数   | 说明                                           |
         |:---|:---|
         | Kind | 选择"Secret file"                              |
         | File | 上传 kubeconfig-prod 文件                        |
         | ID   | 凭据标识（用户自定义），如kubeconfig-prod，后续Pipeline中引用 |
            
         
       
   
   
   
   
2. **创建Jenkins Pipeline**
   
   1. 在Jenkins页面，单击"New Item"。
   
   2. 输入任务名称（如swr-cicd-pipeline），选择"Pipeline"，单击"OK"。
   
   3. 在"Pipeline"配置区域，选择"Pipeline script"，粘贴以下Jenkinsfile脚本。 请根据实际环境替换脚本中的占位符（如\<SWR地址\>、\<命名空间\>等）。
      ```
      pipeline {
          agent any
          environment {
              SWR_REGISTRY  = '<SWR地址>'                  // 如：swr.cn-north-4.myhuaweicloud.com
              IMAGE_NAME    = '<命名空间>/<镜像名称>'       // 如：my-namespace/my-app
              IMAGE_TAG     = "${env.BUILD_NUMBER}"        // 使用 Jenkins 构建号作为镜像版本
              DOCKERFILE_PATH = '-f docker/Dockerfile .'   // Dockerfile 路径，可根据实际修改
          }
          stages {
              stage('Clone') {
                  steps {
                      checkout([
                          $class: 'GitSCM',
                          branches: [[name: env.GIT_BRANCH ?: 'main']],
                          userRemoteConfigs: [[
                              url: '<代码仓库地址>',
                              credentialsId: 'git-credentials'
                          ]]
                      ])
                  }
              }
              stage('Build Docker Image') {
                  steps {
                      script {
                          docker.withRegistry("https://${SWR_REGISTRY}", 'swr-credentials') {
                              def app = docker.build(
                                  "${SWR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}",
                                  "${DOCKERFILE_PATH}"
                              )
                          }
                      }
                  }
              }
              stage('Push to SWR') {
                  steps {
                      script {
                          docker.withRegistry("https://${SWR_REGISTRY}", 'swr-credentials') {
                              docker.image("${SWR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").push()
                          }
                      }
                  }
              }
              
              
              stage('Deploy to Prod') {
                  
                  steps {
                      input message: '确认部署到生产环境？', ok: '确认部署'
                      withCredentials([file(credentialsId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) {
                          sh """
                              kubectl set image deployment/<工作负载名称> \
                                  <容器名称>=${SWR_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} \
                                  -n <生产命名空间>
                              kubectl rollout status deployment/<工作负载名称> -n <生产命名空间>
                          """
                      }
                  }
              }
          }
          post {
              success {
                  echo "Pipeline 执行成功！镜像 ${IMAGE_NAME}:${IMAGE_TAG} 已推送并部署。"
              }
              failure {
                  echo "Pipeline 执行失败，请检查构建日志。"
              }
          }
      }
      ```
      
   
   4. 单击"Save"保存Pipeline配置。
   
   
   
   
 
#### 验证结果
1. 向代码仓库的main或develop分支推送代码，触发Jenkins构建。
2. 在Jenkins页面查看构建日志，确认各阶段执行成功：
   表4阶段结果 
   | 阶段                   | 预期结果    |
   |:---|:---|
   | Clone                 | 代码拉取成功  |
   | Build Docker Image | 镜像构建成功 |
   | Push to SWR            | 镜像推送成功 |
   | Deploy to Prod      | 部署成功    |
      
   
3. 登录[SWR控制台](https://console.huaweicloud.com/swr/#/swr/dashboard)，确认新镜像版本已上传。
4. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，确认工作负载已更新为最新镜像版本。
 
