歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐干貨哦~
介紹
代碼質量是特定代碼片段的有用性和可維護性的近似值。質量代碼將使維護和擴展應用程序的任務變得更加容易。它有助於確保在將來進行必要的更改時引入更少的漏洞。
SonarQube是一個開源工具,可以幫助進行代碼質量分析和報告。它會掃描用戶的源代碼,查找潛在的錯誤,漏洞和可維護性問題,然后在報告中顯示結果,方便用戶識別應用程序中的潛在問題。
SonarQube工具包含兩個子應用程序:分析引擎,它安裝在開發人員的機器上,以及一個用於記錄保存和報告的集中式服務器。單個SonarQube服務器實例可以支持多個掃描程序,使用戶可以統一集中來自許多開發人員的代碼質量報告。
在本教程中,用戶通過配置SonarQube服務器和掃描程序來分析並創建代碼及質量報告。之后可以使用SonarQube工具掃描機器,對用戶的機器進行測試。
准備
在開始閱讀本教程之前,你需要遵循以下內容:
- 一台已經設置好可以使用
sudo
命令的非root賬號、內存為2GB或更多的UGBntu 16.04服務器,並且已開啟防火牆。沒有服務器的同學可以在這里購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝后在購買服務器。 - 在服務器上安裝Oracle Java 8,您可以參考 如何在Ubuntu 18.04上安裝Java。
- 對Nginx和MySQL進行配置,您可以參考在CVM上搭建網頁服務器(LNMP)。
- 給Nginx 配置SSL證書,您可以參考如何在Ubuntu上使用SSL來保護Nginx 。
- 當用戶安裝SonarQube的服務器時,會有一個完全限定的域名和一個A記錄。我們將在本教程中使用
sonarqube.example.com
。
第一步 - 准備安裝
在安裝SonarQube之前,我們需要執行幾個步驟。由於SonarQube是一個將作為服務運行的Java應用程序,並且因為以root用戶身份運行服務肯定不理想,我們將專門創建另一個系統用戶來運行SonarQube服務。然后我們將創建安裝目錄並設置其權限並為SonarQube創建一個MySQL數據庫和用戶。
首先,創建一個sonarqube用戶:
$ sudo adduser --system --no-create-home --group --disabled-login sonarqube
我們只會使用此用戶來運行SonarQube服務,因此我們創建了一個無法直接登錄服務器的系統用戶。
接下來,創建保存SonarQube文件的目錄:
$ sudo mkdir /opt/sonarqube
創建目錄后,更新權限,以便用戶能夠讀取和寫入此目錄中的文件:
$ sudo chown -R sonarqube:sonarqube /opt/sonarqube
SonarQube版本以壓縮格式打包,因此unzip
會使用用戶的軟件包管理器安裝該實用程序,以便用戶可以提取分發文件:
$ sudo apt-get install unzip
接下來,我們需要創建為SonarQube使用的數據庫和憑據。作為root用戶登錄MySQL服務器:
$ mysql -u root -p
創建SonarQube數據庫:
mysql> CREATE DATABASE sonarqube;
mysql> EXIT;
創建SonarQube用於訪問數據庫的憑據。
mysql> CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';
mysql> GRANT ALL ON sonarqube.* to sonarqube@'localhost';
授予權限,以便新創建的用戶可以更改SonarQube數據庫:
mysql> GRANT ALL ON sonarqube.* to sonarqube@'localhost';
然后更改應用權限並退出MySQL控制台:
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
當我們已經有了用戶和目錄,即可下載並安裝SonarQube。
第二步 - 下載和安裝SonarQube
首先將當前工作目錄更改為SonarQube安裝目錄:
$ cd /opt/sonarqube
然后,轉到SonarQube下載頁面並獲取SonarQube 7.0的下載鏈接。SonarQube有兩個版本可以在頁面上下載,但在這個特定的教程中我們將使用SonarQube 7.0。
獲取鏈接后,下載文件:
$ sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip
然后解壓縮文件:
$ sudo unzip sonarqube-7.0.zip
文件解壓縮后,刪除下載的zip文件,因為你不再需要它:
$ sudo rm sonarqube-7.0.zip
當所有文件都已到位,即可配置SonarQube。
第三步 - 配置SonarQube服務器
我們需要在SonarQube配置文件中編輯一些內容。即:
- 我們需要指定SonarQube服務器用戶名和密碼用於數據庫連接。
- 我們還需要告訴SonarQube將MySQL用於我們的后端數據庫。
- 我們將告訴SonarQube以服務器模式運行以提高性能。
- 我們還會告訴SonarQube只監聽本地網絡地址,因為我們將使用反向代理。
首先打開SonarQube配置文件:
$ sudo nano sonarqube-7.0/conf/sonar.properties
將SonarQube用於訪問數據庫的用戶名和密碼更改為用戶在MySQL創建的用戶名和密碼:
...
sonar.jdbc.username=sonarqube
sonar.jdbc.password=some_secure_password
...
然后,告訴SonarQube使用MySQL作為數據庫驅動程序:
...
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
...
最后,告訴SonarQube以服務器模式運行,只收聽本地地址:
...
sonar.web.host=127.0.0.1
sonar.web.javaAdditionalOpts=-server
更新這些字段后,保存並關閉該文件。
接下來,我們將SonarQube服務器配置為作為服務運行,以便在服務器重新啟動時自動啟動。
創建服務文件:
$ sudo nano /etc/systemd/system/sonarqube.service
將以下內容添加到文件中,該文件指定SonarQube服務應如何啟動和停止:
[Unit]
Description=SonarQube service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh stop
User=sonarqube
Group=sonarqube
Restart=always
[Install]
WantedBy=multi-user.target
關閉並保存文件,然后啟動SonarQube服務:
$ sudo service sonarqube start
檢查SonarQube服務的狀態以確保它已啟動並按預期運行:
$ service sonarqube status
如果服務已成功啟動,你將會看到一條與此類似的“Active”行:
● sonarqube.service - SonarQube service
Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset
Active: active (running) since Sun 2018-03-04 01:29:44 UTC; 1 months 14 days
接下來,將SonarQube服務配置為在引導時自動啟動:
$ sudo systemctl enable sonarqube
與大多數其他Java應用程序一樣,SonarQube將需要一些時間來初始化。初始化過程完成后,您就可以繼續下一步了。
第四步 - 配置反向代理
我們已經運行了SonarQube服務器,現在是時候配置Nginx了,它將是我們的SonarQube實例的反向代理和HTTPS終結器。
首先為站點創建一個新的Nginx配置文件:
$ sudo nano /etc/nginx/sites-enabled/sonarqube
添加此配置,以便Nginx能夠將傳入流量路由到SonarQube:
server {
listen 80;
server_name sonarqube.example.com;
location / {
proxy_pass http://127.0.0.1:9000;
}
}
保存並關閉文件。
接下來,確保你的配置文件沒有任何的語法錯誤:
$ sudo nginx -t
如果看到錯誤,修復它們並輸入sudo nginx -t
命令再次運行。一旦沒有錯誤,重啟Nginx:
$ sudo service nginx restart
要進行快速測試,可以在瀏覽器中訪問http://sonarqube.example.com
。打開后你將看到SonarQube界面的歡迎語。
現在我們已經完成了設置反向代理,我們可以繼續保護我們的SonarQube服務器。
第五步 - 保護SonarQube
SonarQube附帶了一個默認的管理員用戶名和密碼管理員。此默認密碼不安全,因此我們希望將其更新為更安全的安全做法。
首先訪問安裝的URL,然后使用默認憑據登錄。
登錄后,單擊“ 管理”選項卡,從下拉列表中選擇“ 安全性 ”,然后選擇“ 用戶”:
在此處,單擊“管理員”帳戶行右側的小齒輪,然后單擊“更改密碼”。務必將密碼更改為易容易記憶但難以猜測的內容。
現在創建一個普通用戶,你可以使用該用戶創建項目並從同一頁面向服務器提交分析結果。單擊頁面右上角的“ 創建用戶” 按鈕:
然后通過單擊“標記”列中的按鈕並為此標記指定名稱,為特定用戶創建標記。稍后在調用代碼掃描程序時需要此令牌,因此請務必將其寫在安全的地方。
最后,你可能會注意到SonarQube實例對全世界都是開放的,任何人都可以查看分析結果和源代碼。 此設置非常不安全,因此我們將SonarQube配置為僅允許登錄用戶訪問界面。在同一管理選項卡中,單擊配置,然后單擊左窗格中的安全性。翻轉此頁面上的開關以要求用戶身份驗證。
現在我們已經完成了服務器的設置,讓我們設置掃描儀。
第六步 - 設置代碼掃描程序
SonarQube的代碼掃描程序是一個單獨的程序包,您可以將其安裝在與運行SonarQube服務器的計算機不同的計算機上,例如本地開發工作站或連續交付服務器。
在本教程中,我們將在托管SonarQube服務器的同一台服務器上安裝代碼掃描程序。
首先為掃描程序創建一個目錄並切換到新目錄:
$ sudo mkdir /opt/sonarscanner
$ cd /opt/sonarscanner
然后使用wget
下載適用於Linux的SonarQube掃描儀:
$ sudo wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip
解壓縮掃描程序,然后刪除zip存檔文件:
$ sudo unzip sonar-scanner-cli-3.0.3.778-linux.zip
$ sudo rm sonar-scanner-cli-3.0.3.778-linux.zip
之后,我們需要修改一些設置以使掃描程序與我們安裝的服務器合作。打開配置文件進行編輯:
$ sudo nano sonar-scanner-3.0.3.778-linux/conf/sonar-scanner.properties
首先,告訴掃描儀應該在哪里提交代碼分析結果。取消注釋開頭的行sonar.host.url
並將其設置為SonarQube服務器的URL:
/opt/sonarscanner/sonar-scanner-3.0.3.778-linux/conf/sonar.properties
sonar.host.url=https://sonarqube.example.com
保存並關閉文件。現在使掃描儀二進制可執行:
$ sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner
然后創建一個符號鏈接,以便用戶可以在不指定路徑的情況下調用掃描程序:
$ sudo ln -s /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner
設置了掃描儀,我們就可以運行第一次代碼掃描了。
第七步 - 運行測試掃描
在主目錄中創建一個新的工作目錄,然后切換到該目錄:
$ cd ~
$ mkdir sonar-test && cd sonar-test
下載示例項目:
$ wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip
解壓縮項目並刪除存檔文件:
$ unzip master.zip
$ rm master.zip
接下來,切換到示例項目目錄:
$ cd sonar-scanning-examples-master/sonarqube-scanner
運行掃描程序,將先前創建的令牌傳遞給它:
$ sonar-scanner -D sonar.login=your_token_here
掃描完成后,您將在控制台上看到類似的內容:
INFO: Task total time: 9.834 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 14.076s
INFO: Final Memory: 47M/112M
INFO: ------------------------------------------------------------------------
示例項目的報告現在將在SonarQube儀表板上,如下所示:
當已確認SonarQube服務器和掃描儀都按預期工作,您就可以讓SonarQube分析您的代碼。
將項目轉移到服務器,或按照第六步中的步驟在工作站上安裝和配置SonarQube掃描儀,並將其配置為指向SonarQube服務器。
然后,在項目的根目錄中,創建一個SonarQube配置文件:
$ nano sonar-project.properties
您將使用此文件向SonarQube介紹有關項目的一些信息:
首先,定義項目密鑰,該項目密鑰是項目的唯一ID。您可以使用任何您喜歡的內容,但此ID對於SonarQube實例必須是唯一的:
sonar-project.properties
# Unique ID for this project
sonar.projectKey=foobar:hello-world
...
然后,指定項目名稱和版本,以便SonarQube能夠在儀表板中顯示此信息:
sonar-project.properties
...
sonar.projectName=Hello World Project
sonar.projectVersion=1.0
...
最后,告訴SonarQube在哪里查找代碼文件。請注意,這與配置文件所在的目錄有關。將其設置為當前目錄:
sonar-project.properties
# Path is relative to the sonar-project.properties file. Replace "" by "/" on Windows.
sonar.sources=.
關閉並保存文件。
您已准備好對自己的代碼運行代碼質量分析。再次運行
sonar-scanner
,傳遞你的令牌:
$ sonar-scanner -D sonar.login=your_token_here
掃描完成后,您將看到與此類似的摘要:
INFO: Task total time: 5.417 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 9.659s
INFO: Final Memory: 39M/112M
INFO: ------------------------------------------------------------------------
項目的代碼質量報告將出現在SonarQube界面上。
結論
在本教程中,您已設置SonarQube服務器和掃描程序以進行代碼質量分析。現在,只需運行掃描,SonarQube將告訴您可能存在的問題確保代碼易於維護!
使用SonarQube維護代碼質量的同時,數據安全也很重要,如果您的服務器是在生產環境使用, 建議您直接使用雲關系型數據庫,雲關系型數據庫讓您在雲中輕松部署、管理和擴展的關系型數據庫,提供安全可靠、伸縮靈活的按需雲數據庫服務。騰訊雲關系型數據庫提供 MySQL、SQL Server、MariaDB、PostgreSQL 數據庫引擎,並針對數據庫引擎的性能進行了優化。雲關系型數據庫是一種高度可用的托管服務,提供容災、備份、恢復、監控、遷移等數據庫運維全套解決方案,可將您從耗時的數據庫管理任務中解放出來,讓您有更多時間專注於您的應用和業務。
更多Linux教程請前往騰訊雲+社區學習更多知識。
問答
MongoDB的利弊?
相關閱讀
Redis雲端架構深入淺出
騰訊雲數據庫回檔解決方案
世界杯黑馬出沒,莫斯科沒有眼淚
雲學院 · 課程推薦 | 騰訊專項技術測試組長,結合8年經驗為你細說冷熱分離法則
此文已由作者授權騰訊雲+社區發布,更多原文請點擊
搜索關注公眾號「雲加社區」,第一時間獲取技術干貨,關注后回復1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社區!