[研究]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 收集程式碼資訊。
- 耗時:對大型專案,msbuild /t:rebuild 最耗時間。
- 優化建議:
- 改成 增量 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% -cleandate /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 |
C:\Users\Administrator\AppData\Local\Temp\jenkinsXXXXXX.bat |
- Jenkins Job 產生的暫存批次檔 (jenkins-xxxxx.bat)
- Jenkins 用來包裝 script 的 cmd 檔
- Jenkins 日誌暫存檔
相關
沒有留言:
張貼留言