美文网首页K8S
DevOps之Jenkins流水线

DevOps之Jenkins流水线

作者: 羋学僧 | 来源:发表于2022-07-08 17:17 被阅读0次

    1 、Jenkins流水线任务介绍

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

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

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

    2、 Jenkins流水线任务

    2.1、 构建Jenkins流水线任务
    • 构建任务

      构建Jenkins流水线任务
    • 生成Groovy脚本

      Hello World脚本生成
    • 构建后查看视图

      构建后查看视图
    2.2、 Groovy脚本
    • Groovy脚本基础语法

      // 所有脚本命令包含在pipeline{}中
      pipeline {  
        // 指定任务在哪个节点执行(Jenkins支持分布式)
          agent any
          
          // 配置全局环境,指定变量名=变量值信息
          environment{
            host = '192.168.117.112'
          }
      
          // 存放所有任务的合集
          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给予了充足的提示,可以自动生成命令

    生成命令位置
    2.3、 Jenkinsfile实现

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

    • 配置pipeline

      配置pipeline
    • 准备Jenkinsfile

      准备Jenkinsfile文件
    • 测试效果

      测试效果

    3、 Jenkins流水线任务实现

    3.1、 参数化构建

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

    Git参数化构建
    3.2、 拉取Git代码

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

    语法生成

    将*/master更改为标签${tag}

    pipeline {
        agent any
        stages {
    
            stage('拉取Git代码') {
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
                }
            }
        }
    }
    
    3.3、 构建代码

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

    pipeline {
        agent any
    
        stages {
    
            stage('拉取Git代码') {
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
                }
            }
    
            stage('构建代码') {
                steps {
                    sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
                }
            }
        }
    }
    
    3.4、 代码质量检测

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

    pipeline {
        agent any
    
        stages {
    
            stage('拉取Git代码') {
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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' 
                }
            }
        }
    }
    
    
    3.5、 制作自定义镜像并发布
    • 生成自定义镜像脚本
      pipeline {
          agent any
          environment{
              harborHost = '192.168.117.112:80'
              harborRepo = 'repo'
              harborUser = 'admin'
              harborPasswd = 'Harbor12345'
          }
      
          // 存放所有任务的合集
          stages {
      
              stage('拉取Git代码') {
                  steps {
                      checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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.117.112:80'
            harborRepo = 'repo'
            harborUser = 'admin'
            harborPasswd = 'Harbor12345'
        }
        stages {
    
            stage('拉取Git代码') {
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f' 
                }
            }
            
    
            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: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                  }
              }
        }
    }
    

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

    4、 Jenkins流水线整合钉钉

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

    • 安装插件

      安装插件
    • 钉钉内部创建群组并构建机器人

      钉钉内部创建群组并构建机器人

      最终或获取到Webhook信息

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

      配置钉钉通知
    • 任务中追加流水线配置
    pipeline {
        agent any
        environment{
            harborHost = '192.168.117.112:80'
            harborRepo = 'repo'
            harborUser = 'admin'
            harborPasswd = 'Harbor12345'
        }
        stages {
    
            stage('拉取Git代码') {
                steps {
                    checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.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=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f' 
                }
            }
            
    
            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: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_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}"]
                  )
            }
        }
    }
    
    • 查看效果

      钉钉通知效果

    5、 Jenkins流水线从GitLab拉取脚本

    5.1、流水线使用SCM
    5.2、创建Jenkinsfile
    5.3、编写脚本
    效果

    相关文章

      网友评论

        本文标题:DevOps之Jenkins流水线

        本文链接:https://www.haomeiwen.com/subject/shsvbrtx.html