2025年12月3日 星期三

[研究]Jenkins 觸發 Fortify SCA (SAST) 25.4 掃描的組態指令效能改善

[研究]Jenkins 觸發 Fortify SCA (SAST) 25.4 掃描的組態指令效能改善

2025-12-03、2025-12-04、2025-12-05修正

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 20.2

********************************************************************************

ChatGPT

【執行Windows批次指令】原來指令

D:\BuildTool\nuget.exe restore .\WebApplication1\WebApplication1.sln

if "%GIT_COMMIT%" NEQ "%version%" (
   sourceanalyzer.exe -b %JOB_NAME% -clean
   sourceanalyzer.exe -b %JOB_NAME% -exclude "**\*.js" -Dcom.fortify.sca.fileextensions.sql=TSQL msbuild /t:rebuild %WORKSPACE%\WebApplication1\WebApplication1.sln
   sourceanalyzer.exe -b %JOB_NAME% -scan -verbose -Xmx14G -format "fpr" -f "%WORKSPACE%\report.fpr"
   ReportGenerator.bat -template %FORTIFY_TEMPLATE% -format "pdf" -f "%WORKSPACE%\report.pdf" -source  "%WORKSPACE%\report.fpr" 
)

說明

D:\BuildTool\nuget.exe restore .\WebApplication1\WebApplication1.sln  

  • 這會完整從 NuGet 官方源或設定的源下載 全部缺失套件,對大型專案或網路慢時會很耗時。
if "%GIT_COMMIT%" NEQ "%version%"  

  • 意義:只有當 Jenkins 的 GIT_COMMIT 與環境變數 version 不同時才執行掃描。
  • 作用:避免重複掃描相同的 commit,提高效率。
  • 優化建議:如果你確定每次掃描都需要,這行可保留;若每次都掃描,這行可以刪除,簡化流程。

sourceanalyzer.exe -b %JOB_NAME% -clean   

  • 意義:清除 Fortify SCA 先前分析中累積的 build 追蹤檔(build session),確保本次掃描乾淨。
  • 耗時:通常不會太久,但對大型專案可能稍慢。
  • 優化建議:
    • 若你的專案檔案改動不大,可以選擇 增量掃描(Incremental Scan),就不必每次都 -clean。
    • 例如保留 build session,下次只分析改動檔案。


sourceanalyzer.exe -b %JOB_NAME% -exclude "**\*.js" -Dcom.fortify.sca.fileextensions.sql=TSQL msbuild /t:rebuild %WORKSPACE%\PMSWeb\PMSWeb.sln

  • 意義:
    • -b %JOB_NAME%:指定 build ID。
    • -exclude "**\*.js":排除所有 JavaScript 檔案(假設不掃描 JS)。
    • -Dcom.fortify.sca.fileextensions.sql=TSQL:設定 SQL 檔案副檔名為 TSQL。
    • 後面接 msbuild /t:rebuild:進行完整重建(rebuild),同時讓 Fortify 收集程式碼資訊。

Translating SQL

  • 耗時:對大型專案,msbuild /t:rebuild 最耗時間。
  • 優化建議:
    • 改成 增量 build,只編譯修改的檔案:


msbuild  /t:build   

    • 使用 Fortify 增量掃描,只分析改動檔案,避免重複掃描:

sourceanalyzer.exe -b %JOB_NAME% -incremental  

  • 確認不必要的檔案(例如大型第三方套件)是否可 -exclude,減少分析量。
  • 若專案有很多未用到的模組,可考慮 分模組掃描(scan per module)。

sourceanalyzer.exe -b %JOB_NAME% -scan -verbose -Xmx14G -format "fpr" -f "%WORKSPACE%\report.fpr"   

  • 意義:
    • -scan:正式執行 SAST 分析。
    • -verbose:輸出詳細訊息(debug 用)。
    • -Xmx14G:Java 最大記憶體 14GB。
    • -format "fpr":輸出 Fortify FPR 檔案。
    • 耗時:這通常是最耗時步驟。
  • 優化建議:
    • 若不需要 verbose 日誌,可移除 -verbose,減少 I/O 開銷。
    • 調整記憶體:確認 14GB 足夠但不要過大,過大可能反而 GC 負擔。
    • 分模組掃描或使用 增量掃描。
    • 排除不必要檔案或資料夾,例如 node_modules、bin/obj。

ReportGenerator.bat -template %FORTIFY_TEMPLATE% -format "pdf" -f "%WORKSPACE%\report.pdf" -source  "%WORKSPACE%\report.fpr" 

  • 意義:
    • 將 FPR 轉成 PDF 報告。
    • -template:指定報告模板。
  • 耗時:通常比掃描快,但大型專案可能也需要幾分鐘。
  • 優化建議:
    • 若 Jenkins pipeline 只是用於後續分析,可考慮先不產生 PDF,或只產生 HTML。
    • 也可以僅生成 PDF 的 subset(重要模組/高風險項目)。

********************************************************************************

綜合結果

date /t
time /t

@REM del /q /f /s "C:\Users\ADMINI~1\AppData\Local\Temp\*.*" 2>nul

D:\BuildTool\nuget.exe restore .\WebApplication1\WebApplication1.sln

date /t
time /t
if "%GIT_COMMIT%" NEQ "%version%" (
    REM 清除舊的 build session (可視需求保留增量掃描)
    sourceanalyzer.exe -b %JOB_NAME% -clean
date /t
time /t
    REM 建置並收集程式碼,排除指定檔案/目錄
sourceanalyzer.exe -b "%JOB_NAME%" ^
 -exclude "**\*.js" ^
 -exclude "**\packages\**" ^
 -exclude "**\bin\**" ^
 -exclude "**\obj\**" ^
 -exclude "**\Asset\**" ^
 -exclude "**\Content\**" ^
 -exclude "**\Scripts\**" ^
 -exclude "**\doc\**" ^
 -exclude "**\docs\**" ^
 -exclude "**\docx\**" ^
 -exclude "**\node_modules\**" ^
 -exclude "**\dist\**" ^
 -exclude "**\build\**" ^
 -exclude "**\*.pdf" ^
 -exclude "**\*.sql" ^
 -exclude "**\*.zip" ^
 -exclude "**\*.ods" ^
 -exclude "**\*.xlsx" ^
 -exclude "**\*.dll" ^
 -exclude "**\*.pdb" ^
 -exclude "**\App_Data\*.mdb" ^
 -exclude "**\App_Data\*.xlsx" ^
 -Dcom.fortify.sca.fileextensions.sql=TSQL ^
msbuild /t:build "%WORKSPACE%\PMSWeb\PMSWeb.sln"

date /t
time /t

    REM 執行掃描,使用增量掃描加速
    sourceanalyzer.exe -b %JOB_NAME% -scan -incremental -Xmx14G -format "fpr" -f "%WORKSPACE%\new.fpr"

date /t
time /t

    REM 產生 PDF 報告
    ReportGenerator.bat -template %FORTIFY_TEMPLATE% -format "pdf" -f "%WORKSPACE%\Assessment_all.pdf" -source "%WORKSPACE%\new.fpr"
)
date /t
time /t

2>nul 會忽略錯誤(像是檔案被鎖定)。

不會列出路徑,不會卡住。

缺點:del 會在遇到被鎖定檔案時仍顯示錯誤訊息,但不會停止。

這比 for /f dir 快得多,因為不需要列舉全部檔案。

注意,所有換行必須加 ^,最後一行的 msbuild 前面不需 ^

注意,

 -exclude "**\Content\**"

 -exclude "**\Scripts\**"

如果是 WebForm,通常沒問題

但如果靠 script bundling 產生 .js / css,有些重要檔案可能被排除。

********************************************************************************

Jenkins 執行到下面這行前,

del /q /f /s "C:\Users\ADMINI~1\AppData\Local\Temp\*.*" 2>nul

會產生 .bat
C:\Users\Administrator\AppData\Local\Temp\jenkinsXXXXXX.bat


del會刪除這些檔案,導致無法執行
  • Jenkins Job 產生的暫存批次檔 (jenkins-xxxxx.bat)
  • Jenkins 用來包裝 script 的 cmd 檔
  • Jenkins 日誌暫存檔
要刪除,在最後一行刪除。

還有,他不會刪除空的子目錄。
CMD 沒有「刪空資料夾」的遞迴命令。
rd /s 會刪掉裡面的檔案。
rd /q 只能刪單個資料夾,無法遞迴。


(完)

相關

沒有留言:

張貼留言