jenkins pipeline脚本_Jenkins pipeline脚本编写实践分享(一)下篇

// 编译构建代码

stage('构建') {

steps{

// maven构建

sh "mvn -Dmaven.test.failure.ignore clean install"

}

}

这个步骤就是执行下编译打包,执行maven的命令就行了stage('静态检查') {

steps {

echo "starting codeAnalyze with SonarQube......"

//sonar:sonar.QualityGate should pass

withSonarQubeEnv('Sonar-6.4') {

//固定使用项目根目录${basedir}下的pom.xml进行代码检查

//sh "mvn -f pom.xml clean compile sonar:sonar"

sh "mvn sonar:sonar "+

"-Dsonar.sourceEncoding=UTF-8 "//+

//"-Dsonar.language=java,groovy,xml"+

//"-Dsonar.projectVersion=${v} "+

//"-Dsonar.projectKey=${JOB_NAME} "+

//"-Dsonar.projectName=${JOB_NAME}"

}

script {

// 未通过代码检查,中断

timeout(10) {

//利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail

def qg = waitForQualityGate()

if (qg.status != 'OK') {

error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"

}

}

}

}

}

接下来这步就是执行sonar静态代码检查,sonar是装在另一台服务器上,同样需要再Jenkins上进行配置

需要配置Server authentication token,再sonar配置里获取用户的token值填入Jenkins

顺便设置一下回调

设置完sonar服务器后还需要安装一下sonar scanner,执行扫描是用的scanner,sonarqube server 是用来看结果的

做好上面设置后,这段脚本就可用了,执行sonar检查的命令可以加入一些参数如编码指定是UTF-8;指定扫描的语言JAVA、groovy、xml等等;还有代码的版本;项目名字等等。

然后检测完后会有个报警机制,但代码的质量达不到sonar里设置的要求时会终止本次构建,并会提示。stage('归档') {

steps {

// 归档文件

/*archiveArtifacts artifacts: 'target/*.jar,target/alternateLocation/*.*,'+'target/classes/*.*,target/classes/i18n/*.*,target/classes/rawSQL/*.*,'+'target/classes/rawSQL/mapper/*.*,target/classes/rawSQL/mysql/*.*,'+'target/classes/rawSQL/sqlserver/*.*',fingerprint: true*/

archiveArtifacts params.deployLocation

}

}

接下来这段是一个归档处理,注释掉的这段是一开始的写法,直接把要归档的文件写出来,最后一个参数是将归档文件打印出来,这主要是为了确认文件对不对所以打印出来的,后来就改成通过参数传递,不过原来的写法也留着,是怕自己忘了原始的写法了。

下面的步骤开始就是部署的步骤,稍微解释一下这次部署的设计,代码检查完后,发布到开发环境,之后执行接口测试,接着打标签,之后再是部署到测试环境,同样也需要接口测试,最后发布到生产环境,生产环境有两个,因为是分中英文版的所以分成两个。

现在来看脚本stage('部署到开发环境 ') {

steps {

// 根据param.server分割获取参数,包括IP,jettyPort,username,password

script {

def dev_split=params.dev_server.split(",")

dev_serverIP=dev_split[0]

dev_serverPort=dev_split[1]

dev_serverName=dev_split[2]

dev_serverPasswd=dev_split[3]

}

echo 'Deploying to dev_server'

//清理清理旧程序

sh "/home/jenkins/del_158_client.sh 'bas'"

// 部署到开发环境

sh "scp -r target/*.jar ${dev_serverName}@${dev_serverIP}:/jenkins/datacenter/bas/"

sh "scp -r target/alternateLocation ${dev_serverName}@${dev_serverIP}:/jenkins/datacenter/bas/"

sh "rsync -av target/classes/ --exclude=com ${dev_serverName}@${dev_serverIP}:/jenkins/datacenter/bas/"

// 重启服务

sh "/home/jenkins/kill_158_client.sh bas-job bas"

}

}

这里会先把开发环境的IP,Port,Name,Passwd获取到,然后先将旧版服务关闭,将要部署的jar包、依赖和配置文件发送到开发环境,然后执行启动脚本,这里的脚本就不分享了,都是针对该工程编写的,没有分享意义的。stage('开发环境接口自动化测试') {

agent{

label 'Slave_Linux_69_2'

}

steps{

sh "sleep 60s"

echo "starting interfaceTest......"

/*echo ' 节点是: ${env.NODE_NAME}'

echo ' 节点是: ${env.NODE_LABELS}'

echo '${currentBuild}'

echo '${env}'

echo " 当前BuildId: ${env.BUILD_ID}"*/

dir('/home/jenkins/pm_test')

{

sh '(source /etc/profile;newman -c APD201test_bas.postman_collection.json)'

}

}

}

接着就是针对开发换的接口测试,使用的是postman脚本来测的,最早这些接口脚本都是放在Jenkins服务器上的,后来发现维护起来方便,后面都改成和代码放一起了,便于修改。另外在这里尝试了一下在job中指定其他节点运行这个接口测试的步骤。stage('对当前版本代码打tag') {

steps{

timeout(5) {

script {

input message:' 需要打tag嘛?'

}

}

//sh "echo ${params.repoUrl}"

//sh "echo ${svnversion}"

sh "/home/jenkins/del_crea_tag.sh bas-job ${params.repoUrl} ${svnversion}"

}

}

接着是打标签步骤,这里会请示人工确认的动作,确认之后会执行打标签,shell脚本内容如下:#!/bin/bash

#工程名

pjnm=$1

#代码路径

Url=$2

#版本号

Revision=$3

#获取当前时间

currentdatetime=$(date +%Y%m%d%H%M%S)

#Tag前置路径

svn_tagPrepath="${Url%/*}/tags/"

#Tag目录

tag_dir="${Url##*/}_tags/"

#build目录

tag_bulid="build_$Revision_$currentdatetime/"

echo "代码路径$Url"

echo "版本号$Revision"

echo "Tag前置路径$svn_tagPrepath"

echo "Tag目录$tag_dir"

echo "build目录$tag_bulid"

echo "$svn_tagPrepath$tag_dir$tag_bulid"

svn_tagurl="$svn_tagPrepath$tag_dir$tag_bulid"

echo $svn_tagurl

#保留最新的5个Tag

for i in `svn ls $svn_tagPrepath$tag_dir --username "用户名" --password "密码" --non-interactive|sort|awk '{L[NR]=$0}END{for (i=1;i<=NR-5;i++){print L[i]}}'`

do

svn delete --force $svn_tagPrepath$tag_dir$i -m '$i' --username "用户名" --password "密码" --non-interactive

echo "Delete $i"

done

echo "Delete is complete!"

echo "创建tag下的版本目录"

svn mkdir --parents $svn_tagurl -m "mkdir tags $pjnm-$Revision$currentdatetime" --username "用户名" --password "密码" --non-interactive

echo "打tag到tags $svn_tagurl目录"

svn copy -r $Revision $Url/ $svn_tagurl -m "$pjnm}-$Revision$currentdatetime" --username "用户名" --password "密码" --non-interactive

echo "svn copy -r $Revision $Url/ $svn_tagurl -m "$pjnm-$Revision$currentdatetime" --username "用户名" --password "密码" --non-interactive"

echo "Tag成功!"

这个脚本需要传入工程名和工程SVN路径,每次打标签都会保证只有5个最新的标签存在,不会超过5个。

后面的部署都是一样的方式,就不再重复写的,只写一些不一样。在部署生产环境的时候,因为是两个,所以同时部署用到了parallel 方法,结构如下:stage('部署生产环境') {

parallel {

stage('中文环境') {

steps{

//sh "sleep 60s"

echo "starting Deploy Chinese_Server......"

}

}

stage('英文环境') {

steps{

//sh "sleep 60s"

echo "starting Deploy English_Server......"

}

}

}

}

以上就是这个工程的Jenkinsfile的分享说明。

你可能感兴趣的:(jenkins,pipeline脚本)