9.3.4 代码质量检测
一样是三步走,先自动生成代码,再修改gitlab上的Jenkinsfile文件,最后立即构建查看效果。
- 自动生成检测代码质量代码
/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
2、替换gitlab上的代码
通过脚本执行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、立即构建查看效果
9.3.5 制作自定义镜像并发布到harbor仓库
- 制作镜像
- 自动生成构建自定义镜像代码
2、替换gitlab上的代码
通过自定义镜像脚本构建自定义镜像 :
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、立即构建查看效果,并到目标服务器中查看镜像是否构建完成
- 将自定义镜像发布到harbor仓库
- 自动生成发布镜像代码
2、gitlab上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}''' } } } }
3、立即构建查看效果
4、查看harbor上也出现了这个镜像,说明推送成功
9.3.6 通知目标服务器执行Groovy脚本文件
- Jenkins自动生成通知代码
由于groovy脚本文件中有$1-$5的5个变量,所以需要进行赋值,前几个参数在Jenkinsfile文件中已经给了变量,第五个port需要指定,这里在Git参数中增加
①增加2个Git参数,方便引用——container_port & host_port
②自动生成代码
deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_port
2、gitlab替换代码
// 所有脚本命令包含在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:由于采用变量,记得使用双引号
- 立即构建查看效果
- 再在目标服务器中使用docker ps查看容器运行状态
9.4 Jenkins流水线整合钉钉
通过上述操作,Jenkins将从gitlab上拉取的代码打包、构建,做质量检测,再制作成自定义镜像推送到harbor仓库,再通知目标服务器从harbor仓库拉取镜像执行Groovy脚本文件,最后再由Jenkins通过钉钉或者企业微信通知项目组成员结果。
在程序部署成功后,可以通过钉钉的机器人及时向群众发送部署的最终结果通知
1、安装插件
2、钉钉内部创建群组并构建机器人
先创建一个dingding群,然后添加机器人
https://oapi.dingtalk.com/robot/send?access_token=6e0a83d43a65b925cf9ece0e242944f5de1c40fd04143e03dcb850557f378cde
3、Jenkins系统配置添加钉钉通知
系统配置中,最下方选择钉钉
添加一个机器人,配置信息
4、gitlab中Jenkinsfile文件中追加流水线配置
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、立即构建查看钉钉效果