
# 使用Jenkins构建流水线
 #### 获取长期的docker login命令
在Jenkins安装部署过程中，已经完成了容器中执行docker命令的配置（参见[9](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0068.html#cce_bestpractice_0068__li1063018426368)），故Jenkins对接SWR无需额外配置，可直接执行docker命令。仅需获取长期有效的SWR登录指令，具体步骤请参见[获取长期有效docker login指令](https://support.huaweicloud.com/usermanual-swr/swr_01_1000.html)。
例如本账号的命令为：
```
docker login -u cn-east-3@xxxxx -p xxxxx swr.cn-east-3.myhuaweicloud.com
```
#### 创建pipeline完成镜像构建及push
本示例将使用Jenkins构建一条流水线，该流水线的作用是从代码仓中拉取代码并打包成镜像推送到SWR镜像仓库中。
创建pipeline步骤如下：
1. 在Jenkins界面单击"New Item"。
2. 输入任务名称，并选择创建流水线。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001466646017.png "点击放大")
   
   
3. 配置pipeline脚本，其他步骤不配置。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001416249976.png "点击放大")
   以下pipeline脚本仅供您参考，您可根据自身业务自定义脚本内容，关于更多关于流水线脚本的语法请参考[Pipeline](https://www.jenkins.io/doc/book/pipeline/)。
   示例脚本中的部分参数需要修改：
   - git_url：您代码仓库的地址，需要替换为实际取值。
   
   - swr_login：登录命令为[获取长期的docker login命令]获取的命令。
   
   - swr_region：SWR的区域。
   
   - organization：SWR中的实际组织名称。
   
   - build_name：制作的镜像名称。
   
   - credential：添加到Jenkins的集群凭证，请填写凭证ID。如果需要部署在另一个集群，需要重新将这个集群的访问凭证添加到Jenkins，具体操作请参考[设置集群访问凭证](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_0068.html#cce_bestpractice_0068__section18661165610151)。
   
   - apiserver：部署应用集群的APIserver地址，需保证从Jenkins集群可以正常访问该地址。
   
   
   ```
   //定义代码仓地址
   def git_url = 'https://github.com/lookforstar/jenkins-demo.git'
   //定义SWR登录指令
   def swr_login = 'docker login -u cn-east-3@xxxxx -p xxxxx swr.cn-east-3.myhuaweicloud.com'
   //定义SWR区域
   def swr_region = 'cn-east-3'
   //定义需要上传的SWR组织名称
   def organization = 'container'
   //定义镜像名称
   def build_name = 'jenkins-demo'
   //部署集群的证书ID
   def credential = 'k8s-token'
   //集群的APIserver地址，需保证从Jenkins集群可以正常访问该地址
   def apiserver = 'https://192.168.0.100:6443'
   pipeline {
       agent any
       stages {
           stage('Clone') { 
               steps{
                   echo "1.Clone Stage" 
                   git url: git_url
                   script { 
                       build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() 
                   } 
               }
           } 
           stage('Test') { 
               steps{
                   echo "2.Test Stage" 
               }
           } 
           stage('Build') { 
               steps{
                   echo "3.Build Docker Image Stage" 
                   sh "docker build -t swr.${swr_region}.myhuaweicloud.com/${organization}/${build_name}:${build_tag} ." 
                   //${build_tag}表示获取上文中的build_tag变量作为镜像标签，为git rev-parse --short HEAD命令的返回值，即commit ID。
               }
           } 
           stage('Push') { 
               steps{
                   echo "4.Push Docker Image Stage" 
                   sh swr_login
                   sh "docker push swr.${swr_region}.myhuaweicloud.com/${organization}/${build_name}:${build_tag}" 
               }
           } 
           stage('Deploy') {
               steps{
                   echo "5. Deploy Stage"
                   echo "This is a deploy step to test"
                   script {
                   sh "cat k8s.yaml"
                   echo "begin to config kubernetes"
                   try {
                       withKubeConfig([credentialsId: credential, serverUrl: apiserver]) {
                           sh 'kubectl apply -f k8s.yaml'
                           //该YAML文件位于代码仓中，此处仅做示例，请您自行替换
                       }
                       println "hooray, success"
                   } catch (e) {
                       println "oh no! Deployment failed! "
                       println e
                   }
                   }
               }
           }
       }
   }
   ```
   
   
4. 保存后执行Jenkins job。
 
