jenkins微服务docker部署
import groovy.json.JsonOutput import groovy.json.JsonSlurper import groovy.text.SimpleTemplateEngine import groovy.text.Template import groovy.text.TemplateEngine def gengerateReport(sonarCheckData,outfile,sonarurl){ // turn sonarCheckData to one html def template_text=''' <tr> <td class="tr-title" colspan="7" ><a href="${sonarurl}/dashboard?id=${project_key}">${project_key}</a></td> </tr> <tr> <td></td> <td>阻断</td> <td>严重</td> <td>主要</td> <td>次要</td> <td>提示</td> <td style="font-weight:bold;">总数</td> </tr> <tr> <td>漏洞</td> <td>${vulnerabilitys.BLOCKER}</td> <td>${vulnerabilitys.CRITICAL}</td> <td>${vulnerabilitys.MAJOR}</td> <td>${vulnerabilitys.MINOR}</td> <td>${vulnerabilitys.INFO}</td> <td style="font-weight:bold;">${vulnerabilitys.TOTAL}</td> </tr> <tr> <td>Bugs</td> <td>${bugs.BLOCKER}</td> <td>${bugs.CRITICAL}</td> <td>${bugs.MAJOR}</td> <td>${bugs.MINOR}</td> <td>${bugs.INFO}</td> <td style="font-weight:bold;">${bugs.TOTAL}</td> </tr> <tr> <td>异味</td> <td>${code_smells.BLOCKER}</td> <td>${code_smells.CRITICAL}</td> <td>${code_smells.MAJOR}</td> <td>${code_smells.MINOR}</td> <td>${code_smells.INFO}</td> <td style="font-weight:bold;">${code_smells.TOTAL}</td> </tr> ''' def project_key="" //def sonarurl=env.sonarurl def html_content="" for (md in sonarCheckData.keySet()){ project_key=md // get sonarCheckData to html TemplateEngine engine=new SimpleTemplateEngine() Template template =engine.createTemplate(template_text) def bugs=sonarCheckData[md]["BUG"] def code_smells=sonarCheckData[md]["CODE_SMELL"] def vulnerabilitys=sonarCheckData[md]["VULNERABILITY"] def result=template.make(bugs:bugs,code_smells:code_smells,vulnerabilitys:vulnerabilitys,project_key:project_key,sonarurl:sonarurl) html_content=html_content+result } writeFile encoding: 'UTF-8',file: outfile,text: html_content } def getSonarResult(modules,sonarCheckData,sonarurl,auth){ // def sonarurl="http://192.168.10.234:9000/" def apipath="/api/issues/search?s=FILE_LINE&resolved=false&types={type}&ps=1&facets=severities&componentKeys={pro}" def types=["CODE_SMELL", "BUG", "VULNERABILITY"] for ( ml in modules ){ def sub_map=[:] for (t in types){ def tstr =apipath.replaceAll("\\{type\\}",t).replaceAll("\\{pro\\}",ml) def response=httpRequest authentication: "${auth}", contentType: 'APPLICATION_JSON', customHeaders: [[maskValue: false, name: '', value: '']], responseHandle: 'STRING', timeout: 60, url: sonarurl+tstr def tstr_json=response.getContent() def jsonSlpuer = new JsonSlurper() def tstr_list = jsonSlpuer.parseText(tstr_json) t_total=tstr_list["total"] // println(t_total) //code_smell total def ssub_map=[:] for (i=0;i<5;i++){ def t_val=tstr_list["facets"][0]["values"][i]["val"] def t_val_count=tstr_list["facets"][0]["values"][i]["count"] // println(t_val) //级别 // println(t_val_count) ssub_map[t_val]=t_val_count } ssub_map["TOTAL"]=t_total sub_map[t]=ssub_map // sonarData[ml][t]["TOTAL"]=t_total } sonarCheckData[ml]=sub_map } // println(sonarCheckData) } def sendMail(subject,recipientList,sonarfile){ emailext( body: """ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> \${SCRIPT, template="groovy-html.template"} <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> <table class="section"> <tr class="tr-title"> <td class="td-title" colspan="7">CodeAnalysis(modified modules)</td> \${FILE,path="${sonarfile}"} </tr> </table> </body> </html> """, replyTo: '$DEFAULT_REPLYTO', subject: subject, to: recipientList ) } def getModuels(stage){ def method=["staticCheck","build"] def moduels="" if (stage in method){ datas=readYaml text : params.config datas.each{ if(it.value[stage]==true){ moduels=moduels+it.key+" " } } }else { println(stage+" is not correct param") } if (moduels.trim().isEmpty()){ return "empty" } return moduels } def getDockerDeploy(buildModuels){ //return all moduels and deploy config which need build and deploy to docker // println("func getDockerDeploy ,buildModuels are: "+buildModuels) datas=readYaml text : params.config def dockers="" // buildmoduels=getModuels("build") buildModuels=buildModuels.trim() if(buildModuels=="empty"){ return "empty" } for ( moduel in buildModuels.split(" ") ){ try{ datas.get(moduel).get("delploy") } catch(exc) { println("this moduel "+moduel+" not in param.config, no deploy") continue } for ( dm in datas[moduel]["deploy"]){ if ( dm["machine"]=="docker" ){ li=moduel+","+dm["ip"]+","+dm["user"]+","+dm["startArgs"]?:" " dockers=dockers+li+";" } } } if (dockers.trim().isEmpty()){ return "empty" } return dockers } def getHostDeploy(buildModuels){ // println("func getHostDeploy ,buildModuels are: "+buildModuels) datas=readYaml text : params.config def hostcfgs="" // buildmoduels=getModuels("build") buildModuels=buildModuels.trim() if(buildModuels=="empty"){ return "empty" } for ( moduel in buildModuels.split(" ") ){ try{ datas.get(moduel).get("delploy") } catch(exec) { println("this moduel "+moduel+" not in param.config, no deploy") continue } for ( dm in datas[moduel]["deploy"]){ if ( dm["machine"]=="host" ){ li=moduel+","+dm["ip"]+","+dm["dir"]+","+dm["user"]+","+dm["startArgs"]?:" " hostcfgs=hostcfgs+li+";" } } } if (hostcfgs.trim().isEmpty()){ return "empty" } return hostcfgs } def getGlobalValue(key){ datas=readYaml text : params.config if ( datas.containsKey("global") ){ if ( datas["global"].containsKey(key) ){ return datas["global"][key] } else { error "global does not contain key "+key return "empty" } } else{ error "params does not contain global params" return "empty" } } def getDependModuel(moduel){ def dependm="" if (moduel=="empty"){ return "" } isExist=fileExists 'pom.xml' if ( !isExist ){ error "ERROR: no root pom" } rootpom=readMavenPom file: 'pom.xml' rootmoduels=rootpom.modules if(rootmoduels==[]){ m_moduel=rootpom.artifactId if (moduel == m_moduel){ println("moduel "+moduel+" has no sub moduel") return "" }else { error "moduel "+moduel+" does not exist" return "" } } if ( rootmoduels.contains(moduel) ){ // this indicates the moduel is root's sub moduel moduelpom=readMavenPom file: "${moduel}/pom.xml" }else{ // the moduel is sub sub moduel or the moduel not exisit,get the sub sub dir and pom strs=moduel.split('-') moduelp=strs[0].plus("-").plus(strs[1]) subExisit=fileExists "${moduelp}/${moduel}/pom.xml" if (!subExisit){ error "moduel "+moduel+" does not exist" } moduelpom=readMavenPom file: "${moduelp}/${moduel}/pom.xml" } // get all depend moduels of the moduel,and check if the dependmoduels contain highlander dmall=moduelpom.dependencies if( ! dmall.groupId.contains("cn.com.highlander") ){ // the moduel does not contain highlander dependency,return return "" } // if not return, says the moduel contain highlander dependencies,then find out all for (ds in dmall){ if(ds.groupId=="cn.com.highlander"){ dependm=ds.artifactId+" "+dependm } } return dependm } def getDependModuels(buildModuels){ if (buildModuels=="empty"){ return "" } if (buildModuels=="all"){ return "" } def dependecies="" moduel="" for (moduel in buildModuels.trim().split(" ")){ dependecies=getDependModuel(moduel) // println("moduel "+moduel+" depenecies are: "+dependecies) if (dependecies==""){ continue }else { // get dependecies dependecy dependecies=getDependModuels(dependecies)+" "+dependecies } } // println("moduel: "+moduel+"getDependModuels: "+ dependecies) return dependecies } def uniqueModuels(moduels){ // println("befor unique: "+moduels) if (moduels=="all"){ return "" } def String[] mlist=moduels.split(" ") for ( int i=0 ; i<mlist.size()-1 ;i++){ for ( int j=mlist.size()-1 ; j>i; j-- ) { if ( mlist[j].equals(mlist[i]) ) { mlist[j]=""; } } } def strms=mlist.join(" ") return strms } def getVar(var){ return var } def buildModuels="" pipeline{ agent{ node { label 'master' } } triggers { pollSCM 'H 7 * * *' gitlab(triggerOnPush: true, triggerOnAcceptedMergeRequest: true, triggerOnApprovedMergeRequest: true, branchFilterType: "RegexBasedFilter", sourceBranchRegex: ".*", targetBranchRegex: ".*develop", secretToken: "xxx") } options { timeout(60) timestamps() // buildDiscarder logRotator(daysToKeepStr: '10', numToKeepStr: '10') disableConcurrentBuilds() } parameters { gitParameter branch: '' , branchFilter: '.*', defaultValue: 'origin/develop', description: 'git branch or tag to build', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH_TAG' text name: 'config', defaultValue: '''global: project: xx gitUrl: xxxxx staticCheck: false singleModuel: false archiv: true archivUser: dev archivIP: xxxx archivDir: xxxxx mailTo: xx,xx-xx xx-common-xx: build: true deploy: xx-common-network: build: true deploy: xx-admin-xx: build: true deploy: xx-auth: build: true deploy: - startArgs: CE=dev machine: docker ip: xxxx user: xxxx hscp-user-api: build: false deploy: hscp-user-server: build: false deploy: hscp-gateway: build: true deploy: - startArgs: CE=dev machine: xxxx ip: xxxx user: root hscp-cctv-api: build: true deploy: hscp-cctv-server: build: true deploy: - startArgs: CE=dev machine: docker ip: 1xxxx user: root hscp-monitor: build: false deploy: bigdata-radar: build: false deploy: hscp-echo: build: false deploy: - startArgs: CE=dev machine: docker ip: xxxx user: root hscp-target-api: build: true deploy: hscp-target-server: build: true deploy: - startArgs: CE=dev machine: docker ip: xxxx user: root hscp-graph-cutting-api: build: false deploy: hscp-graph-cutting-server: build: true deploy: - startArgs: CE=dev machine: docker ip: xxxx user: root hscp-xxyy-server: build: false deploy: hscp-fjport-server: build: false deploy: hscp-admin-service: build: true deploy: - startArgs: CE=dev machine: docker ip: xxxx user: root ''', description: 'configuration,do not change the format' } environment { project=getGlobalValue("project") gitUrl=getGlobalValue("gitUrl") staticCheck=getGlobalValue("staticCheck") singleModuel=getGlobalValue("singleModuel") ts=sh(returnStdout: true, script: 'date +%Y%m%d%H%M').trim() archiv=getGlobalValue("archiv") registryIP="xxxx" registryPort="8899" registryUser="xx" registryPwd="xx" registry="xx" maintermail=",xx" mailto=getGlobalValue("mailTo") sonarurl="xxx" // buildModuels=getModuels("build") } tools { maven 'maven3.6.3' } stages{ stage('checkout'){ steps{ script{ def buildCause=currentBuild.getBuildCauses()[0].shortDescription if ( gitUrl=="empty" ){ println("[stage: checkout]>>>global param 'gitUrl' is missing, fail!! ") error '[stage: checkout]>>> gitUrl param missing!!!' } else{ if (buildCause.contains("Started by GitLab ") ){ tbranch="origin/"+env.gitlabTargetBranch checkout([$class: 'GitSCM', branches: [[name: tbranch]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], userRemoteConfigs: [[credentialsId: '97f141ab-1b12-4948-b4b3-dff03cc5e68a', url: env.gitUrl]]]) withCredentials([usernamePassword(credentialsId: 'xxxxxxxxxxxxxxxxxxxx', passwordVariable: 'pwd', usernameVariable: 'user')]) { sh(returnStdout: true,script: "git pull origin ${gitlabTargetBranch}") buildModuels=sh(returnStdout: true,script: "git diff ${gitlabBefore} ${gitlabAfter} --name-only | awk -F'/' '{print \$1}' | sort -u |xargs ").trim() } println("[stage:checkout]>>> git change: "+buildModuels) for ( bm in buildModuels.split(" ")){ if (bm.trim()=="nginx"){ buildModuels=buildModuels.minus(bm) continue } def isRootFile=sh(returnStdout: true, script: "set +x;if [ -f $bm ];then echo true;else echo false;fi").trim() if(isRootFile =="true"){ if(buildModuels.trim()==bm.trim()){ buildModuels="empty" println("gitLab change root file,no moduel file or module deleted ,do not build!!") return }else { buildModuels=buildModuels.minus(bm) continue } } def isExist= fileExists "${bm}/pom.xml" if (!isExist){ println("module ${bm} is deleted or its pom.xml deleted ,no need build") buildModuels=buildModuels.minus(bm.trim()) continue } // def subModule=sh(returnStdout: true, script: "cat ${bm}/pom.xml|grep '<module>' |awk -F'>' {'print \$2'} |awk -F'<' {'print \$1'} |xargs" ).trim() if ( !subModule.trim().isEmpty() ){ buildModuels=buildModuels.replaceAll(bm,subModule) } } } else{ checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], userRemoteConfigs: [[credentialsId: '7xxxxxxa', url: env.gitUrl]]]) be = branch.split("/").join(" ") print(be) sh(returnStdout: true,script: "git pull ${be}") buildModuels=getModuels("build") } } println("checkout:"+buildModuels) } } } stage('build') { environment{ buildModuels="${buildModuels}" } steps { script{ if (buildModuels.trim()=="empty"){ println("[stage: build]>>>no need build moduels") return } sh returnStdout: false, label: 'buidShell', script: ''' set +x #echo ${dependModuels} #check if project has multiple modules if [ ${buildModuels} == "all" ] then mvn clean install -f ./pom.xml exit 0 fi if [ ${singleModuel} != "true" ]; then echo "this is a multiModuels git project" if [ -f pom.xml ]; then mvn clean install -N else echo ">>>!!! ERROR:no parent pom" exit 100; fi for moduel in ${buildModuels} do cd ${WORKSPACE} # check if this moduel is sub moduel.submoduel will cd parent dir,build from parent pom if [ -d ${moduel} ]; then mvn clean install -N mvn -T 2 clean install -pl ./${moduel} -am else moduelDir=`find ./ -path "*${moduel}*" -name pom.xml ` if [ -n "${moduelDir}" ];then cd `dirname ${moduelDir}` cd ../ mvn clean install -N mvn -T 2 clean install -pl ./${moduel} -am else echo "this moduel ${moduel} not exist" exit 100 fi fi done echo "[stage: build]>>>build moduels are: ${buildModuels}" else # this case indicates the project just one module echo "singleModuel git project build" if [ -f pom.xml ];then mvn -f pom.xml clean package -Dmaven.test.skip=true else echo "no pom.xml" exit 102 fi fi ''' } } } stage('staticCheck'){ environment{ buildModuels=getVar(buildModuels) } when { expression { return (env.staticCheck == "true") } } steps{ script{ if(buildModuels=="empty"){ println("[stage: staticCheck]>>>no build moduels, no need staticCheck ") return } withSonarQubeEnv { sh returnStdout: true, script: ''' echo 'check' #buildModuels=`git diff ${gitlabBefore} ${gitlabAfter} --name-only | awk -F'/' '{print \$1}' | sort -u` for moduel in ${buildModuels}; do echo ${moduel} cd ${WORKSPACE} if [ ${singleModuel} != "true" ];then cd `find ./ -name ${moduel} -type d`; fi mPath=$(pwd) if [ -d ${mPath}/src ] then /var/sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner -Dsonar.projectKey=$moduel_BS_${branch} -Dsonar.projectName=$moduel_BS_${branch} -Dsonar.projectVersion=$BUILD_ID -Dsonar.sources=$mPath/src -Dsonar.java.binaries=$mPath/target -Dsonar.projectBaseDir=$WORKSPACE -Dsonar.language=java -Dproject.settings=/var/sonar-scanner-4.0.0.1744-linux/conf/sonar.properties else echo "this moduel ${moduel} has no src, no staticCheck" fi done ''' } def modellist = [] for (m in env.buildModuels.split(" ")){ modellist.add(m) } echo '中文乱码' def sonarCheckData=[:] getSonarResult(modellist,sonarCheckData,env.sonarurl,"sonar") gengerateReport(sonarCheckData,"${WORKSPACE}/sonardata.html",env.sonarurl) sonarfile="./sonardata.html" } } } stage('imageBuild'){ environment{ buildModuels=getVar(buildModuels).trim() dockercfg=getDockerDeploy(buildModuels).trim() } steps { script{ if (buildModuels=="empty"){ println("[stage: imageBuild]>>>no build moduels, skip imageBuild") return } if (dockercfg=="empty"){ println("[stage: imageBuild]>>>no need docker depoys, skip imageBuild") return } sh returnStdout: false, label: 'buildImageShell', script: ''' set +x rm -f dcfgs builtms=" " docker image prune -f --filter "until=48h" echo $dockercfg|awk -F';' '{ for (i=1;i<=NF;i++) print $i }'>>dcfgs cat dcfgs|while read line do if [ -z $line ];then break;fi cd ${WORKSPACE} moduel=`echo $line |awk -F',' '{ print $1 } '` if [[ ${builtms/${moduel}//} != ${builtms} ]] then continue fi ip=`echo $line |awk -F',' '{ print $2 } '` startArgs=`echo $line |awk -F',' '{ print $4 } '` gitTag=`git describe --tags --always` IMAGE_NAME=${registryIP}:${registryPort}/${registry}/${moduel}_${branch}:latest IMAGE_NAME_BAK=${registryIP}:${registryPort}/${registry}/${moduel}_${branch}:${gitTag} if [ ${singleModuel} != "true" ]; then if [ -d ${moduel}/target ];then mtdir="${moduel}/target" cd $mtdir else mtdir=`find ./ -path "*${moduel}/target" -type d` cd $mtdir fi else mtdir="./target" cd $mtdir fi if [ -d ./docker ]; then rm -rf docker;fi mkdir docker artifactId=`ls -lSh ${moduel}*.jar |awk '{ print $NF }'|sed -n '1p'` cp ${artifactId} ./docker if [ -f ../Dockerfile ] then cp ../Dockerfile ./docker else # this moduel has no dockerfile,create one cat > Dockerfile << EOF FROM java:8 VOLUME /tmp WORKDIR /${moduel} ENV startArgs=" -Xms1024m -Xmx4096m " COPY ${artifactId} /${moduel}/${artifactId} ENTRYPOINT java \\${startArgs} -Djava.security.egd=file:/dev/./urandom -jar /${moduel}/${artifactId} EOF cp Dockerfile ./docker fi cd docker docker build -t $IMAGE_NAME . docker build -t $IMAGE_NAME_BAK . # debug comment it if [ -n ${registryUser} ];then docker login -u ${registryUser} -p ${registryPwd} http://${registryIP}:${registryPort} fi docker push $IMAGE_NAME docker push $IMAGE_NAME_BAK builtms="${builtms},${moduel}" #docker rmi $IMAGE_NAME #docker rmi $IMAGE_NAME_BAK done ''' } } } stage('ArchivJar'){ environment{ buildModuels=getVar(buildModuels) archivIP=getGlobalValue("archivIP") archivUser=getGlobalValue("archivUser") archivDir=getGlobalValue("archivDir") gitTag=sh(returnStdout: true, script: 'git describe --tags --always').trim() } when{ expression{ return (env.archiv=="false") } } steps{ script{ if(buildModuels=="empty"){ println("[stage:ArchivJar]>>>no need build moduels,skip ArchivJar") return } sh returnStdout: true, label: 'archivShell', script: ''' set +x ad=${project}_${gitTag}-${ts} archivJars="" if [ -d ${ad} ]; then cd ${ad};rm -f *.jar else mkdir ${ad} fi for moduel in ${buildModuels}; do cd ${WORKSPACE} if [ ${singleModuel} != "true" ]; then targetdir=`find ./ -path "*${moduel}/target" -type d` else targetdir="./target" fi cd $targetdir artifactId=`ls -lSh ${moduel}*.jar |awk '{ print $NF }'|sed -n '1p'`; if [ -n "${artifactId}" ]; then cp ${artifactId} ${WORKSPACE}/${ad} archivJars="${archivJars} ${artifactId}" else echo ">>>!!! no build jar of ${moduel}" exit 1 fi done cd ${WORKSPACE} tar -zcvf ${ad}.tar.gz ./${ad} echo "[stage:archivJar]>>> archiv jars are: " echo ${archivJars} ''' sshPublisher(publishers: [sshPublisherDesc(configName: "${archivUser}@${archivIP}", transfers: [sshTransfer(cleanRemote: false, execCommand: "", execTimeout: 200000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "'${archivDir}/'yyyyMMddHHmmss", remoteDirectorySDF: true, removePrefix: '', sourceFiles: "${project}_${gitTag}-${ts}.tar.gz")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) sh ''' rm -f ${project}_${gitTag}-${ts}.tar.gz ''' } } } stage('deploy'){ environment{ buildModuels=getVar(buildModuels) dockercfg=getDockerDeploy(buildModuels) hostcfg=getHostDeploy(buildModuels) gitTag=sh(returnStdout: true,script: "git describe --tags --always").trim() } parallel { stage('deployDocker'){ // when{ // expression{ // return (env.dockercfg!="empty") // } // } steps{ script{ if(dockercfg=="empty"){ println("[stage:deploy->deployDocker]>>>no need docker deploys moduels,skip deployDocker") return } // deployDocker shell script sh returnStdout: true, label: 'mkdeployDockerscript', script: ''' #deploy to docker set +x rm -f dcfgs echo $dockercfg|awk -F';' '{ for (i=1;i<=NF;i++) print $i }'>>dcfgs cat dcfgs|while read line do if [ -z $line ];then break;fi moduel=`echo $line |awk -F',' '{ print $1 } '` ip=`echo $line |awk -F',' '{ print $2 } '` startArgs=`echo $line |awk -F',' '{ print $4 } '` user=`echo $line |awk -F',' '{ print $3 } '` IMAGE_NAME=${registryIP}:${registryPort}/${registry}/${moduel}_${branch}:latest echo "status=\\`docker inspect --format '{{.Name}} {{.State.Running}}' ${moduel}\\`">dstart${moduel}.sh echo "if [[ \"\\${status}\" =~ \"true\" ]];then docker stop ${moduel};docker rm \\` docker ps -a |grep ${moduel}before* |awk '{ print \\$1}'\\`; docker rename ${moduel} ${moduel}before-${gitTag}-\\`date +%Y%m%d%H%M\\`;fi ">>dstart${moduel}.sh echo "if [[ \"\\${status}\" =~ \"false\" ]];then docker rm \\` docker ps -a |grep ${moduel}before* |awk '{ print \\$1}'\\`; docker rename ${moduel} ${moduel}before-${gitTag}-\\`date +%Y%m%d%H%M\\`;fi ">>dstart${moduel}.sh echo "docker login -u ${registryUser} -p ${registryPwd} http://${registryIP}:${registryPort}">>dstart${moduel}.sh echo "docker pull ${IMAGE_NAME}">>dstart${moduel}.sh echo "usingImage=\\`docker ps -a|grep ${moduel}before* | awk '{print \\$2}' \\`">>dstart${moduel}.sh echo "echo \\$usingImage ">>dstart${moduel}.sh echo "usingImageId=\\` docker images -q --filter reference=\"\\${usingImage}\"\\`">>dstart${moduel}.sh echo "echo \\$usingImageId ">>dstart${moduel}.sh echo "images=\\`docker images |grep ${registryIP}:${registryPort}/${registry}/${moduel}|grep -v \\"\\${usingImageId}\\" | awk '{ print \\$3 }' \\`">>dstart${moduel}.sh echo "if [ -n \\"\\${images}\\" ];then docker rmi \\${images} ;fi">>dstart${moduel}.sh if [ ${startArgs} == "null" ] then echo " docker run --init --cap-add=SYS_PTRACE -v /tmp/logs:/logs --name ${moduel} --network=host -e CE=apo --hostname=\\$(hostname) -d ${IMAGE_NAME}">>dstart${moduel}.sh else if [ ${moduel} == "bigdata-radar" ] then echo " docker run --init --cap-add=SYS_PTRACE --name ${moduel} --network=host -e startArgs=\\"${startArgs}\\" -v /tmp/logs:/logs --hostname=\\$(hostname) -d ${IMAGE_NAME}">>dstart${moduel}.sh else echo " docker run --init --cap-add=SYS_PTRACE --name ${moduel} --network=host -e \\"${startArgs}\\" -v /tmp/logs:/logs --hostname=\\$(hostname) -d ${IMAGE_NAME}">>dstart${moduel}.sh fi fi #echo "docker ps | grep ${IMAGE_NAME}" > dcheck${moduel}.sh #echo "if [ \\$? -eq 0 ];then echo '>>>start success,docker config: ${line}';else echo '>>>!!!start failed ,docker config: ${line}';fi">>dcheck${moduel}.sh done ''' for ( dcfg in dockercfg.trim().split(";") ){ if (dcfg.trim()==""){ continue } def moduel=dcfg.split(",")[0] def ip=dcfg.split(",")[1] def user=dcfg.split(",")[2] sshPublisher(publishers: [sshPublisherDesc(configName: "${user}@${ip}", transfers: [sshTransfer(cleanRemote: false, execCommand: "cd /tmp/deploy/$BUILD_NUMBER;bash dstart${moduel}.sh;", execTimeout: 200000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "/tmp/deploy/$BUILD_NUMBER", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "dstart${moduel}.sh,dcheck${moduel}.sh")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } } } stage('deployHost'){ // when{ // expression{ // return (env.hostcfg!="empty") // } // } steps{ script{ if(hostcfg=="empty"){ println("[stage:deploy->delpoyHost]>>>no need host deploys moduels,skip deployHost") return } if (archiv=="false"){ sh label: 'gatherJar',script: ''' set +x ad=${project}_${gitTag}-${ts} archivJars="" if [ -d ${ad} ]; then cd ${ad};rm -f *.jar else mkdir ${ad} fi for moduel in ${buildModuels}; do cd ${WORKSPACE} if [ ${singleModuel} != "true" ]; then targetdir=`find ./ -path "*${moduel}/target" -type d` else targetdir="./target" fi cd $targetdir artifactId=`ls -lSh ${moduel}*.jar |awk '{ print $NF }'|sed -n '1p'`; if [ -n "${artifactId}" ]; then cp ${artifactId} ${WORKSPACE}/${ad} archivJars="${archivJars} ${artifactId}" else echo ">>>!!! no build jar of ${moduel}" exit 1 fi done ''' } // stop service,and move last jar to bakup sh returnStdout: true, label: 'mkdeployHostscript',script: ''' set +x rm -f hcfgs echo $hostcfg|awk -F';' '{ for (i=1;i<=NF;i++) print $i }'>>hcfgs cat hcfgs|while read line do if [ -z $line ];then break ;fi moduel=`echo $line |awk -F',' '{ print $1 } '` ip=`echo $line |awk -F',' '{ print $2 } '` ddir=`echo $line |awk -F',' '{ print $3 } '` startArgs=`echo $line |awk -F',' '{ print $5 } '` cd ${project}_${gitTag}-${ts} artifactID=`ls ${moduel}*.jar` cd ${WORKSPACE} echo "#!/bin/bash" >bak${moduel}.sh echo "res=\\`ps -ef|grep ${moduel}|grep java|grep -v grep\\`">>bak${moduel}.sh echo \'if [ -n "$res" ] \'>>bak${moduel}.sh echo "then ">>bak${moduel}.sh echo " echo '>>>this service running,kill it'">>bak${moduel}.sh #echo " ps -ef|grep ${moduel}|grep -v grep|awk '{ print $2 }' ${artifactID}">>bak${moduel}.sh echo " ps -ef|grep ${moduel}|grep -v grep|grep -v \\$0 |awk '{ print \\$2 }' |xargs kill -9">>bak${moduel}.sh echo "fi">>bak${moduel}.sh echo "if [ ! -d ${ddir}/${moduel} ];then mkdir -p ${ddir}/${moduel};fi;">>bak${moduel}.sh echo "cd ${ddir}/${moduel}">>bak${moduel}.sh echo "originjar=\\`ls ${moduel}*.jar\\`">>bak${moduel}.sh echo "for ojar in \\${originjar} ;do mv \\${ojar} \\${ojar}.bak\\`date +%Y%m%d%H%M\\`;done">>bak${moduel}.sh echo " cd ${ddir}/${moduel} ;">start${moduel}.sh echo "nohup java ${startArgs} -jar ${artifactID} >/dev/null 2>starterror.log &">>start${moduel}.sh #echo "res=\\`ps -ef|grep ${moduel}|grep java|grep -v grep\\`">check${moduel}.sh #echo "if [ -z \\"\\${res}\\" ];then echo '>>>!!!start failed,please check log,host config: ${line}';cd ${ddir}/${moduel};cat starterror.log;fi">>check${moduel}.sh #echo "if [ -n \\"\\${res}\\" ];then echo '>>>start success,host config: ${line}';fi;">>check${moduel}.sh done ''' for ( hcfg in hostcfg.trim().split(";") ){ def moduel=hcfg.split(",")[0] def ip=hcfg.split(",")[1] def ddir=hcfg.split(",")[2] def user=hcfg.split(",")[3] sshPublisher(publishers: [sshPublisherDesc(configName: "${user}@${ip}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "cd /tmp/deploy/$BUILD_NUMBER; bash bak${moduel}.sh", execTimeout: 300000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "/tmp/deploy/$BUILD_NUMBER", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "start${moduel}.sh,bak${moduel}.sh,check${moduel}.sh")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) sshPublisher(publishers: [sshPublisherDesc(configName: "${user}@${ip}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "cd /tmp/deploy/$BUILD_NUMBER; bash start${moduel}.sh", execTimeout: 300000, flatten: false, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "${ddir}/${moduel}", remoteDirectorySDF: false, removePrefix: "${project}_${gitTag}-${ts}", sourceFiles: "${project}_${gitTag}-${ts}/${moduel}*.jar")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) // sshPublisher(publishers: [sshPublisherDesc(configName: "${user}@${ip}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "cd /tmp/deploy/$BUILD_NUMBER; bash start${moduel}.sh", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } } } } } stage('checkService'){ environment{ buildModuels=getVar(buildModuels) dockercfg=getDockerDeploy(buildModuels) hostcfg=getHostDeploy(buildModuels) gitTag=sh(returnStdout: true,script: "git describe --tags --always").trim() } steps{ script{ if(buildModuels=="empty"||(dockercfg=="empty"&&hostcfg=="empty")){ println("[stage:checkService]>>>no need deploy moduels,skip checkService") return } sh 'sleep 10s' def errorlist=[] def suclist=[] if (hostcfg != "empty"){ for ( hcfg in hostcfg.trim().split(";") ){ // println(hcfg) def moduel=hcfg.split(",")[0] def ip=hcfg.split(",")[1] def ddir=hcfg.split(",")[2] def user=hcfg.split(",")[3] def hresult=sh(returnStatus: true, script:"ssh ${user}@${ip} 'ps -ef|grep ${moduel}|grep java|grep -v grep'") // println("result: "+result) if (hresult!=0){ errorlist.push(hcfg) }else { suclist.push(hcfg) } // sshPublisher(publishers: [sshPublisherDesc(configName: "${user}@${ip}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "cd /tmp/deploy/$BUILD_NUMBER; bash check${moduel}.sh", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } if (dockercfg!="empty"){ for ( dcfg in dockercfg.trim().split(";") ){ if (dcfg.trim()==""){ continue } def moduel=dcfg.split(",")[0] def ip=dcfg.split(",")[1] def user=dcfg.split(",")[2] def result=sh(returnStatus: true, script:"ssh ${user}@${ip} 'docker ps | grep ${registryIP}:${registryPort}/${registry}/${moduel}_${branch}:latest'") if (result!=0){ errorlist.push(dcfg) } else{ suclist.push(dcfg) } // sshPublisher(publishers: [sshPublisherDesc(configName: "${user}@${ip}", transfers: [sshTransfer(cleanRemote: false, execCommand: "cd /tmp/deploy/$BUILD_NUMBER;bash dcheck${moduel}.sh;", execTimeout: 200000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "/tmp/deploy/$BUILD_NUMBER", remoteDirectorySDF: false, removePrefix: '', sourceFiles: "")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } println("[stage:checkService]>>>start success services config : (model,deployIp,[deployDir,]deployUser,startArgs)\n"+suclist.join("\n")) if (errorlist.size()>0){ println "[stage:checkService]>>>start failed services config : (model,deployIp,[deployDir,]deployUser,startArgs)\n"+errorlist.join("\n") error "[stage:checkService]>>>start failed services config : (model,deployIp,[deployDir,]deployUser,startArgs)\n"+errorlist.join("\n") } } } } } post{ success{ sendMail('$DEFAULT_SUBJECT',env.mailto+env.maintermail,'./sonardata.html') } failure{ sendMail('$DEFAULT_SUBJECT',env.mailto+env.maintermail,'./sonardata.html') } } }