1. 程式人生 > >Framework專案持續整合(jenkins)及集合SonarQube

Framework專案持續整合(jenkins)及集合SonarQube

[toc] -------------------- # Framework專案持續整合及集合SonarQube - 前言 個人部落格原文地址:[http://book.levy.net.cn/doc/devops/jenkins_sonar.html](http://book.levy.net.cn/doc/devops/jenkins_sonar.html) 本文主要記錄在windows平臺部署 jenkins 服務和 sonar 服務,然後實現持續整合和程式碼質量管理的一套服務。 jenkins是一款開源的提供友好操作介面的持續整合交付工具,主要用於持續構建、測試、釋出軟體專案。且能通過郵件、釘釘等通知最終構建結果,支援常用版本控制工具GIT/SVN。 sonarqube是一款開源的提供友好操作介面的程式碼質量管理工具。通過外掛機制,Sonar 可以整合不同的測試工具,程式碼分析工具,以及持續整合工具。 而兩者結合起來使用,大概步驟就是 程式碼提交 - sonar質量監控 - jenkins整合部署 - 測試 - 生產使用 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101404837-360480059.png) ## CI/CD是什麼 -- jenkins CI的英文名稱是`Continuous Integration`,中文翻譯為:持續整合。 CD可對應多個英文名稱,持續交付`Continuous Delivery`和持續部署`Continuous Deployment` 主要是將程式碼分成幾個環境來管理,如 開發環境 - 測試環境 - 生產環境 ,一般來說,在開發人員程式碼提交後,(儘快的進行程式碼質量檢測 - sonar),馬上使用jenkins進行構建、單元測試。根據測試結果判斷是否釋出測試環境,跑自動化測試流程或者人工測試相關功能,進行迴歸測試,檢查正確性和穩定性等。然後再整合到生產環境 的工作模式。 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101424663-1465336040.png) ## 什麼是sonarqube?什麼是CodeReview? ### 什麼是sonarqube? > Sonar (SonarQube)是一個開源平臺,用於管理原始碼的質量。 Sonar 不只是一個質量資料報告工具,更是程式碼質量管理平臺。支援多種語言的程式碼質量管理與檢測 > > SonarQube®是一種自動程式碼審查工具,用於檢測程式碼中的錯誤,漏洞和程式碼異味。可以與jenkins整合,或手動執行,以便在專案分支和拉取請求之間進行連續的程式碼檢查 > > 檢測結果儲存於資料庫,支援多種資料庫(**新版不再支援mysql**),然後通過UI展示出來結果 ### 什麼是CodeReview?為什麼要這樣做? CodeReview簡單來說就是由有經驗、對業務熟悉的老前輩進行檢查程式碼,檢視程式碼漏洞的的一種流程。從而提高專案健壯性,減少錯誤及使程式碼簡潔易懂。 通常情況下,由於專案開發進度太趕,沒時間進行程式碼審查,從而導致出現一些低階錯誤,這樣會導致使用者體驗很差,進而可能流失客戶。而為了提高開發速度及效率,還要保證程式碼質量,就可以使用sonar來自動檢測,然後檢測完成後在網頁上檢視檢測結果,再進行修復。雖不能從業務上來保證正確性,但能通過這種途徑減少程式碼上的直接錯誤。 # 工具安裝 要使用這一套環境,得先安裝好JDK,本文記錄使用的都是最新版的工具,因此請安裝 JDK 11來保證服務可用。且配置好環境變數。 ## jenkins安裝 可從官網 https://www.jenkins.io/download/ 上下載相應的安裝包,或war包,對應去操作使用,可能下載會比較慢,文末有提供安裝包版本 2.253。 雙擊執行安裝包,**安裝時會讓你進行選擇使用埠號**,安裝完成後,不要著急去訪問服務,先將外掛源給替換掉,以保證光速下載推薦外掛。 ### 更換外掛源 配置地址:C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins.jenkins 我的是這個,提供參考 或者修改 `hudson.model.UpdateCenter` 中的地址 ```text https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json ``` 然後修改**updates 資料夾**中的 `default.json` 檔案 - 替換檔案中所有 http://updates.jenkins-ci.org/download 為 https://mirrors.tuna.tsinghua.edu.cn/jenkins - 替換檔案中所有 https://updates.jenkins.io/download 為 https://mirrors.tuna.tsinghua.edu.cn/jenkins - 替換檔案中所有 http://www.google.com 修改為 http://www.baidu.com **修改後到服務中重啟jenkins服務。 或者`docker restart jenkins` 重新啟動服務** 修改完,有時候會被重置回去,發現下載外掛很慢的時候,就檢查下,重新替換吧 ### jenkins初始化及外掛安裝 這裡就不配圖了,畢竟都是簡單的操作步驟。 1. 開啟 localhost:埠 地址,複製本地地址到位址列獲取密碼並填寫 2. 點選第一個安裝推薦外掛後,開始安裝推薦的外掛。這時候你會感受到光速下載外掛。 3. 安裝完成後,點選繼續,建立一個新的管理員賬戶 4. 點選完成,相當於jenkins服務就安裝完成了。 ### msbuild 和 nuget下載 文末有提供相關工具 msbuild工具,下載地址:https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16 nuget下載地址:https://www.nuget.org/downloads ### 外掛安裝 點選左邊`Manage Jenkins`按鈕,在plugin中安裝如下外掛,除推薦外掛外, * Publish Over SSH * DingTalk * SonarQube Scanner * push over ssh * MSBuild ### 外掛配置 點選左邊`Manage Jenkins`按鈕,點選 `Configure System` 整合sonarqube,配置這裡的token,新增時選`secret text`,需要在下面安裝的sonar服務中獲取,相關截圖如下 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101454486-150469489.png) 釘釘通知的配置 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101503963-1260965603.png) push over ssh的配置,由於windows不支援ssh,可自行安裝相關軟體來支援,這裡使用的是PowerShellServer2020。在文末中有提供 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101514117-104875605.png) **Extended E-mail Notification 郵件通知配置,自行網上查詢jenkins 郵件通知 會有很多的。** **點選左邊`Manage Jenkins`按鈕,點選 `Global Tool Configuration`** 配置好jdk和git,伺服器得準備git環境 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101542651-1131905237.png) 再把framework生成 和 掃描外掛配置好 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101551894-1140027979.png) ## sonarqube安裝 伺服器要求只要要2核4G,不然可能會安裝不成功。 在SonarQube的下載頁面:https://www.sonarqube.org/downloads/,下載需要的版本。下載完成後,解壓後可直接使用,**文末有提供安裝包和相關需要使用到的工具。** 需要使用到的目錄或檔案就是 * bin目錄下 **對應平臺** 的StartSonar.bat * conf,配置檔案 * extensions\jdbc-driver\oracle 用於放置連線資料庫工具 * logs 日誌檔案目錄,錯誤時檢視錯誤的地方 * web UI資料夾目錄 ### 資料庫建立及處理 先在SqlServer資料中新建對應資料庫 Sonar,然後做相應修改 ```sql -- 檢視排序策略 SELECT name, collation_name FROM sys.databases WHERE name = N'Sonar'; -- 更改排序策略 ALTER DATABASE Sonar COLLATE Chinese_PRC_CS_AS ; --***鎖 無法更改 查詢連線使用者 select spid from master.dbo.sysprocesses where dbid=db_id('Sonar') -- 殺死連線程序 kill 53 -- 排序規則必須區分大小寫(CS)和區分重音(AS)。 -- READ_COMMITED_SNAPSHOT 必須在SonarQube資料庫上設定。 SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name='Sonar'; ALTER DATABASE Sonar SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE; ``` -- **開啟了區分大小寫後 注意資料庫名稱等的大小寫** 上面兩個資料庫調整是必須的。 官方文件地址:https://docs.sonarqube.org/latest/setup/install-server/ 再建立相關的使用者,並設定密碼。 ### 需要使用到的外掛準備 當然這裡也需要jdk 11,需要先行安裝。 msbuild掃描外掛下載地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/ Microsoft SQL JDBC驅動程式下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=57782 下載完成後,將下載的exe放到extensions\jdbc-driver\oracle下。 ### 配置檔案更改 conf下的sonar.properties檔案,由於這裡使用的sqlserver,因此這裡是對SqlServer做的調整, ``` # 資料庫 sonar.jdbc.username=sonar sonar.jdbc.password=123456 sonar.jdbc.url=jdbc:sqlserver://IP:埠;databaseName=Sonar # web埠 sonar.web.port=9000 ``` 若系統中有多個jdk版本,則修改wrapper.conf ``` wrapper.java.command=C:\Program Files\Java\jdk-11.0.8\bin\java ``` 然後執行 C:\DevOps\sonarqube-8.4.1.35646\bin\windows-x86-64\StartSonar.bat ,會自動生成資料庫表文件,執行成功後,訪問http://localhost:9000 可在 administration -- Market 然後搜尋Chinese 安裝,安裝完成後需要重啟服務,介面上也會出現重啟按鈕。 需要將這兩個配置開啟 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101628130-461345214.png) ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101621104-642076970.png) # jenkins 整合 sonarqube 在前面的服務啟動後,相關配置配置好,新建專案流程 在jenkins服務中,點選 `new item`,輸入一個專案名字,然後選擇`Freestyle project` 相關操作步驟截圖 專案描述及構建日誌處理 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101736354-654862222.png) 配置git服務,及設定每30分鐘輪詢,當輪詢到有新程式碼提交時就進行構建。 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101745803-483269883.png) 設定構建環境,構建前刪除,和構建日誌輸出時間,及構建時,先進行還原專案 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101754501-347511970.png) 設定構建掃描,和專案構建環境 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101803392-795694930.png) 構建完成後,通過SSH推送到伺服器,推送完成後,會執行 `Exec command`中的命令。可在高階設定中,設定忽略檔案。格式如 `**/Web*.config,**/Release/assets/,images/` ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101818011-2097917882.png) 專案截圖。 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101829866-1433229253.png) 這是掃描一個大專案的結果,有一些問題,專案越大,掃描時間也會越長哦 ![](https://img2020.cnblogs.com/blog/1750888/202008/1750888-20200831101839596-1029281892.png) 特別說明。如果出現構建失敗,提示`msbuild`找不到專案檔案的話,可以嘗試把jenkins的配置檔案`config.xml`中的工作路徑給修改下,把目錄放到外層試試。 我這裡改成了這個,就正常工作了。`` # docker中安裝相關服務 yml 由於本專案是framework,在linux中沒法生成。所以這個就沒做後文了, 拉取相關映象後,在yml所在檔案目錄,執行命令啟動服務 伺服器安裝Docker-Compose太慢,可以通過本地安裝好後,上傳伺服器。 [Docker-Compose簡介安裝使用](https://www.jianshu.com/p/0793f62af9df) ``` version: '3' services: postgres: image: postgres restart: always container_name: postgres ports: - 5432:5432 volumes: - /data/postgres/postgresql/:/var/lib/postgresql - /data/postgres/data/:/var/lib/postgresql/data environment: TZ: Asia/Shanghai POSTGRES_USER: sonar POSTGRES_PASSWORD: sonar POSTGRES_DB: sonar networks: - sonar-network sonar: image: sonarqube restart: always container_name: sonarqube depends_on: - postgres volumes: - /data/sonarqube/extensions:/opt/sonarqube/extensions - /data/sonarqube/logs:/opt/sonarqube/logs - /data/sonarqube/data:/opt/sonarqube/data - /data/sonarqube/conf:/opt/sonarqube/conf ports: - 9000:9000 environment: SONARQUBE.JDBC.USERNAME: sonar SONARQUBE.JDBC.PASSWORD: sonar SONARQUBE.JDBC.URL: jdbc:postgresql://postgres:5432/sonar networks: - sonar-network networks: sonar-network: driver: bridge ``` 配置解釋: version: '3': 表示使用第三代語法來構建 docker-compose.yaml 檔案。 services: 用來表示 compose 需要啟動的服務,上面的配置檔案中服務分別為:sonar、mysql Image:指定下載映象版本 container_name: 指定容器名稱 environment: 此節點下的資訊會當作環境變數傳入容器,例如mysql 服務配置了資料庫、密碼和許可權資訊。 ports: 表示對外開放的埠 volumes: 載入本地目錄下的配置檔案到容器目標地址下 restart: always 表示如果服務啟動不成功會一直嘗試。 depends_on:配置依賴服務,表示需要先啟動 depends_on 下面的服務後,再啟動本服務。 links:與depends_on相對應,depends_on控制啟動順序,links控制容器連線問題。值為"服務名:別名"或者直接使用服務名 command: 執行內部命令 networks:加入指定網路,用同一個網路。 # 相關工具包 連結: https://pan.baidu.com/s/1LAfeYEA5UiOvCQIjdIRXyg 提取碼: sfb2 個人部落格原文地址:[http://book.levy.net.cn/doc/devops/jenkins_sonar.html](http://book.levy.net.cn/doc/devops/jenkins_sona