Skip to main content

コンパイル済み言語の CodeQL ワークフローを構成する

GitHub が CodeQL analysis workflow を使用してコンパイル型言語で記述されたコードの脆弱性やエラーをスキャンする方法を設定できます。

Who can use this feature

If you have write permissions to a repository, you can configure code scanning for that repository.

Code scanning is available for all public repositories on GitHub.com. To use code scanning in a private repository owned by an organization, you must have a license for GitHub Advanced Security. 詳細については、「GitHub Advanced Security について」を参照してください。

CodeQL analysis workflow とコンパイル型言語について

GitHub がリポジトリに対して code scanning を実行できるようにするには、GitHub Actions ワークフローをリポジトリに追加します。 CodeQL code scanning の場合、CodeQL analysis workflow. を追加します。 詳細については、「リポジトリの code scanning の設定」を参照してください。

通常、code scanning のデフォルトのワークフローを編集する必要はありません。 ただし、必要な場合にはワークフローを編集して設定の一部をカスタマイズできます。 たとえば、GitHubのCodeQL analysis workflowを編集して、スキャンの頻度、スキャンする言語やディレクトリ、CodeQL code scanningがコード中で探すものを指定できます。 コードのコンパイルに特定のコマンドセットを使っている場合にも、CodeQL analysis workflowを編集する必要があるかもしれません。 code scanning の構成とワークフロー ファイルの編集に関する一般的な情報については、「code scanning を構成する」および「GitHub Actions について学ぶ」をご覧ください。

CodeQL の autobuild について

コードスキャンは、1 つ以上のデータベースに対してクエリを実行することにより機能します。 各データベースには、リポジトリにあるすべてのコードを 1 つの言語で表わしたものが含まれています。 コンパイル型言語の C/C++、C#、および Java では、このデータベースを生成するプロセスに、コードのビルドとデータの抽出が含まれています。 CodeQLは、プロジェクトをセットアップするためにGoのプロジェクトのビルドも実行します。 ただし、他のコンパイル済み言語と対照的に、ビルドされたものだけでなく、リポジトリ内のすべての Go ファイルが抽出されます。 カスタム ビルド コマンドを使用すると、ビルドによって使用されない Go ファイルの抽出をスキップできます。

サポートされているコンパイル言語の場合、CodeQL analysis workflow の autobuild アクションを使用してコードをビルドできます。 これにより、C/C++、C#、Java についての明示的なビルド コマンドを指定する必要がなくなります。

ワークフローで language マトリックスを使っている場合、autobuild はマトリックスに列記された各コンパイル型言語のビルドを試行します。 マトリックスがない場合、autobuild は、サポートされているコンパイル型言語で、リポジトリ内のソース ファイルの数が最も多いもののビルドを試みます。 Go を除いて、明示的にビルドコマンドを使用しない限り、リポジトリにある他のコンパイル型言語の解析は失敗します。

: GitHub Actions にセルフホステッド ランナーを使う場合は、autobuild プロセスを使うために追加のソフトウェアをインストールすることが必要になる場合があります。 さらに、リポジトリに特定のバージョンのビルドツールが必要な場合は、手動でインストールする必要があります。 詳しくは、「GitHub ホステッド ランナーの概要」をご覧ください。

C/C++

サポートされているシステムの種類システム名
オペレーティング システムWindows、macOS、Linux
ビルドシステムWindows: MSbuild スクリプトと build スクリプト
Linux と macOS: Autoconf、Make、CMake、qmake、 Meson、Waf、SCons、Linux Kbuild、build の各スクリプト

autobuild ステップの動作は、抽出を実行するオペレーティング システムによって異なります。 Windows の autobuild ステップでは、以下の方法を使って C/C++ に適したビルド方法の自動検出が試みられます。

  1. ルートに最も近いソリューション (.sln) またはプロジェクト (.vcxproj) ファイルで MSBuild.exe を呼び出します。 autobuild が最上位ディレクトリから同じ (最短) 深度で複数のソリューションまたはプロジェクト ファイルを検出した場合、それらすべてのビルドが試みられます。
  2. ビルド スクリプトのように見えるスクリプト、つまり build.batbuild.cmdbuild.exe を、この順番で呼び出します。

Linux と macOS の autobuild ステップでは、リポジトリ内にあるファイルが確認されて、使われているビルド システムが特定されます。

  1. ルートディレクトリでビルドシステムを探します。
  2. 何も見つからない場合は、C/C++ のビルドシステムで一意のディレクトリをサブディレクトリで検索します。
  3. 適切なコマンドを実行してシステムを設定します。

C#

サポートされているシステムの種類システム名
オペレーティング システムWindows と Linux
ビルドシステム.NET と MSbuild、およびビルドスクリプト

autobuild プロセスは、次の方法を使って C# に適したビルド方法の自動検出を試みます。

  1. ルートに最も近いソリューション (.sln) またはプロジェクト (.csproj) ファイルで dotnet build を呼び出します。
  2. ルートに最も近いソリューションまたはプロジェクト ファイルで、MSbuild (Linux) または MSBuild.exe (Windows) を呼び出します。 autobuild が最上位ディレクトリから同じ (最短) 深度で複数のソリューションまたはプロジェクト ファイルを検出した場合、それらすべてのビルドが試みられます。
  3. ビルド スクリプトのように見えるスクリプト、つまり buildbuild.sh (Linux の場合、この順序で) または build.batbuild.cmdand build.exe (Windows の場合、この順序で) を呼び出します。

Java

サポートされているシステムの種類システム名
オペレーティング システムWindows、macOS、Linux (制限なし)
ビルドシステムGradle、Maven、Ant

autobuild プロセスは、この戦略を適用して、Java コードベース用のビルド システムの特定を試みます。

  1. ルートディレクトリでビルドファイルを検索します。 Gradle、Maven、Ant の各ビルドファイルを確認します。
  2. 最初に見つかったビルドファイルを実行します。 Gradle ファイルと Maven ファイルの両方が存在する場合は、Gradle ファイルが使用されます。
  3. それ以外の場合は、ルートディレクトリの直接サブディレクトリ内でビルドファイルを検索します。 1 つのサブディレクトリにのみビルドファイルが含まれている場合は、そのサブディレクトリで識別された最初のファイルを実行します(1 と同じ環境設定を使用)。 複数のサブディレクトリにビルドファイルが含まれている場合は、エラーを報告します。

コンパイル言語のビルドステップを追加する

リポジトリ内の C/C++、C#、または Java コードに非標準のビルド プロセスがあると、autobuild が失敗するおそれがあります。 ワークフローから autobuild ステップを削除し、手動でビルド ステップを追加する必要があります。 リポジトリのGoのファイルで展開するものを指定したい場合には、ビルドのステップを追加しなければなりません。ワークフロー ファイルの編集方法については、「code scanning を構成する」をご覧ください。

autobuild ステップを削除したら、run ステップをコメント解除して、リポジトリに適したビルド コマンドを追加します。 ワークフローの run ステップでは、オペレーティング システムのシェルを使ってコマンド ライン プログラムが実行されます。 これらのコマンドを変更し、別のコマンドを追加してビルド プロセスをカスタマイズできます。

- run: |
  make bootstrap
  make release

run キーワードについて詳しくは、「GitHub Actions のワークフロー構文」をご覧ください。

リポジトリに複数のコンパイル済み言語が含まれている場合は、言語固有のビルド コマンドを指定できます。 たとえば、リポジトリに C/C++、C#、Java が含まれていて、autobuild によって C/C++ と C# は正しくビルドされるが、Java のビルドは失敗する場合は、ワークフローの init ステップの後で次の構成を使用できます。 これにより、C/C++ と C# には autobuild をそのまま使用しつつ、Java のビルド ステップを指定します。

- if: matrix.language == 'cpp' || matrix.language == 'csharp' 
  name: Autobuild
  uses: github/codeql-action/autobuild@v2

- if: matrix.language == 'java' 
  name: Build Java
  run: |
    make bootstrap
    make release

if 条件について詳しくは、「GitHub Actions のワークフロー構文」をご覧ください。

autobuild でコードがビルドされない理由に関するその他のヒントとテクニックについては、「CodeQL ワークフローのトラブルシューティング」をご覧ください。

コンパイル言語にマニュアルのビルドステップを追加しても、リポジトリで依然としてcode scanningが動作しない場合は、GitHub Supportにお問い合わせください。