【devops】九、Jenkins流水线(下)

简介: 【devops】九、Jenkins流水线(下)
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

2950d335cd80408ca435ab9065dc9a4f.png

2、替换gitlab上的代码

881ff62edbca42b1880c649d1b3c1cc5.png

通过脚本执行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'
            }
        }
    }
}


3、立即构建查看效果

ff8d06644103448fbba24225f024d0c0.png

9.3.5 制作自定义镜像并发布到harbor仓库
  • 制作镜像
  1. 自动生成构建自定义镜像代码

3c48328f2f4141468942bd0cbfdfd063.png

2、替换gitlab上的代码

4f04815c22e84da88d5ffcddf3b7feef.png

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

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} .'''
            }
        }
    }
}


3、立即构建查看效果,并到目标服务器中查看镜像是否构建完成

274a8e9fe40442de87fd9d45b3bae3b2.png

23e5cdc0c07243a7a932dbf17663e173.png

  • 将自定义镜像发布到harbor仓库
  1. 自动生成发布镜像代码

70fd346705034e2984a276c4d8933d97.png

2、gitlab上Jenkinsfile文件增加变量,修改发布的代码

235eaf388f5348d6bc4e162947a15ebc.png

// 所有脚本命令包含在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}'''
            }
        }
    }
}

3、立即构建查看效果

55abd90a64654310a51058a3b9a5ccf0.png

4、查看harbor上也出现了这个镜像,说明推送成功

5e8a7dce0ab14395ae77a151d09aaad6.png

9.3.6 通知目标服务器执行Groovy脚本文件
  1. Jenkins自动生成通知代码

由于groovy脚本文件中有$1-$5的5个变量,所以需要进行赋值,前几个参数在Jenkinsfile文件中已经给了变量,第五个port需要指定,这里在Git参数中增加

①增加2个Git参数,方便引用——container_port & host_port

cf929cec20ce43ab95b4c71905783a82.png

②自动生成代码

ba6c597610c649b99864955c3e7359d1.png

381ba584dab34dc68d6e552a534fbf0c.png

deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_port

2、gitlab替换代码

f77934b3b9e7476892bc20d696bbcc5f.png

// 所有脚本命令包含在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. 立即构建查看效果

8bd90953c15940dbb38901ae0d5b2a02.png

  1. 再在目标服务器中使用docker ps查看容器运行状态


9.4 Jenkins流水线整合钉钉

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

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

1、安装插件

f7a17a4953bb41f8b2ea0d3c54a95dcc.png

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

先创建一个dingding群,然后添加机器人

7c83e57aad174cd9ac237ecbb07b1608.png

ffe3be53128e404b8d893d93c125fa89.png

991a973cef4b4440a38730974e97039b.png

7d0e7b6a8d9c42558c8887b1418820e3.png

https://oapi.dingtalk.com/robot/send?access_token=6e0a83d43a65b925cf9ece0e242944f5de1c40fd04143e03dcb850557f378cde

3、Jenkins系统配置添加钉钉通知

系统配置中,最下方选择钉钉

208d966e74bc4be6beaf39d8439ca7d8.png

6327a6813c7d4148884495ee94994511.png

添加一个机器人,配置信息

e40602be437f426da87b5dcac24bf4cb.png

4、gitlab中Jenkinsfile文件中追加流水线配置

097f9db675ce41d7a57422ad74dd0c17.png

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}"]
            )
        }
    }
}


5、立即构建查看钉钉效果

6db946174b86457ab5f34d6ff24c62c1.png

相关文章
|
1月前
|
运维 Devops 持续交付
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第34天】在数字化时代的浪潮中,DevOps成为企业追求敏捷、高效和稳定的关键。本文将通过一个真实案例,展示如何构建一个高效的DevOps流水线,实现从代码提交到部署的全自动化流程。我们将探讨流水线设计的哲学、工具选择以及面临的挑战,并分享实际的代码示例和操作步骤,帮助读者理解自动化运维的精髓。
46 2
|
1月前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
67 2
|
21天前
|
运维 监控 Devops
自动化运维实践:打造高效的DevOps流水线
在软件开发的快节奏中,自动化运维成为提升效率、确保质量的关键。本文将引导你理解自动化运维的价值,通过实际案例分享如何构建一个高效、可靠的DevOps流水线。我们将从持续集成(CI)开始,逐步深入到持续部署(CD),并展示代码示例来具体说明。准备好让你的运维工作飞跃式进步了吗?让我们开始吧!
|
1月前
|
jenkins Devops 测试技术
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第26天】随着DevOps理念的普及,Jenkins作为一款开源自动化服务器,在持续集成(CI)与持续部署(CD)中发挥重要作用。本文通过某中型互联网企业的实际案例,展示了Jenkins如何通过自动化构建、持续集成和持续部署,显著提升开发效率、代码质量和软件交付速度,帮助企业解决传统手工操作带来的低效和错误问题。
79 4
|
2月前
|
运维 监控 Devops
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第6天】 在现代软件开发的快节奏中,自动化运维成为提高效率、保障质量的重要手段。本文将带你了解如何构建高效的DevOps流水线,从持续集成到部署,再到监控和反馈,我们将一步步揭开自动化运维的神秘面纱。你将学习到如何通过代码和工具的结合,实现软件交付过程的自动化,以及如何通过这一流程提升团队的协作和响应速度。让我们开始探索自动化运维的奇妙之旅吧!
|
4月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
101 1
|
3月前
|
运维 Devops jenkins
自动化运维:打造高效DevOps流水线
【8月更文挑战第44天】本文将通过深入浅出的方式,带你构建一个自动化的DevOps流水线,提升开发和部署效率。从基础概念到实际操作,我们一步步剖析如何实现代码提交、自动测试、构建、部署的全过程自动化。你将学会使用Jenkins、Git、Docker等工具,并结合Shell脚本编写,完成一个完整的自动化流程。文章末尾附有完整的示例代码,助你快速上手实践。
|
4月前
|
敏捷开发 缓存 前端开发
阿里云云效产品使用合集之前端打包时npm安装卡住一般是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
敏捷开发 弹性计算 持续交付
阿里云云效产品使用合集之同一个主机部署是否支持下载多个制品
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
敏捷开发 监控 Java
阿里云云效产品使用合集之Codeup WebIDE环境下,如何使用通义灵码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。