CentOS7中使用Jenkins和Sonar

一:環境準備

操作系統: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章