【devops】九、Jenkins流水线

目录

    • 九、Jenkins流水线
      • 9.1 Jenkins流水线任务介绍
      • 9.2 Jenkins流水线任务
        • 9.2.1 创建Jenkins流水线任务
        • 9.2.2 Groovy脚本
        • 9.2.3 Jenkinsfile实现pipeline流水线脚本维护
      • 9.3 Jenkins流水线任务实现
        • 9.3.1 参数化构建
        • 9.3.2 拉取Git代码
        • 9.3.3 maven构建代码
        • 9.3.4 代码质量检测
        • 9.3.5 制作自定义镜像并发布到harbor仓库
        • 9.3.6 通知目标服务器执行Groovy脚本文件
      • 9.4 Jenkins流水线整合钉钉

九、Jenkins流水线

9.1 Jenkins流水线任务介绍

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

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

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

9.2 Jenkins流水线任务

9.2.1 创建Jenkins流水线任务
    1. 创建任务
      创建Jenkins流水线任务
      【devops】九、Jenkins流水线_第1张图片
    1. 选择一个Hello World的Groovy脚本,应用保存
      Hello World脚本生成
      【devops】九、Jenkins流水线_第2张图片
    1. 立即构建后查看效果图,清晰明了
      构建后查看视图
      【devops】九、Jenkins流水线_第3张图片
9.2.2 Groovy脚本
  • Groovy脚本基础语法并编辑脚本
// 所有脚本命令包含在pipeline{}中
pipeline {  
    // 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any

    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        host = '192.168.2.211'
    }

    // 存放所有任务的合集
    stages {
        // 单个任务
        stage('任务1:拉取git仓库代码') {
            // 实现任务的具体流程
            steps {
                echo '拉取代码成功'
            }
        }
        // 单个任务
        stage('任务2:通过maven构建项目') {
            // 实现任务的具体流程
            steps {
                echo '通过maven构建项目-SUCCESS'
            }
        }
        stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                echo '通过sonarqube做代码质量检测-SUCCESS'
            }
        }
        stage('任务4:通过docker制作自定义镜像') {
            steps {
                echo '通过docker制作自定义镜像-SUCCESS'
            }
        }
        stage('任务5:将自定义镜像推送到harbor') {
            steps {
                echo '将自定义镜像推送到harbor-SUCCESS'
            }
        }
        stage('任务6:通过publish over ssh通知目标服务器') {
            steps {
                echo '通过publish over ssh通知目标服务器-SUCCESS'
            }
        }
    }
}
  • 配置Grovvy脚本
  1. 将编辑好的脚本复制到流水线脚本中
    【devops】九、Jenkins流水线_第4张图片

  2. 立即构建查看效果
    【devops】九、Jenkins流水线_第5张图片

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

生成命令位置
【devops】九、Jenkins流水线_第6张图片

9.2.3 Jenkinsfile实现pipeline流水线脚本维护

在Jenkins上维护Groovy脚本成本过高,因此就衍生出了Jenkinsfile方式。Jenkinsfile方式需要将脚本内容编写到gitlab项目中的Jenkinsfile文件中,Jenkins每次构建都会自动从gitlab上拉取项目并且获取项目中Jenkinsfile文件对项目进行构建。

  1. 准备Jenkinsfile
    gitlab上创建一个Jenkinsfile文件,将上面编辑好的Grovvy脚本复制进去,提交
    【devops】九、Jenkins流水线_第7张图片
    【devops】九、Jenkins流水线_第8张图片

  2. Jenkins上配置pipeline流水线
    【devops】九、Jenkins流水线_第9张图片

  3. 立即构建测试效果
    【devops】九、Jenkins流水线_第10张图片

9.3 Jenkins流水线任务实现

9.3.1 参数化构建
  • 添加参数化构建,方便选择不的项目版本
    Git参数化构建:
    【devops】九、Jenkins流水线_第11张图片
9.3.2 拉取Git代码

从这里开始就是把Jenkins的每一步流程转换成代码去执行。流程就是在Jenkins流水线语法中生成对应的代码,然后用代码把gitlab上Jenkinsfile文件中对应的内容替换掉,然后再在Jenkins上构建。

  1. 通过流水线语法生成Checkout代码的脚本
    【devops】九、Jenkins流水线_第12张图片
    【devops】九、Jenkins流水线_第13张图片
    【devops】九、Jenkins流水线_第14张图片
    【devops】九、Jenkins流水线_第15张图片

  2. 修改gitlab中Jenkinsfile文件的内容
    【devops】九、Jenkins流水线_第16张图片

将*/main更改为标签${tag},表示引用配置中的Git参数tag,这里只是列出了修改拉取Git代码的部分,其余部分不修改,直接保存

pipeline {  
    agent any
    
    environment{
    	host = '192.168.2.211'
    }

    stages {
        stage('任务1:拉取git仓库代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
}
  1. 立即构建查看效果
    【devops】九、Jenkins流水线_第17张图片
9.3.3 maven构建代码
  1. 自动生成maven构建代码
    【devops】九、Jenkins流水线_第18张图片

  2. 替换gitlab上的代码
    【devops】九、Jenkins流水线_第19张图片

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

pipeline {  
    agent any
    
    environment{
    	host = '192.168.2.211'
    }

    stages {
        stage('任务1:拉取git仓库代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
        stage('任务2:通过maven构建项目') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
    }
}
 
  1. 立即构建查看效果
    【devops】九、Jenkins流水线_第20张图片
9.3.4 代码质量检测

一样是三步走,先自动生成代码,再修改gitlab上的Jenkinsfile文件,最后立即构建查看效果。

  1. 自动生成检测代码质量代码
/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff

【devops】九、Jenkins流水线_第21张图片

  1. 替换gitlab上的代码
    【devops】九、Jenkins流水线_第22张图片

通过脚本执行sonar-scanner命令进行代码检测 :

pipeline {  
    agent any
    
    environment{
    	host = '192.168.2.211'
    }

    stages {
        stage('任务1:拉取git仓库代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
        stage('任务2:通过maven构建项目') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过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=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
    }
}
  1. 立即构建查看效果
    【devops】九、Jenkins流水线_第23张图片
9.3.5 制作自定义镜像并发布到harbor仓库
  • 制作镜像
  1. 自动生成构建自定义镜像代码
    【devops】九、Jenkins流水线_第24张图片

  2. 替换gitlab上的代码
    【devops】九、Jenkins流水线_第25张图片

通过自定义镜像脚本构建自定义镜像 :

pipeline {  
    agent any
    
    environment{
    	host = '192.168.2.211'
    }

    stages {
        stage('任务1:拉取git仓库代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
        stage('任务2:通过maven构建项目') {
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过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=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:${tag} .'''
            }
        }
    }
}
  1. 立即构建查看效果,并到目标服务器中查看镜像是否构建完成
    【devops】九、Jenkins流水线_第26张图片
    【devops】九、Jenkins流水线_第27张图片
  • 将自定义镜像发布到harbor仓库
  1. 自动生成发布镜像代码
    【devops】九、Jenkins流水线_第28张图片

  2. gitlab上Jenkinsfile文件增加变量,修改发布的代码
    【devops】九、Jenkins流水线_第29张图片

// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1:拉取git仓库代码') {
        	// 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
		// 单个任务
        stage('任务2:通过maven构建项目') {
        	// 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过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=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:${tag} .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }
    }
}
  1. 立即构建查看效果
    【devops】九、Jenkins流水线_第30张图片

  2. 查看harbor上也出现了这个镜像,说明推送成功
    【devops】九、Jenkins流水线_第31张图片

9.3.6 通知目标服务器执行Groovy脚本文件
  1. Jenkins自动生成通知代码
    由于groovy脚本文件中有$1-$5的5个变量,所以需要进行赋值,前几个参数在Jenkinsfile文件中已经给了变量,第五个port需要指定,这里在Git参数中增加
    ①增加2个Git参数,方便引用——container_port & host_port
    【devops】九、Jenkins流水线_第32张图片

②自动生成代码
【devops】九、Jenkins流水线_第33张图片
【devops】九、Jenkins流水线_第34张图片

deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_port
  1. gitlab替换代码
    【devops】九、Jenkins流水线_第35张图片
// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1:拉取git仓库代码') {
        	// 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
		// 单个任务
        stage('任务2:通过maven构建项目') {
        	// 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过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=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:${tag} .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }
         stage('任务6:通过publish over ssh通知目标服务器') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborAddress $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:由于采用变量,记得使用双引号

  1. 立即构建查看效果
    【devops】九、Jenkins流水线_第36张图片
    再在目标服务器中使用docker ps查看容器运行状态

9.4 Jenkins流水线整合钉钉

通过上述操作,Jenkins将从gitlab上拉取的代码打包、构建,做质量检测,再制作成自定义镜像推送到harbor仓库,再通知目标服务器从harbor仓库拉取镜像执行Groovy脚本文件,最后再由Jenkins通过钉钉或者企业微信通知项目组成员结果。

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

  1. 安装插件
    【devops】九、Jenkins流水线_第37张图片

  2. 钉钉内部创建群组并构建机器人
    先创建一个dingding群,然后添加机器人
    【devops】九、Jenkins流水线_第38张图片【devops】九、Jenkins流水线_第39张图片
    【devops】九、Jenkins流水线_第40张图片
    【devops】九、Jenkins流水线_第41张图片
    完成后最终获取到Webhook信息,复制保存

https://oapi.dingtalk.com/robot/send?access_token=6e0a83d43a65b925cf9ece0e242944f5de1c40fd04143e03dcb850557f378cde
  1. Jenkins系统配置添加钉钉通知
    系统配置中,最下方选择钉钉
    【devops】九、Jenkins流水线_第42张图片
    【devops】九、Jenkins流水线_第43张图片
    添加一个机器人,配置信息
    【devops】九、Jenkins流水线_第44张图片

  2. gitlab中Jenkinsfile文件中追加流水线配置
    【devops】九、Jenkins流水线_第45张图片

Jenkinsfile文件内容 :

// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1:拉取git仓库代码') {
        	// 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
		// 单个任务
        stage('任务2:通过maven构建项目') {
        	// 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过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=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:${tag} .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }
         stage('任务6:通过publish over ssh通知目标服务器') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborAddress $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: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}
  1. 立即构建查看钉钉效果
    【devops】九、Jenkins流水线_第46张图片

你可能感兴趣的:(devops流水线搭建流程,jenkins,devops,运维,云原生,docker)