6:Jenkins Pipeine流水线实践

09.Jenkins Pipeine流水线实践

本章课程内容大纲
1.什么是jenkins pipeline
2.为什么要使用jenkins pipeline
3.使用pipeline需要了解的核心概念
4.jenkins pipeline语法编写示例
5.jenkins pipeline初次体验
6.jenkins pipeline 构建完整的非编译型项目实践
7.jenkins pipeline 构建完整的编译型项目实践
8.jenkins pipeline 插件

1.Jenkins pipeline基本概述

1.什么是Pipeline?
简单来说,就是运行在Jenkins上的工作框架,通过“代码的方式” 将多个任务连接起来。流水线

2.为什么要使用Pipeline?
1.pipeline能直观展示每个阶段的任务
2.pipeline能直观展示每个阶段的执行时间
3.pipeline能快速的定位哪个阶段的任务出现错误

3.Pipeline核心概念?
agent: 节点
stage: 阶段
steps: 动作

2.Jenkins pipeline语法示例

pipeline基础语法如下:

pipeline是一种固定格式,必须遵行

3.Jenkins pipeline初次体验

1.通过Jenkins创建一个流水线项目

2.编写pipeline流水线代码

3.pipeline流水线代码如下

pipeline{
    agent any
    stages {
        stage('Get Code'){
            steps {
                echo "Get Gitlab Code"
            }
        }
        stage('Test Code'){
            steps {
                echo "Unit Test"
            }
        }
        stage('Build Code'){
            steps {
                echo "Build Code"
            }
        }
        stage('Deploy Code'){
            steps {
                echo "Deploy Code"
            }
        }
    }
}

4.点击立即构建测试,可以看到整个流水线,每个阶段的内容以及花费的时长。

方式二、在代码仓库中创建一个jenkinsfile文件,然后通过pipeline调用

4.Jenkins pipeline构建Java

实战、代码拉取->代码质检->代码构建->代码部署->消息通知。

1.配置pipeline基本信息,选择参数化构建

2.流水线配置如下

3.pipeline语法如下

pipeline {
    //agent any
    agent { label 'node1' }

    stages {    //部署任务总合集
        stage('获取代码'){
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '646f0911-1851-4924-aa5d-1e7c2450dfb6', url: '[email protected]:dev/hello-world-war.git']]])
            }
        }
        stage('质量扫描'){
            steps {
                withSonarQubeEnv('sonarqube-130') {
                    sh '/usr/local/sonar-scanner/bin/sonar-scanner \
                    -Dsonar.projectName=${JOB_NAME} \
                    -Dsonar.projectKey=${JOB_NAME} \
                    -Dsonar.sources=. \
                    -Dsonar.host.url=http://sonar.oldxu.com:9000 \
                    -Dsonar.login=c3696d71e21313a7493a00d817f5b3c5894e3558'
                }
            }
        }
        
        stage('代码编译'){
            steps {
                withSonarQubeEnv('sonarqube-130') {
                    sh 'mvn clean package -Dmaven.test.skip=true'
                }
            }
        }
        stage('是否部署'){
            steps {
                input '是否确认部署'
            }
        }
        stage('代码部署'){
            steps {
                sh 'sh -x /scripts/deploy_java.sh'
            }
        }
    }
    
    post {
        success {
            dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建成功', notifyPeople: ''
            
        }
    
        failure {
            dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建失败', notifyPeople: ''
        }
    }
}

4.pipeline 构建html项目时调用的部署脚本如下:

[root@jenkins ~]# cat /scripts/pipeline_java_deploy.sh
[root@bgx scripts]# cat deploy_java.sh
#!/usr/bin/bash

Date=$(date +%F-%H-%M)
Web_Dir=/opt
Pkg_Name=ROOT_${Date}
Web_Server="172.16.1.7 172.16.1.8"

tar_code () {
  #1.进入到代码的目录下($WORKSPACE)
  cd $WORKSPACE
}

scp_code() {
  #3.使用scp将代码包分发至web集群
  #4.通过ssh命令登录web集群主机,执行目录创建,解压,软件连接等操作
  for i in ${Web_Server}
  do
    scp -rp target/*.war root@${i}:${Web_Dir}/${Pkg_Name}.war
    ssh root@${i} "cd ${Web_Dir} && \
                       mkdir ${Pkg_Name} -p && \
                       unzip ${Pkg_Name}.war -d ${Pkg_Name} && \
            rm -f ${Web_Dir}/${Pkg_Name}.war && \
                       rm -f /soft/tomcat/webapps/ROOT && \
                       ln -s ${Web_Dir}/${Pkg_Name} /soft/tomcat/webapps/ROOT && \
                       pkill java && /soft/tomcat/bin/startup.sh"
  done
}

deploy (){
    tar_code
    scp_code
}

    deploy

5.执行构建测试

6.等待执行结果,结果如下

7.检查代码质量检测信息

8.检查项目是否已经部署成功。

5.Jenkins pipeline质量检测

1.pipeline添加检测结果示意图:

2.配置sonarqube web回调接口,将扫描的结果通知Jenkins服务器。
Name: jenkins(不是固定)
URL: http://admin:[email protected]:8080/sonarqube-webhook


3.Jenkins配置pipeline,新增一个阶段,接收sonarqube返回的检查结果,然后就行验证。

#jenkins的sonarqube(如果代码检测不为ok 则停止后续的构建和部署)
        stage('质量检测结果') {
            steps {
                script {
                    timeout(5) { //sonar webhook通知pipeline代码检测结果,未通过pipeline将会fail
                        def qg = waitForQualityGate() 
                            if (qg.status != 'OK') {
                                error "Sonarqube代码检查失败,failure: ${qg.status}"
                        }
                    }
                }
            }
        }

4.模拟ERROR的项目出现

5.如果构建的代码不通过SonarQube,则会拒绝后续的操作。

完整pipeline代码示例

pipeline {
    //agent any
    agent { label 'node1' }

    stages {    //部署任务总合集
        stage('获取代码'){
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '646f0911-1851-4924-aa5d-1e7c2450dfb6', url: '[email protected]:dev/hello-world-war.git']]])
            }
        }
        stage('质量扫描'){
            steps {
                withSonarQubeEnv('sonarqube-130') {
                    sh '/usr/local/sonar-scanner/bin/sonar-scanner \
                    -Dsonar.projectName=${JOB_NAME} \
                    -Dsonar.projectKey=${JOB_NAME} \
                    -Dsonar.sources=. \
                    -Dsonar.host.url=http://sonar.oldxu.com:9000 \
                    -Dsonar.login=c3696d71e21313a7493a00d817f5b3c5894e3558'
                }
            }
        }
        
        stage('检测结果') {
            steps {
                script {
                    timeout(5) { //sonar webhook通知pipeline代码检测结果,未通过pipeline将会fail
                        def qg = waitForQualityGate() 
                            if (qg.status != 'OK') {
                                error "Sonarqube代码检查失败,failure: ${qg.status}"
                        }
                    }
                }
            }
        }
    
        stage('代码编译'){
            steps {
                withSonarQubeEnv('sonarqube-130') {
                    sh 'mvn clean package -Dmaven.test.skip=true'
                }
            }
        }
        stage('是否部署'){
            steps {
                input '是否确认部署'
            }
        }
        stage('代码部署'){
            steps {
                sh 'sh -x /scripts/deploy_java.sh'
            }
        }
    }
    
    post {
        success {
            dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建成功', notifyPeople: ''
            
        }
    
        failure {
            dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建失败', notifyPeople: ''
        }
    }
}

6.Jenkins BlueOcam可视化

Blue Ocean为开发人员提供了更具乐趣的Jenkins使用方式,它是从基础开始构建的,实现了一种全新的、现代风格的用户界面,有助于实现持续交付。

1.Blue Ocean功能
编辑器:用户可通过直观的方式创建pipeline流水线项目。
可视化:对流水线的可视化表示,提高了持续交付过程的清晰度。
可诊断:通过图形快速定位问题,无需持续扫描日志或关注多个屏幕。
仪表盘:用户可以自定义仪表盘,只显示与自身相关的流水线。

2.Blue Ocean安装
1.系统管理--管理插件--可选插件--搜索Blue Ocean:

2.安装成功后,左侧会出现个“Open Blue Ocean”,点进去

3.如果Jenkins成功构建了你的应用程序,Blue Ocean 界面会变成绿色。





猜你喜欢

转载自blog.csdn.net/xiaoleinb/article/details/112719852