sonarqube6.7安裝及配置
部署:
1.先為sonar建立mysql資料庫
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY '***';
mysql> FLUSH PRIVILEGES;
2.啟動sonarqube服務
3.訪問:#docker run -d --name sonar --restart=always -p 9000:9000 -p 9092:9092 \ -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=**** \ -e SONARQUBE_JDBC_URL=jdbc:mysql://10.103.27.177:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance\ -v /server/sonarqube:/opt/sonarqube sonarqube
IP:9000
4.在maven專案中使用
mvn sonar:sonar \
-Dsonar.host.url=IP:9000 \
-Dsonar.login=b5b3cd724171df9d6fb2efb3f9c5e2d4724789f6
配置:
1.代理
如果本地計算機訪問外網需要代理,sonar更新外掛也需要配置代理,配置方法如下:
進入sonar安裝目錄/conf目錄,開啟sonar.properties配置檔案,找到update center的配置,配置如下
# UPDATE CENTER # Update Center requires an internet connection to request http://update.sonarsource.org # It is enabled by default.將這一項設定成true sonar.updatecenter.activate=true # HTTP proxy (default none)配置代理ip地址和埠 http.proxyHost=172.30.XX.XX http.proxyPort=8080 # NT domain name if NTLM proxy is used #http.auth.ntlm.domain= # SOCKS proxy (default none) #socksProxyHost= #socksProxyPort= # proxy authentication. The 2 following properties are used for HTTP and SOCKS proxies.配置登入計算機的使用者名稱和密碼 http.proxyUser=test http.proxyPassword=test
2.與ldap整合
修改/opt/sonar/config/sonar.propertie檔案,新增如下:
# LDAP configuration
# General Configuration
sonar.security.realm=LDAP
sonar.security.savePassword=true
ldap.url=ldap://IP:389
ldap.bindDn=cn=admin,dc=example,dc=org
ldap.bindPassword=****
# User Configuration
ldap.user.baseDn=ou=People,dc=example,dc=org
#ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.request=(&(objectClass=inetOrgPerson)(cn ={login})) //注意這裡要看自己的ldap中是用的uid還是cn
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail
# Group Configuration
#ldap.group.baseDn=ou=Groups,dc=sonarsource,dc=com
ldap.group.request=(&(objectClass=groupOfNames)(member={dn}))
ldap.group.idAttribute=cn
#sonar.log.level=DEBUG //生產使用的時候註釋掉以免影響效能
參考:https://docs.sonarqube.org/display/PLUG/LDAP+Plugin
3.使用
.設定規則
在系統選單----質量配置中選擇適合自己公司的規則或新建立一套規則(也可以通過拷貝已有的規則)
.設定質量門,如圖
意思是當有阻斷問題的大於0個則報錯,當覆蓋率小於80%則報錯
分析週期開始時,如果只新增或修改很少程式碼,就很難達到期望的程式碼覆蓋或重複級別。為了避免質量閾失效,如果工作量不大時,只有新程式碼超過20行時,才會計算新程式碼重複讀和覆蓋率的質量閾條件。
其中指標引數說明:
可靠性比率的計算方法A = 0 Bug 最高等級A,表示程式碼無bug
B = at least 1 Minor Bug 程式碼只要有一個次要bug,等級就為B
C = at least 1 Major Bug 只要包含一個重要bug,等級將為C
D = at least 1 Critical Bug 只要有一個嚴重bug,等級評估為D
E = at least 1 Blocker Bug 只要有一個最高等級的阻斷級別的bug,可靠性評估為E,最低級別。
A = 0 Vulnerability 沒有漏洞時,專案評估為最高級別A
B = at least 1 Minor Vulnerability 只要包含一個次要漏洞,專案評估為級別B
C = at least 1 Major Vulnerability 只要包含一個重要漏洞,專案評估為級別C
D = at least 1 Critical Vulnerability 只要包含一個嚴重漏洞,評估為D
E = at least 1 Blocker Vulnerability 只要包含一個阻斷漏洞,專案評估為最低級別E
參考:http://www.genshuixue.com/i-cxy/p/15635675
4.與jenkins的pipeline整合
首先需要在jenkins的系統管理中配置sonar server
pipeline {
agent { label 'ci' }
stages {
stage('CheckCode') {
steps {
git branch: '******', credentialsId: '212d9ef0-c9c2-4bec-bc2f-6cb7065ee4b2', url: '[email protected]***.git'
}
}
stage('靜態檢查') {
steps {
echo "starting codeAnalyze with SonarQube......"
//sonar:sonar.QualityGate should pass
withSonarQubeEnv('SonarQube') {
//固定使用專案根目錄${basedir}下的pom.xml進行程式碼檢查
withMaven(jdk: 'jdk1.8', maven: 'mvn') {
sh "mvn -f pom.xml -U clean compile sonar:sonar -Dsonar.branch=$BRANCH
"
}
}
script {
timeout(100) {
//利用sonar webhook功能通知pipeline程式碼檢測結果,未通過質量閾,pipeline將會fail
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "未通過Sonarqube的程式碼質量閾檢查,請及時修改!failure: ${qg.status}"
}
}
}
}
}
}
post {
failure {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '構建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - Failure!'
}
success {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '構建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - Success!'
}
aborted {
emailext body: '${JELLY_SCRIPT,template="static-analysis"}', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '構建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - Aborted!'
}
}
}
5.針對某個分支掃描分析,增量分析,增量報告
mvn -f pom.xml -U clean compile sonar:sonar
-Dsonar.analysis.mode=preview -Dsonar.issuesReport.console.enable=true
-Dsonar.branch=$BRANCH_HOME //經驗證可以實現對分支的掃描分析,結果展示以另外的專案體現在sonar中。
-Dsonar.analysis.mode=preview //在sonar6.7.1+pipelen中分析正常,也確實是增量分析,但驗證質量時報錯。。。。
其實也可以通過設定質量門“新增阻礙問題”來實現針對增量程式碼是否引入了新的阻礙問題,缺點就是也是全量分析(有點小耗時)
參考:http://blog.csdn.net/aixiaoyang168/article/details/77749552
6.配置使用中遇到的問題
i.
原因:因為做了通過nginx轉發,根據提示是資料太大,ng預設檔案上傳大小支援1M;
解決:
。開啟nginx配置檔案 nginx.conf, 路徑一般是:/etc/nginx/nginx.conf;
。在http{}段中加入 client_max_body_size20m; 20m為允許最大上傳的大小(大小可自定義)。
。儲存後重啟nginx,問題解決。
ii.構建完報錯
解決:修改jenkins系統配置中sonar配置,url為http://sonar.abc.cn 注意不要加/
iii.Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (22790518 > 16777216). You can change this value on the server by setting the max_allowed_packet’ variable.
解決:
show variables like '%max_allowed_packet%';
更改mysql 的max_allowed_packet引數,設定 max_allowed_packet = 64M ,然後重啟mysql
[mysqld]
max_allowed_packet=32M
https://dev.mysql.com/doc/refman/5.7/en/packet-too-large.html
注意:有些報錯是可以通過檢視/opt/sonarqube/logs/web.log可以看到的