一:環境準備
操作系統:Centos 7
Jdk1.8
Git2.9.5
Maven3.6.1
並配置好對應環境變量
二:Jenkins安裝
1.從Jenkins官網下載jenkins.war文件。官網地址:https://jenkins.io/zh/,注意選擇最新版本的Long-Term Support Release版本
2.將war包拷到相應文件夾
3.後臺運行:
nohup java -jar jenkins.war &
三:Jenkins配置和使用
1.登入http://localhost:8080/jenkins,進入Jenkins初始化頁面
如果jenkins報錯:Problem accessing /jenkins/. Reason: HTTP ERROR 404
這是一個Jenkins的Bug。臨時解決方法是:在瀏覽器中手工輸入:http://localhost:8080,不要訪問"/jenkins"這個路徑。
2.安裝默認的插件
3.設置管理員用戶
4.設置成功後即進入Jenkins主界面
5.點擊左上側系統管理,進入Jenkins基本系統設置
6.全局工具配置
6.1 maven
6.2 jdk
6.3 git
Git位置可能是"whereis git"的地址,也可能是"whereis git"的地址 + “/bin/git”,注意此時不報錯就行
6.4 maven安裝
7.插件安裝(有些插件已經內置,所以可以在已安裝裏面搜一下)
【Safe Restart】重啓jenkins系統
【Email Extension】由於Jenkins自帶的郵件功能比較雞肋,因此推薦安裝專門的郵件插件
【maven integration】該插件安裝了,才能創建maven項目
【git plugin】從遠程拉取代碼
【publish over ssh】ssh遠程登錄
【SSH Plugin】或者叫【SSH】SSH登錄到一個遠程服務器以執行必要的腳本
8.全局安全配置
jenkins全局安全設置中取消勾選“防止跨站點請求僞造,不然jenkins會認爲gitlab的請求不合法
9.系統設置
HTML模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>(本郵件由程序自動下發,請勿回覆!)</td>
</tr>
<tr>
<td>
<h2><font color="#FF0000">構建結果 - ${BUILD_STATUS}</font></h2>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">構建信息</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr> SVN_URL
<td>
<ul>
<li>項目名稱:${PROJECT_NAME}</li>
<li>SVN路徑:${SVN_URL}</li>
<li>構建編號:${BUILD_NUMBER}</li>
<li>SVN版本:${SVN_REVISION}</li>
<li>觸發原因:${CAUSE}</li>
<li>構建日誌:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">變更信息:</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>上次構建成功後變化 : ${CHANGES_SINCE_LAST_SUCCESS}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>上次構建不穩定後變化 : ${CHANGES_SINCE_LAST_UNSTABLE}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>變更集:${JELLY_SCRIPT,template="html"}</a></li>
</ul>
</td>
</tr>
<!--
<tr>
<td>
<b><font color="#0B610B">Failed Test Results</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
<br />
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">構建日誌 (最後 100行):</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>-->
<!-- <tr>
<td>Test Logs (if test has ran): <a
href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
<br />
<br />
</td>
</tr> -->
<!--
<tr>
<td>
<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100,escapeHtml=true}</textarea>
</td>
</tr>-->
<hr size="2" width="100%" align="center" />
</table>
</body>
</html>
10.構建任務
10.1 新建item
10.2 配置
URL使用HTTP時會報錯,此時換成SSH方式就能成功
clean install -Dmaven.test,skip=true
10.3 手動構建
四:Sonar的安裝和使用
1.安裝Sonar
1.1 官網https://www.sonarqube.org/downloads/下載
1.2 解壓到特定的文件夾
1.3 創建運行賬戶sonar,並設置賬戶密碼(sonar不能用root啓動)
useradd sonar
passwd sonar
注意將文件夾所有人賦予sonar
chown -R sonar:sonar /sonar-7.7
2.配置數據庫(MySQL)
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'xwj***@Jet';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'xwj***@Jet';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'xwj***@Jet';
FLUSH PRIVILEGES;
3.Sonar配置文件修改(添加數據庫信息)
文件位置爲${SONAR_HOME}/conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=xwj***@Jet
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
sonar.jdbc.driverClassName:com.mysql.jdbc.Driver
4.配置環境變量(vim /etc/profile)
export SONAR_HOME=/usr/local/sonarqube-6.7.5
PATH=$PATH:$SONAR_HOME/bin:$SONAR_RUNNER_HOME/bin
5.啓動(先切換到sonar用戶)
進入到${SONAR_HOME}/bin/linux-x86-64目錄
./sonar.sh start
排錯說明:可以先跟着sonar.log日誌,如果報了es錯誤,可以去查看es.log;如果報了web錯誤,那麼就是查看web.log
在瀏覽器中訪問: http://localhost:9000/ ,運行界面如下代表成功
Sonar默認的端口是”9000”、默認的上下文路徑是”/”、默認的網絡接口是”0.0.0.0”,默認的管理員帳號和密碼爲:admin/admin
6.頁面配置
登陸過後在配置欄裏禁用掉SCM,不禁用的話在執行Sonar Scanner完成後,SonarQube Server還會去訪問SVN項目,再次要求輸入用戶名和密碼,導致掃描任務失敗
7.插件
安裝過後重啓Sonar則可
8.使用Sonar分析Maven工程代碼
8.1 找到maven的安裝目錄,修改setting.xml文件
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
8.2 進入想要測試的maven工程中
8.3 3.執行命令
mvn clean verify sonar:sonar
另一種使用Sonar分析Maven工程代碼的方法
在頁面點擊創建新項目->項目標識->創建令牌->選擇java/maven->生成命令mvn
sonar:sonar \
-Dsonar.projectKey=1111ee \
-Dsonar.host.url=http://192.168.203.241:9000 \
-Dsonar.login=d640239d8e6f90b4ec038f22975fc2bf7329176a
在maven工程中執行上述代碼
五:Jenkins與Sonar集成
1.安裝Jenkins插件
登錄Jenkins→系統設置→插件管理→可選插件→搜索SonarQube
安裝後重啓Jenkins
2.全局配置
3.全局工具配置
這裏可以通過訪問SonarQube Scanner官網進行下載相應Zip包,或者在Jenkins裏進行自動安裝
3.1 使用自己下載的Zip包(本人使用)
3.1.1 訪問Sonar官網下載scanner插件:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
3.1.2 下載以後放到特定文件夾並解壓
3.1.3 配置
3.2 Jenkins自動安裝
4.在Jenkins中使用Sonar
4.1 配置項目
找到Post Steps項
sonar.projectKey=2019-07-23-job //必填,不要和其他sonar項目重名
sonar.projectName=websocket //必填,隨意取
sonar.projectVersion=1.0 //必填,隨意取
sonar.sources=/root/.jenkins/workspace/test5/src/main/java/ //必填 路徑爲項目構建後工程所在目錄
sonar.java.binaries=/root/.jenkins/workspace/test5/target/classes/ //必填 路徑爲項目構建後target/classes所在目錄
sonar.java.libraries=/root/.m2/repository/org/projectlombok/lombok/1.16.18/lombok-1.16.18.jar //可有可無
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=./targe/coverage-reports/jacoco-unit.exec
sonar.dynamicAnalysis=reuseReports
sonar.language=java
sonar.sourceEncoding=UTF-8
4.2 構建
4.3 構建完成
4.4 跳轉查看
五:實踐過程中的坑
1.Jenkins安裝配置問題
1.1 Jenkins安裝在linux服務器上,通過yum安裝的git一般都是1.X低版本的,執行Jenkins時會提示git版本的錯誤。
解決方法:需把通過yum安裝的git卸載掉,重新安裝2.X及以上高版本的git。
1.2 Jenkins構建項目時,會按照maven的setting.xml中配置的把依賴包下載到指定的倉庫中。如果這個時候報關於maven的錯誤,很可能是本地倉庫權限問題,給maven本地倉庫賦予777的權限。
1.3 當git版本,maven配置都沒問題時,用Jenkins構建執行,會報jdk的問題,這是由於jdk版本低引起的,應裝jdk1.8版本及以上。
注:如之前在Jenkins中已經配置了低版本jdk的路徑,而linux服務器中也修改了jdk高版本,這時候會打不開Jenkins頁面。需要做如下操作:一,找到Jenkins中的conf.xml,vi編輯
1.4. jenkins執行shell腳本等場景中遇見的權限不足問題
解決方法:以root用戶運行jenkins中shell命令
以centOS系統爲例,記錄下修改Jenkins以root用戶運行的方法。
修改Jenkins配置文件
打開配置文件
vim /etc/sysconfig/jenkins
修改$JENKINS_USER,並去掉當前行註釋
$JENKINS_USER="root"
修改Jenkins相關文件夾用戶權限
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
重啓Jenkins服務並檢查運行Jenkins的用戶是否已經切換爲root
重啓Jenkins(若是其他方式安裝的jenkins則重啓方式略不同)
service jenkins restart
2.Sonar安裝配置問題
2.1 保證至少3GB可用內存,否則會直接導致啓動失敗
2.2 SonarQube6.6以上版本不能使用root賬號啓動,否則會報錯
解決辦法:新建一個sonar賬號,並用root賬號給sonar賬號賦予權限
2.3 Linux不一樣的用戶啓動,需要刪除目錄下的temp臨時文件夾,不然會報錯
2.4 如果啓動了sonar,但是無法進入平臺,可能是因爲防火牆沒關,這時可以將防火牆關閉並重新載入
注:防火牆的shell命令:
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,沒有此參數重啓後失效)
firewall-cmd --reload 重新載入
firewall-cmd --zone=public --remove-port=80/tcp --permanent 刪除
firewall-cmd --zone=public --query-port=80/tcp 查看
firewall-cmd --state 查看firewall是否運行
firewall-cmd --list-services 查看當前開了哪些端口
firewall-cmd --get-services 查看還有哪些服務可以打開
firewall-cmd --zone=public --list-ports 查看所有打開的端口
2.5 如果Sonar配置好且運行成功,但過一會自動關閉且報出錯誤信息: Process exited with exit value [es]: 137
解決方案:因爲分配內存過低引起,將虛擬機的運行內存提升至3GB或更高則可保證正常運行
3 Jenkins集成Sonar問題
3.1 在Jenkins裏配置SonarQube時,配置裏有自動下載SonarQube Scanner的選項.文件比較大,最好自己下載解壓然後指定對應解壓的位置
3.2 在配置構建項目時,如果項目是第一次構建,則單元測試可能會需要很長時間。如果不需要單元測試,在Build裏添加跳過測試的mvn命令。
3.3 在配置構建項目時,在Post Steps配置sonar信息時,要把SonarQube Scanner掃描路徑填寫正確,否則掃描會失敗並報錯
3.4 如果Jenkins構建成功,但是Sonar掃描失敗,可能是因爲IP地址有變更,但是在Jenkins裏配置的SonarQube Service沒有做更新.
3.5 如果sonar掃描分析過後,頁面上代碼覆蓋率顯示爲0.0%,則可能是掃描配置沒有配置正確,或者pom文件裏jacoco包路徑錯誤,需要重新確認無誤再進行掃描
在pom文件里加入:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.7.201606060606</version>
<configuration>
<!--指定生成 .exec 文件的存放位置-->
<destFile>target/coverage-reports/jacoco-unit.exec</destFile>
<!--Jacoco 是根據 .exec 文件生成最終的報告,所以需指定 .exec 的存放路徑-->
<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
在jenkins的項目配置裏Post Steps裏的Analysis properties添加
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=./targe/coverage-reports/jacoco-unit.exec
sonar.dynamicAnalysis=reuseReports