承接《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個Tagfor 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]}}`dosvn delete --force $svn_tagPrepath$tag_dir$i -m $i --username "用戶名" --password "密碼" --non-interactiveecho "Delete $i"doneecho "Delete is complete!"echo "創建tag下的版本目錄"svn mkdir --parents $svn_tagurl -m "mkdir tags $pjnm-$Revision$currentdatetime" --username "用戶名" --password "密碼" --non-interactiveecho "打tag到tags $svn_tagurl目錄"svn copy -r $Revision $Url/ $svn_tagurl -m "$pjnm}-$Revision$currentdatetime" --username "用戶名" --password "密碼" --non-interactiveecho "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的分享說明。


推薦閱讀:
相关文章