Jenkins+Sonar質量門禁【實踐篇-pipeline版】
一、目標
效果是要實現文章:Jenkins+Sonar質量門禁實踐【https://blog.csdn.net/jiangjunsss/article/details/119918932】里面的接入sonar質量門禁,當掃描不滿足制定的質量閥時就不進行后面的步驟。
文章提到,有兩種方法使得jenkins新建的job使用sonar
-
a. 直接將sonar-project.properties配置內容寫到 Analysis properties 中
-
b. 將配置好的sonar-project.properties文件放置在代碼目錄中,在 Path to project properties 配置相應的文件名
明顯用pipeline方式去實驗質量門禁,需要用第 b 種方法,因為你會發現,新建流水線是沒地方配置Analysis properties 的,而且pipeline代碼里面需要用到waitForQualityGate() 來獲取質量門禁的狀態,也沒地方讓你配置(參數說明,請參考官網jenkins插件:https://www.jenkins.io/doc/pipeline/steps/sonar/)
先上效果圖:
前提:把上一篇文章的helloworld項目放到我自己的gitee里(因為某俊的helloworld我添加不了文件到git上),新建一個sonar-project.properties文件,跟pom.xml同級目錄。在sonar服務端的質量閾中設置質量門禁,並配置好jenkins回調地址
二、注意點
1、git項目上,pom.xml 同級目錄上,要放一個 sonar-project.properties
內容如下:
sonar.login=admin sonar.password=admin # 項目key 保證唯一 sonar.projectKey=ljy # 項目名字 sonar.projectName=helloworld-ljy sonar.projectVersion=1.0 sonar.sources=. sonar.java.binaries=target/classes
然后把參考文章中的流水線代碼拷過來就開始各種報錯了,其中一個是找不到 target/classes 目錄
上篇的maven篇文章,還記得截圖上的maven build么,整合到jenkins發布,是需要加上來的。
完整pipeline代碼先貼上,我再解釋:
pipeline { agent any environment { GIT_URL="https://gitee.com/windysai/helloworld.git" SCANNER_HOME = tool 'SonarQubeScanner' } stages { stage("拉取代碼") { steps{ echo "git pull ${BRANCH} from ${GIT_URL}" git branch: "${BRANCH}", url: "${GIT_URL}" } }
## 要加上去 stage('mvn compile'){ steps { echo "compile code" sh "/usr/local/maven/bin/mvn clean install -e -DskipTests=true -Ptest -f pom.xml" } } stage('靜態代碼靜態掃描'){ steps { withSonarQubeEnv('MyScanner') { sh '''$SCANNER_HOME/bin/sonar-scanner \ -Dsonar.login=admin \ -Dsonar.password=admin ''' } } } stage('檢查結果分析') { steps { script{ timeout(5) { def qg=waitForQualityGate() echo "結果狀態: ${qg.status}" if (qg.status!='OK') error '未達到代碼門禁要求 !' } } } } } }
里面引用到的sonar配置,這篇文章的對應關系,寫的比較詳細:https://igorski.co/sonarqube-scans-using-jenkins-declarative-pipelines/
測試的pipeline代碼中,報錯最多是“ERROR: SonarQube installation defined in this job (sonar_scanner) does not match any configured installation. Number of installations that can be configured: 1.”。原因是sonar scanner工具和sonar server 沒分清楚!一個是jenkins里面的插件工具,用來進行代碼掃描的的,一個是要連接的sonar服務端,用於把掃描的結果詳情存起來的。
看jenkins的控制台輸出會更加理解:
scanner 在全局工具里配置的,名字:SonarQubeScanner, 所以pipeline開始有個環境變量聲明就是它的名字。
MyScanner就是我配置的sonar server
二、遇到的其他一些問題
1、網上找到的配置文檔很多都把jenkins回調接口寫成:http://jenkins所在服務器ip:jenkins監控端口/jenkins/sonarqube-webhook/
但對於docker容器跑的jenkins,實際上是:http://jenkins所在服務器ip:jenkins監控端口/sonarqube-webhook/。
一個簡單測試是在瀏覽器打開回調接口,應該會出現下面的返回截圖。如果沒有配對,waitForQualityGate() 獲取的返回結果一直會是:pending狀態,直到超時退出。
2、參考文檔上的 timeout(5) ,注意括號應該是英文形式;
3、公司的項目后來也測試成功了,需要在maven配置文件:settings.xml 添加公司nexus倉庫地址,因為有些包就是從里面拉的,默認的倉庫會因為拉不到依賴包報錯。
還有一個未解的問題,在sonarqube設置自己新建的質量閾規則時,項目還是沿用默認、內置的規則:Sonar Way,我的testljy規則一直無法生效,后續再研究下
最后感謝一系列給我幫助的文檔(排名不分先后,哈哈哈)