一. Linux服務器搭建sonar
官網下載sonar的zip包
我是mac本地以前下好的,也可以在服務器上從官網直接獲取:
sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip
從本地scp到服務器/home/hehetc/software/sonar目錄下,并解壓到/opt/sonar目錄下:
scp?sonarqube-7.1.zip?hehetc@47.93.250.185:/home/hehetc/software/sonar
要解壓,需下載zip:sudo apt-get install unzip
配置環境變量
把sonar安裝目錄(到/bin)加入環境變量
這里加入hehetc這個用戶的.bashrc
vi ~/.bashrc
最后面加上:
SONAR_HOME=/opt/sonar/sonarqube-7.1
SONAR_SCANNER_HOME=/opt/sonar/sonar-scanner-4.0.0.1744-linux
export PATH=$PATH:$SONAR_HOME/bin:$SONAR_SCANNER_HOME/bin
這里已經把后面sonar-scanner的也加了
改完后source ~/.bashrc
配置sonar的配置文件
配置文件:/opt/sonar/sonarqube-7.1/conf/sonar.properties
主要配置數據庫地址、用戶名、密碼
SonarQube server配置服務
創建一個文件: sudo vi /etc/systemd/system/sonarqube.service
文件內容:
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonar/sonarqube-7.1/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonar/sonarqube-7.1/bin/linux-x86-64/sonar.sh stop
User=sonarqube
Group=sonarqube
Restart=always
[Install]
WantedBy=multi-user.target
作為服務啟動
創建非root系統用戶
Linux系統中創建一個sonarqube用戶,來運行SonarQube services
sudo adduser --system --no-create-home--group --disabled-loginsonarqube
讓新建的sonarqube用戶擁有我們安裝目錄的權限:
sudo chown -Rsonarqube:sonarqube/opt/sonar
mysql中建sonar數據庫
mysql -u root -p
CREATE DATABASE sonarqube;
EXIT;
創建一個mysql用戶,用于sonar來訪問,并賦予sonarqube庫下的權限(可修改數據):
CREATE USER sonarqube@'localhost'IDENTIFIED BY'sonarqube';
GRANT ALL ON sonarqube.* to sonarqube@'localhost';
這里我設置用戶名密碼都是sonarqube
FLUSH PRIVILEGES;
EXIT;
啟動sonar
sudo service sonarqube start
看狀態:service sonarqube status
登陸sonar
http://47.93.250.185:9000/
登陸默認用戶名密碼都是admin
初次登陸:
hehetc:?e1914d433997e40b4d0ebfe0db75f13a622bf6e9
登陸后菜單會多出administration。在market下搜索Chinese Pack安裝中文包。
新建用戶:新建了hehetc用戶密碼yc123456
生成了令牌:hehetc:a5ef52df04c1df7c7b7744ab72bd8e7114cb097c
配置權限:設為必須登陸才能訪問
二. 安裝并運行sonar-scanner
下載解壓
下載安裝包解壓到sonar同一個目錄即可:
hehetc@iZ2zefiv0zhc0j39v6bod6Z:/opt/sonar$ ls
__MACOSX? sonarqube-7.1? sonar-scanner-4.0.0.1744-linux
配置環境變量
見sonar配置環境變量,已配置好
修改配置文件
修改conf/sonar-scanner.properties,配上sonar地址:
cd /opt/sonar/sonar-scanner-4.0.0.1744-linux/conf
sudo vi sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://localhost:9000
#----- Default source code encoding
#sonar.sourceEncoding=UTF-8
這里都在一臺服務器上,localhost即可
sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner
建立命令鏈接
把sonar-scanner安裝目錄下的bin目錄和系統命令bin目錄鏈接起來,以便無前綴隨處都可使用命令
sudo ln -s /opt/sonar/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner/usr/local/bin/sonar-scanner
此時應該可以sonar-scanner –h看到結果了
運行sonar-scanner
在/home/hehetc/sonar-scanner-workspace目錄下新建了這個workspace。在里面下載一個sonar的示例工程:
wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip
解壓:
unzip master.zip
rm master.zip
cdsonar-scanning-examples-master/sonarqube-scanner
命令行直接調用sonar-scanner
運行命令:
sonar-scanner -D
sonar.login=your_token_here (網頁中生成的hehetc的token)
訪問sonar頁面,可看到掃描結果了:
Jenkins中集成sonar
http://www.lxweimin.com/p/b35674bd2fad
Jenkins中下載sonarqube-scanner 插件
Jenkins系統配置:配置sonar服務器
token是提前新建好的訪問sonar的token(在sonar頁面為用戶名生成的)
sonar中的token:
maven配置settings.xml
主要是配置sonar數據庫和服務器地址
進入服務器上maven安裝位置,vi setting.xml
找到服務器maven安裝目錄:mvn –v可以看到
復制setting配置文件到用戶自己目錄下,這樣改了不會影響全局(修改自己的也不要sudo):
cp /usr/share/maven/conf/settings.xml
~/.m2/settings.xml
分別把標黃部分加到對應標簽下(注意看setting文件中是否已經放開了這倆標簽,放開的話,必須放進去,不能直接復制到末尾,否則會重復):
修改maven工程的pom文件
這里我直接到github上meeting-server這個springboot工程的pom文件里修改了:
添加一個sonar依賴,用于下載sonar的maven插件。
jenkins中配置sonar服務器
系統管理-系統設置:
token用在sonar的web頁面中生成的token
建一個jenkins job
構建步驟:調用頂層maven目標
sonar:sonar-Dsonar.java.binaries=target/sonar -Dmaven.test.skip=true
發現報錯:
經查錯,發現是因為sonar web中配置了不允許非登陸訪問。放開之后就好了。
另一種辦法是,在maven的setting文件配置中加上sonar登陸的用戶名密碼:
<sonar.login></sonar.login>,但試了發現不行,沒找到原因。
Jenkins中配置sonar-scanner
目前部門前端掃描才需要sonar-scanner
在系統管理-全局工具配置(注意不在系統配置)
把服務器上裝sonar-scanner的目錄配上:/opt/sonar/sonar-scanner-4.0.0.1744-linux
使用sonar-scanner插件掃描job
創建一個自由風格的項目:配置構建,選sonar scanner插件
其中sonar.projectKey對應工程pom文件里的tool
sonar.projectName是sonar里顯示的名稱,改為了tool-for-show,下面sonar里顯示的就變了。
pipeline job中加sonar
創建一個pipeline job:
腳本:
pipeline1
pipeline{
???agent any
???// tools{
???//???? maven 'maven-3.6.0'
???// }
???stages{
???????stage('Build'){
???????????steps{
?????????????? checkout([$class: 'GitSCM',branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false,extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '22fb3725-0e8c-4619-94d8-2b05a0af0369',url: 'https://github.com/hehetc/meeting-server.git']]])
?????????????? sh ' mvn clean install'
???????????}
???????}
???????stage('SonarCheck'){
???????????steps{
??????????????? sh ' mvnorg.codehaus.mojo:sonar-maven-plugin:3.6.0.1398:sonar-DprojectName="project-name" -U '
???????????}
???????}
}
credentialsId: 填入的是jenkins 系統配置里的github的credentialID
pipeline2:
pipeline{
???agent any
???// tools{
???//???? maven 'maven-3.6.0'
???// }
???stages{
???????stage('Build'){
???????????steps{
?????????????? checkout([$class: 'GitSCM',branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false,extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId:'22fb3725-0e8c-4619-94d8-2b05a0af0369', url:'https://github.com/hehetc/meeting-server.git']]])
?????????????? sh ' mvn clean compile'
???????????}
???????}
???????stage('SonarCheck'){
???????????steps{
??????????????? echo "starting codeAnalyzewith SonarQube......"
??????????????? withSonarQubeEnv('sonarqube7.1'){
??????????????????? sh "mvnsonar:sonar"
??????????????? }
???????????}???????????
???????}
}
withSonarQubeEvn里面填的是jenkins系統配置里sonar服務器名稱,主要用于有多個sonar服務器時指定一個。
看日志每一步做了什么:
maven clean compile:
Building tool 0.0.1-SNAPSHOT
[INFO] Deleting/var/lib/jenkins/workspace/pipeline-sonar/target
[INFO] Compiling 8 source files to/var/lib/jenkins/workspace/pipeline-sonar/target/classes
mvn sonar:sonar
sonar-maven-plugin:3.6.0.1398:sonar
[INFO] Base dir: /var/lib/jenkins/workspace/pipeline-sonar[INFO] Working dir: /var/lib/jenkins/workspace/pipeline-sonar/target/sonar
pipeline3——加入質量門:
pipeline{
???agent any
???// tools{
???//???? maven 'maven-3.6.0'
???// }
???stages{
???????stage('Build'){
???????????steps{
?????????????? checkout([$class: 'GitSCM',branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false,extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId:'22fb3725-0e8c-4619-94d8-2b05a0af0369', url: 'https://github.com/hehetc/meeting-server.git']]])
?????????????? sh ' mvn clean compile'
???????????}
???????}
???????stage('SonarCheck'){
???????????steps{
??????????????? echo "starting codeAnalyzewith SonarQube......"
???????????????withSonarQubeEnv('sonarqube7.1'){
??????????????????? sh "mvnsonar:sonar"
??????????????? }
??????????????? script {
??????????????? timeout(10) {
??????????????????? //利用sonar
webhook功能通知pipeline代碼檢測結果,未通過質量閾,pipeline將會fail
??????????????????? def qg =waitForQualityGate()
???????????????????????if (qg.status != 'OK'){
??????????????????????????? error "未通過Sonarqube的代碼質量閾檢查,請及時修改!failure: ${qg.status}"
??????????????????????? }
??????????????????? }
??????????????? }
???????????}
???????}
??? }
}
目前還沒有配置質量門,所以是通過了的。
在sonar中加入質量門:
此時再運行,報錯質量門未通過:
修改質量門為警告不通過,但還沒達到error,則日志里failure:qg.status顯示為warn。
*47.93.250.185服務器上的jenkins
home:/var/lib/Jenkins
進入home:
job存放位置:/var/lib/jenkins/jobs
每個job一個config.xml對應job的配置
每個job下一個builds文件夾存放構建歷史。
builds下,每次構建一個文件夾:
每此構建下有構建結果
build.xml?changelog.xml? log
構建的工程存放位置:
/var/lib/jenkins/workspace