跳到主要內容

[DevOps] Sonarqube程式碼檢測,環境建置

Sonarqube作為程式碼的檢測,與Jenkins可搭配在CI的環境下進行建置時的自動程式碼檢測,在環境的建立上請先安裝:

- 下載安裝 Java : jre-8u251-windows-x64.exe

- 下載安裝 Java 11 : jdk-11.0.7_windows-x64_bin.exe

- 下載安裝 Visual Studio SQL server 2017 or 2019

接著依照下述步驟安裝
- Sonarqube (https://www.sonarqube.org/downloads/)
SonarQube Scanner for MSBuild

環境設定與執行sonarqube參考網址:
       
轉貼內文:

在軟體開發的生命週期中,讓產出的程式碼可以維持著高品質也是非常重要的一件事情,例如在有些公司會透過 Code Review,分析程式碼的品質及找出一些疏失問題,但若要用人工一一找出程式碼的潛在問題或安全性隱憂,實在是太花費時間和功夫了,SonarQube是一套Open Source的程式碼品質分析工具,可幫我們對程式碼的品質做更完整的檢查,並找出一些可能的安全性隱憂。

安裝SonarQube

      我們先到官網下載SonarQube,點擊下方連結前往進行下載。
      並解壓縮到我們指定的目錄


修改設定檔 \conf\sonar.properties

      在解壓縮目錄下的 conf 資料夾我們可以找到 sonar.properties 設定檔,在設定檔內我們要調整
sonar.jdbc.username={資料庫連線使用者名稱}
soanr.jdbc.password={資料庫連線使用者密碼}
sonar.jdbc.url=sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar


設定資料庫

     開啟SQL Serve,建立資料庫sonar,資料庫名稱須與sonar.jdbc.url的databaseName相符合,並且必須設定資料庫定序為Case sensitivity(CS)和Accent sensitivity(AS),如下圖


啟動SonarQube

     打開 Command Line,執行解壓縮目錄下的bin\windows-x86-64\StartSonar.bat,成功後應該可以看到如同下面的畫面
 
設定完成且SonarQube運行成功後(可以透過Browser開啟操作頁面http://localhost:9000/):

     打開瀏覽器,前往 http://localhost:9000,可看到成功啟動SonarQube,如下圖所示,點擊Log in進行登入,帳號:admin,密碼:admin

補充:
- 透過Powershell執行 bin\windows-x86-64\StartSonar.bat

若執行失敗,先確認是 Process[es]有問題還是Process[web]有問題:
app[][o.s.a.SchedulerImpl] Process[es] is up
...
app[][o.s.a.SchedulerImpl] Process [web] is stopped <--有問題
如果是Process[web]有問題,到C:\sonarqube-8.3.1.34397\logs路徑下查看"web.log"

可能的錯誤有以下幾種:

1. Sonarqube預設使用的port被占用
    "Failed to initialize end point associated with ProtocolHandler ["http-nio-0.0.0.0-9000"]
java.net.BindException: Address already in use: bind"

    解決辦法:
        埠9000被其他程式佔用,找到那個程式佔用了這個埠,Console執行 "netstat -aon|findstr "9000" "查看哪個程式占用,關閉程式,重啟startsonar.bat,問題解決。

2. fails with Sonarqube requires JAVA 11+ to run
   解決辦法:
如果確認已安裝Java 11(jdk-11.0.7_windows-x64_bin.exe)

open your wrapper.conf file (C:\SonarQube\conf\wrapper.conf), it has default:
# Path to JVM executable. By default it must be available in PATH.
# Can be an absolute path, for example:
#wrapper.java.command=/path/to/my/jdk/bin/java
wrapper.java.command=java

change it to (i have jdk11, you can adjust it)

# Path to JVM executable. By default it must be available in PATH.
# Can be an absolute path, for example:
#wrapper.java.command=/path/to/my/jdk/bin/java
#wrapper.java.command=java
wrapper.java.command=C:\Program Files\Java\jdk-11.0.7\bin\java

save, run bin\windows-x86-64\StartSonar.bat to start SonarQube

3. fails with connect to database
    "Cannot create PoolableConnectionFactory (連接到主機 localhost,1433 (連接埠 1433) 的 TCP/IP 連接已經失敗。錯誤: "localhost,1433。確認連接屬性。確認 SQL Server 執行個體是否在主機上執行並接受在通訊埠的 TCP/IP 連接。確認防火牆未封鎖通訊埠的 TCP 連接。"。)"

   解決辦法:
        確認C:\sonarqube-8.3.1.34397\conf 下的sonar.properties裡的DB url設定如下:
        sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar
        (不用加1433 port)
        
        The connection string format has changed. No more :1443 or selectMethod

4. fails with connect to database 2
    "The password of the account must be changed."

   解決辦法:
        在建立DB的時候注意將選項設定成不需要改變password at next time。(下圖)

5. fails with connect to database 3
    "Cannot open database "sonar" requested by the login. The login failed."

   解決辦法:
        - 確認C:\sonarqube-8.3.1.34397\conf 下的sonar.properties裡的db帳號密碼和url正確
        sonar.jdbc.username=sonarUser
        sonar.jdbc.password=Sonar_User_12345678
        sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar
        
        - 確認db的sysadmin權限有設定:


四、分析程式碼

下載 SonarQube Scanner for MSBuild

      SonarQube 其實可以分為兩種工具,一種是負責執行程式碼分析的 Runner,每個語言都有自己對應的 SonarQube Runner ,而另外一種則是在透過 Runner 分析之後,我們可以透過 SonarQube 的報表網站,觀看軟體的健康檢查報告,發掘是否有潛藏性的危險。
 
     前項操作即為啟動報表網站,接下來要分析C#程式碼,必須借用SonarQube Scanner for MSBuild
     下載後,解壓縮到我們自己指定目錄


設定Path環境變數

     為了等下方便進行分析,我們在 Path 系統環境變數附加 SonarScanner.MSBuild.exe、MSBuild.exe 的路徑,如下圖所示
     
     開啟Command Line,切換目錄到我們要分析的 C# Project,依序輸入下列指令進行分析
 
     SonarScanner.MSBuild.exe begin /k:"project-key"
     MSBuild.exe /t:Rebuild
     SonarScanner.MSBuild.exe end
 
     上述的project-key是在SonarQube中分析專案的名稱,可設為跟C# Project同一名稱,以方便識別。
 
     回到瀏覽器畫面,可看到分析專案的報告
 
 
     點擊專案名稱連結,檢視專案的各項分析報告
 
 
     可任意點擊連結,查看程式bug或漏洞
 
     點擊檔案連結,可查看原始碼,SonarQube會指出有問題的程式碼在那一行,並提出如何進行改善。
 
     SonarQube分析報告有眾多種類,上述只簡略介紹一、二,讀者有興趣,可實際操作,親自體會。

留言

這個網誌中的熱門文章

[Python] 管理多個執行緒(thread)的運作與結束

在開發應用程式中,幾乎所有的專案都會用到thread,不同的程式語言有不同˙的叫用方法,但都大同小異。Thread的使用上最重要的不是在產生一個thread,而是如何結束一個thread,或是如何結束好幾個threads,以下介紹在Python中如何叫用並管理一或多個thread: 一般來說,create thread如下: def job(): while 1: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start() 這樣可以開始一個thread執行job()中的動作,但若job中的迴圈是如上範例的無限迴圈,必須要加上能讓其退出的機制: stopped = 0 def job(): global stopped while stopped == 0: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start() 這樣在主程序先將stopped設成1,再調用 thread.join() 就可以將thread完整關閉並釋放記憶體空間。 多執行續的處理: 基於這樣的方式,下面是進化版本,創建一個thread專用的class,並同時處理多個thread的執行與結束: class EventHandleThread (threading.Thread): def __init__(self, fun, name): threading.Thread.__init__(self) self.name = name self.fun = fun self.stopped = [0] def run(self): self.fun(self.name, self.stopped) print ("Exiting "

[Python] 將程式設定為全螢幕顯示(full screen)和永遠在最前景、最上層(topmost)

這裡以創建一個tkinter 的 Application物件為例 EX: app = Application() app.master.title("WaferCheckApp") app.master.geometry("1100x720") 將UI顯示在最上層: app.master.attributes('-topmost', True) 將UI以全螢幕顯示: app.master.attributes('-fullscreen', True)

[Python] 以.py檔案產生Windows EXE 執行檔

如何開發能在Windows下執行的Python程式?你當然可以在Windows下安裝Python之後用command line運行你的 .py source code來直接執行程式,但是這方法基本上只適合開發中的程式,或是自己寫好玩只在自己的PC上執行的程式,也許適用。 但若你的需求是要在每個Windows的OS下都可以執行、且是不公開程式碼的,那就必須要將你的 .py source code包裝成EXE執行檔了,下面就介紹如何進行: –下載 auto-py-to-exe-master https://github.com/brentvollebregt/auto-py-to-exe 1. 解壓縮auto-py-to-exe-master.zip到想要的路徑下(路徑不能有空格或".") 2. 開啟Cmd console 到auto-py-to-exe-master路徑下 3. 在console下執行"pip install -r requirements.txt" 4. 在console下執行"python run.py" 運行完畢後就可以選取你要轉成執行檔的 .py 檔案,進行製作。 可參考下面的影片: 產生出來的檔案包含執行檔與其程式中會用到的相關Lib檔案,所以要將整個output資料夾中的檔案一併提取出來 (不要只拿執行檔出來)。 如此你就可以在任意的Windows上執行你的程式了。