> 文档中心 > 【云原生】DevOps(六):Jenkins流水线

【云原生】DevOps(六):Jenkins流水线

在这里插入图片描述

本文目录:

  • 一、Jenkins流水线任务介绍
  • 二、 Jenkins流水线任务
    • 1. 构建Jenkins流水线任务
    • 2. Groovy脚本
    • 3.Jenkinsfile实现
  • 三、Jenkins流水线任务实现
    • 1. 参数化构建
    • 2. 拉取Git代码
    • 3. 构建代码
    • 4. 代码质量检测
    • 5. 制作自定义镜像并发布
  • 四、 Jenkins流水线整合钉钉
  • `【系列好文推荐】`

前言: 📢📢📢
当下云原生火爆全网,云原生充分利用了云计算弹性、敏捷、资源池和服务化特性,改变云端应用的设计、开发、部署和运行模式,为我们大大提供了便利,本篇文章将带大家走进云原生的世界,揭开它的神秘面纱
💕 入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺

一、Jenkins流水线任务介绍

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

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

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

二、 Jenkins流水线任务

1. 构建Jenkins流水线任务

  • 构建任务

    构建Jenkins流水线任务

【云原生】DevOps(六):Jenkins流水线

  • 生成Groovy脚本

    Hello World脚本生成

【云原生】DevOps(六):Jenkins流水线

  • 构建后查看视图

    构建后查看视图

【云原生】DevOps(六):Jenkins流水线

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脚本

【云原生】DevOps(六):Jenkins流水线

  • 查看效果

    查看效果

【云原生】DevOps(六):Jenkins流水线

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

生成命令位置
【云原生】DevOps(六):Jenkins流水线

3.Jenkinsfile实现

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

  • 配置pipeline

    配置pipeline
    【云原生】DevOps(六):Jenkins流水线
  • 准备Jenkinsfile

    准备Jenkinsfile文件
  • 测试效果

    测试效果

【云原生】DevOps(六):Jenkins流水线

三、Jenkins流水线任务实现

1. 参数化构建

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

Git参数化构建
【云原生】DevOps(六):Jenkins流水线

2. 拉取Git代码

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

语法生成
【云原生】DevOps(六):Jenkins流水线

【云原生】DevOps(六):Jenkins流水线

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流水线整合钉钉

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

  • 安装插件

    安装插件
    【云原生】DevOps(六):Jenkins流水线

    最终或获取到Webhook信息

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

    配置钉钉通知
    【云原生】DevOps(六):Jenkins流水线
  • 任务中追加流水线配置

    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流水线

【系列好文推荐】

🎯🎯🎯
Python Web开发一:Web开发简介
Python Web开发二:Django的安装和运行
Python Web开发(三):HTTP请求的url路由

欢迎订阅本专栏:零基础学Python 系列课程是针对Python入门&进阶打造的一全套课程,在这里,我将会一 一更新Python基础语法、Python爬虫、Web开发、 Django框架、Flask框架以及人工智能相关知识,帮助你成为Python大神,如果你喜欢的话就抓紧收藏订阅起来吧~💘💘💘
💕💕💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!✨ ✨ ✨
🍻🍻🍻如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述
⬇️⬇️ ⬇️ 商务合作|交流学习|粉丝福利|Python全套资料⬇️ ⬇️ ⬇️ 欢迎联系~