云原生DevOps:Jenkins流水线

Posted 是Dream呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生DevOps:Jenkins流水线相关的知识,希望对你有一定的参考价值。

@TOC

之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。

Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。

所以Pipeline相对自由风格或者其他的项目风格更容易操作。

二、 Jenkins流水线任务

1. 构建Jenkins流水线任务

  • 构建任务

    构建Jenkins流水线任务

  • 生成Groovy脚本

    Hello World脚本生成

  • 构建后查看视图

    构建后查看视图

2. Groovy脚本

  • Groovy脚本基础语法

    // 所有脚本命令包含在pipeline中
    pipeline   
    // 指定任务在哪个节点执行(Jenkins支持分布式)
      agent any
    
      // 配置全局环境,指定变量名=变量值信息
      environment
        host = 192.168.11.11
      
    
      // 存放所有任务的合集
      stages 
        // 单个任务
          stage(任务1) 
            // 实现任务的具体流程
              steps 
                  echo do something
              
          
        // 单个任务
          stage(任务2) 
            // 实现任务的具体流程
              steps 
                  echo do something
              
          
          // ……
      
    
  • 编写例子测试

    pipeline 
      agent any
    
      // 存放所有任务的合集
      stages 
          stage(拉取Git代码) 
              steps 
                  echo 拉取Git代码
              
          
    
          stage(检测代码质量) 
              steps 
                  echo 检测代码质量
              
          
    
          stage(构建代码) 
              steps 
                  echo 构建代码
              
          
    
          stage(制作自定义镜像并发布Harbor) 
              steps 
                  echo 制作自定义镜像并发布Harbor
              
          
    
          stage(基于Harbor部署工程) 
              steps 
                  echo 基于Harbor部署工程
              
          
      
    
    配置Grovvy脚本

  • 查看效果

    查看效果

[Ps:涉及到特定脚本,Jenkins给予了充足的提示,可以自动生成命令]()

生成命令位置

3.Jenkinsfile实现

Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中Jenkinsfile文件对项目进行构建

  • 配置pipeline

    配置pipeline
  • 准备Jenkinsfile

    准备Jenkinsfile文件
  • 测试效果

    测试效果

三、Jenkins流水线任务实现

1. 参数化构建

添加参数化构建,方便选择不的项目版本

Git参数化构建

2. 拉取Git代码

通过流水线语法生成Checkout代码的脚本

语法生成

pipeline 
    agent any
    stages 

        stage(拉取Git代码) 
            steps 
                checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
            
        
    

3. 构建代码

通过脚本执行mvn的构建命令

pipeline 
    agent any

    stages 

        stage(拉取Git代码) 
            steps 
                checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
            
        

        stage(构建代码) 
            steps 
                sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
            
        

4. 代码质量检测

通过脚本执行sonar-scanner命令即可

pipeline 
    agent any

    stages 

        stage(拉取Git代码) 
            steps 
                checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
            
        

        stage(构建代码) 
            steps 
                sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
            
        

        stage(检测代码质量) 
            steps 
                sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa 
            
        
    

5. 制作自定义镜像并发布

  • 生成自定义镜像脚本

    pipeline 
      agent any
      environment
          harborHost = 192.168.11.11:80
          harborRepo = repository
          harborUser = DevOps
          harborPasswd = P@ssw0rd
      
    
      // 存放所有任务的合集
      stages 
    
          stage(拉取Git代码) 
              steps 
                  checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
              
          
    
          stage(构建代码) 
              steps 
                  sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
              
          
    
          stage(检测代码质量) 
              steps 
                  sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa 
              
          
    
          stage(制作自定义镜像并发布Harbor) 
              steps 
                  sh cp ./target/*.jar ./docker/
                  cd ./docker
                  docker build -t $JOB_NAME:$tag ./
    
                  sh docker login -u $harborUser -p $harborPasswd $harborHost
                  docker tag $JOB_NAME:$tag $harborHost/$harborRepo/$JOB_NAME:$tag
                  docker push $harborHost/$harborRepo/$JOB_NAME:$tag
              
          
      
    
  • 生成Publish Over SSH脚本

    pipeline 
      agent any
      environment
          harborHost = 192.168.11.11:80
          harborRepo = repository
          harborUser = DevOps
          harborPasswd = P@ssw0rd
      
    
      // 存放所有任务的合集
      stages 
    
          stage(拉取Git代码) 
              steps 
                  checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
              
          
    
          stage(构建代码) 
              steps 
                  sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
              
          docker
    
          stage(检测代码质量) 
              steps 
                  sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=7d66af4b39cfe4f52ac0a915d4c9d5c513207098 
              
          
    
          stage(制作自定义镜像并发布Harbor) 
              steps 
                  sh cp ./target/*.jar ./docker/
                  cd ./docker
                  docker build -t $JOB_NAME:$tag ./
    
                  sh docker login -u $harborUser -p $harborPasswd $harborHost
                  docker tag $JOB_NAME:$tag $harborHost/$harborRepo/$JOB_NAME:$tag
                  docker push $harborHost/$harborRepo/$JOB_NAME:$tag
              
          
    
          stage(目标服务器拉取镜像并运行) 
              steps 
                  sshPublisher(publishers: [sshPublisherDesc(configName: testEnvironment, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port ", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ]+, remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: )], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
              
          
      
    

Ps:由于采用变量,记得使用双引号

四、 Jenkins流水线整合钉钉

在程序部署成功后,可以通过钉钉的机器人及时向群众发送部署的最终结果通知

  • 安装插件

    安装插件

    最终或获取到Webhook信息

    https://oapi.dingtalk.com/robot/send?access_token=kej4ehkj34gjhg34jh5bh5jb34hj53b4
  • 系统配置添加钉钉通知

    配置钉钉通知
  • 任务中追加流水线配置

    pipeline 
      agent any
    
      environment 
          sonarLogin = 2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8
          harborUser = admin
          harborPassword = Harbor12345
          harborHost = 192.168.11.12:8888
          harborRepo = repository
      
    
      stages 
          stage(拉取Git代码)
              steps 
                  checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/lsx.git]]])
              
          
          stage(Maven构建代码)
              steps 
                  sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
              
          
          stage(SonarQube检测代码)
              steps 
                  sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=$sonarLogin
              
          
          stage(制作自定义镜像)
              steps 
                  sh cd docker
                  mv ../target/*.jar ./
                  docker build -t $JOB_NAME:$tag .
                  
              
          
    
          stage(推送自定义镜像)
              steps 
                  sh docker login -u $harborUser -p $harborPassword $harborHost
                  docker tag $JOB_NAME:$tag $harborHost/$harborRepo/$JOB_NAME:$tag
                  docker push $harborHost/$harborRepo/$JOB_NAME:$tag
              
          
    
          stage(通知目标服务器)
              steps 
                  sshPublisher(publishers: [sshPublisherDesc(configName: centos-docker, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ]+, remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: )], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                
          
      
      post 
          success 
              dingtalk (
                  robot: Jenkins-DingDing,
                  type:MARKDOWN,
                  title: "success: $JOB_NAME",
                  text: ["- 成功构建:$JOB_NAME项目!\\n- 版本:$tag\\n- 持续时间:$currentBuild.durationString\\n- 任务:#$JOB_NAME"]
              )
          
          failure 
              dingtalk (
                  robot: Jenkins-DingDing,
                  type:MARKDOWN,
                  title: "fail: $JOB_NAME",
                  text: ["- 失败构建:$JOB_NAME项目!\\n- 版本:$tag\\n- 持续时间:$currentBuild.durationString\\n- 任务:#$JOB_NAME"]
              )
          
      
    
  • 查看效果

    钉钉通知效果

以上是关于云原生DevOps:Jenkins流水线的主要内容,如果未能解决你的问题,请参考以下文章

云原生DevOps:Jenkins集成Kubernetes

云原生 | Devops篇Jenkins安装与实战

[云原生专题-62]:Kubesphere云治理-DevOps-持续集成与pipeline自动上云工具Jenkins

视野数科借助 SAE + Jenkins 打造云原生 DevOps,运维效率提升 60%

云原生(三十八) | Kubernetes篇之Jenkins入门和安装

云原生DevOps:集成Harbor