自訂要用於程式碼掃描的語言和組建
CodeQL 程式碼掃描預設支援許多語言,且具有一個自動建置功能。 不過,如果您的程式碼使用非標準的建置流程,您可能需要使用自訂建置步驟來自訂工作流程。
此單元將描述如何變更透過程式碼掃描所分析的語言,以及如何將自訂建置步驟新增至 CodeQL 程式碼掃描工作流程。
變更分析的語言
CodeQL 程式碼掃描會自動偵測以下列支援的語言撰寫的程式碼:C/C++、C#、Go、Java、JavaScript/TypeScript、Python 和 Ruby。
注意
CodeQL 會持續更新其支援的語言和架構,以取得可用語言、變體和編譯程式的完整清單,請參閱檔[7]。
預設 CodeQL 分析工作流程檔案包含稱為「語言」的組建矩陣,其中列出您存放庫中所分析的語言。 當您將程式碼掃描新增至存放庫時,CodeQL 即會自動填入此矩陣。 使用語言矩陣會將 CodeQL 最佳化,以平行方式執行每個分析。 基於平行處理組建的效能優勢,我們建議所有工作流程都採用此設定。
如果您的存放庫包含多種支援語言的程式碼,您可以選擇要分析的語言。 您可能希望阻止對語言進行分析的原因有很多。 例如,專案可能會具有與程式碼主體不同語言的相依性,而且您可能不想看到那些相依性的警示。
如果您的工作流程使用語言矩陣,則會將 CodeQL 硬式編碼為只分析矩陣中的語言。 若要變更您想要分析的語言,請編輯矩陣變數的值。 您可以移除語言以防止對其進行分析,或者您也可以在設定程式碼掃描時新增不存在於存放庫中的語言。 例如,如果存放庫一開始在程式碼掃描設定時只包含 JavaScript,而且您稍後新增了 Python 程式碼,則您必須將 python 新增到矩陣。
jobs:
analyze:
name: Analyze
...
strategy:
fail-fast: false
matrix:
language: ['javascript', 'python']
如果您的工作流程未包含稱為語言的矩陣,則 CodeQL 會設定為循序執行分析。 如果您未在工作流程中指定語言,則 CodeQL 會自動偵測並嘗試分析存放庫中任何支援的語言。 如果您想要在不使用矩陣的情況下選擇要分析的語言,您可以在 init 動作底下使用 languages 參數。
- uses: github/codeql-action/init@v1
with:
languages: cpp, csharp, python
適用於程式碼掃描的自訂建置步驟
針對支援的已編譯語言,您可以使用 CodeQL 分析工作流程中的自動建置動作來建置程式碼。 這避免了必須針對 C/C++、C# 和 Java 指定明確的建置命令。 CodeQL 也會執行 Go 專案的組建來設定專案。 不過,相較於其他已編譯的語言,會擷取存放庫中的所有 Go 檔案,而不只是建置的檔案。 您可以使用自訂建置命令來略過擷取組建未觸及的 Go 檔案。
新增已編譯語言的建置步驟
如果存放庫中的 C/C++、C# 或 Java 程式碼具有非標準的建置流程,autobuild 可能就會失敗。 您必須從工作流程中移除 autobuild 步驟,並手動新增建置步驟。
移除 autobuild 步驟之後,取消註解執行步驟,並新增適合您存放庫的建置命令。 此工作流程執行步驟會使用作業系統的殼層來執行命令列程式。 您可以修改這些命令,並新增更多命令來自訂建置流程。
- run: |
make bootstrap
make release
如果您的存放庫包含多個已編譯的語言,您就能指定語言特有的建置命令。 例如,如果您的存放庫包含 C/C++、C# 及 Java,而 autobuild 會正確建置 C/C++ 和 C#,但無法建置 Java,則您可在 init 步驟之後於工作流程中使用下列設定。 這會指定 Java 的建置步驟,同時仍針對 C/C++ 和 C# 使用 autobuild:
- if: matrix.language == 'cpp' || matrix.language == 'csharp'
name: Autobuild
uses: github/codeql-action/autobuild@v1
- if: matrix.language == 'java'
name: Build Java
run: |
make bootstrap
make release