// 编译构建代码
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的分享说明。