概述
项目中使用到了Jenkins打包自动发版的功能,经过几天的研究和测试终于解决。
pipeline包含五个步骤,soanr监测如果出现不符合设置的规则,会自动中断,可以在sonar服务器上查看代码的问题。其中是否自动发版还可以根参数进行控制,构建结果如下:
整个创建过程和pipeline脚本如下:
- 创建任务名称,并选择流水线,点击确认完成任务的创建
- 配置刚创建的任务选项。
- 在general中添加对该项目的描述
- 勾选 This project is parameterized,并添加两个paramter.
- 名称:autoDeploy,类型:Boolean parameter,如图
- 名称:BRANCH,类型:Git parameter,如图:
- 跳过构建触发器和高级项目选项,进入到流水线。在该步骤中选择Pipeline script,然后输入一下脚本:
pipeline { environment { // 部署远程主机ip地址,需要通过密钥的方式设置免密登录 remoteIp = "xxx.xxx.xxx.xxx" remoteName = "root" remotePort='22' // dk项目位置(使用/来表示路径) dkManagerPath = "/usr/local/XXproject/" } agent any parameters { booleanParam(name: 'autoDeploy', defaultValue: false, description: '') gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH' } stages { stage('Check out from version control'){ steps { checkout([$class: 'GitSCM', branches: [[name: '$BRANCH']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', depth: 0, noTags: false, reference: '', shallow: false, timeout: 500]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxx', url: 'https://xxxx/xxxxx.git']]]) } } stage('Sonar Scan data-analysis'){ steps { script { env.branch = "${params.BRANCH}".replaceAll("origin/","").replaceAll("/","_") if ( env.branch == 'master' ) { env.projectBranchOpt="" } else { env.projectBranchOpt="-Dsonar.branch.name=$env.branch" } } withSonarQubeEnv('SonarQube'){ sh label: '', script: '/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=XXproject -Dsonar.projectName=XXproject -Dsonar.language=java -Dsonar.sourceEncoding=UTF-8 -Dsonar.sources=dk-manager/src/main/java $projectBranchOpt -Dsonar.java.binaries=. ' } script { timeout(1) { //这里设置超时时间1分钟,不会出现一直卡在检查状态 //利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail def qg = waitForQualityGate('sonar') //注意:这里waitForQualityGate()中的参数也要与之前SonarQube servers中Name的配置相同 if (qg.status != 'OK') { error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}" } } } } } stage('Build'){ steps { dir('XXproject') { echo "Package [XXproject] start ..." sh "mvn clean -s /root/Myapplication/Maven/settings.xml -Dmaven.repo.local=/root/Myapplication/Maven/repository -DskipTests package" echo "Package [XXproject] complete ..." } } } stage("Collect Artifacts") { when { expression { return !params.autoDeploy } } steps { archiveArtifacts allowEmptyArchive: true, fingerprint: true, artifacts: "dk-manager/target/*.jar" } } stage('Deploy') { when { expression { return params.autoDeploy } } steps { withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) { sh ''' echo "开始使用scp传输文件" jarfile1=$(ls XXproject/target/*.jar) jarFileName=${jarfile1##*/} scp -P ${remotePort} "${jarfile1}" ${remoteName}@${remoteIp}:${dkManagerPath} ssh -p ${remotePort} ${remoteName}@${remoteIp} "cd ${dkManagerPath}; sh XXproject.sh & " echo "dk restart successful" ''' } } } } }
- pipeline中调用的shell脚本如下,该脚本需要在项目部署的服务器上创建并修改器权限:chmod 777 xxx.sh
#!/bin/bash jarFileName=project-manager.jar pid=$(ps -ef|grep $jarFileName|grep -v grep|awk '{print $2}') if [ -n "$pid" ] then echo "kill -9 pid" $pid kill -9 $pid echo "dk kill successful" fi nohup java -jar ${jarFileName} >/dev/null 2>&1 & echo "dk restart successful"
最后
以上就是成就康乃馨为你收集整理的Jenkins使用pipeline脚本做自动化部署的全部内容,希望文章能够帮你解决Jenkins使用pipeline脚本做自动化部署所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复