Jenkins使用pipeline脚本做自动化部署

项目中使用到了Jenkins打包自动发版的功能,经过几天的研究和测试终于解决。

pipeline包含五个步骤,soanr监测如果出现不符合设置的规则,会自动中断,可以在sonar服务器上查看代码的问题。其中是否自动发版还可以根参数进行控制,构建结果如下:

整个创建过程和pipeline脚本如下:

        

  1. 创建任务名称,并选择流水线,点击确认完成任务的创建 
  2.  配置刚创建的任务选项。
    1. 在general中添加对该项目的描述
    2. 勾选 This project is parameterized,并添加两个paramter. 
      1. 名称:autoDeploy,类型:Boolean parameter,如图
      2. 名称:BRANCH,类型:Git parameter,如图:
  3. 跳过构建触发器和高级项目选项,进入到流水线。在该步骤中选择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"
                        '''
                    }
                }
            }
        }
    }
  4. 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"
     
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值