コード スキャンの言語とビルドをカスタマイズする
CodeQL コード スキャンでは、自動ビルド機能を備えた多くの言語を既定でサポートしています。 ただし、コードで非標準のビルド プロセスを使用する場合、カスタム ビルド ステップでワークフローをカスタマイズする必要が生じる場合があります。
このユニットでは、コード スキャンによって分析される言語を変更する方法と、CodeQL コード スキャン ワークフローにカスタム ビルド ステップを追加する方法について説明します。
分析される言語を変更する
CodeQL コード スキャンでは、サポートされている言語である C/C++、C#、Go、Java、JavaScript/TypeScript、Python、Ruby で記述されたコードを自動的に検出します。
Note
CodeQL は、サポートされている言語とフレームワークを絶えず更新しています。使用可能な言語、バリアント、コンパイラの完全な一覧については、ドキュメント[7]を参照してください。
既定の CodeQL 分析ワークフロー ファイルには、language と呼ばれるビルド マトリックスが含まれています。これにより、リポジトリ内の分析対象の言語が一覧表示されます。 コード スキャンをリポジトリに追加すると、CodeQL によって自動的にこのマトリックスが設定されます。 language マトリックスを使用すると、各分析を並列で実行するように CodeQL が最適化されます。 ビルドを並列化するとパフォーマンスが向上するため、すべてのワークフローでこの構成を採用することをお勧めします。
サポートされている 1 つ以上の言語のコードがリポジトリに含まれている場合は、分析する言語を選択できます。 言語が分析されないようにする理由は、いくつかあります。 たとえば、プロジェクトで、コードの本体に対する依存関係が別の言語の中にあり、それらの依存関係のアラートを表示したくない場合が考えられます。
ワークフローで language マトリックスを使用している場合、そのマトリックス内の言語のみを分析するように CodeQL がハードコーディングされます。 分析する言語を変更するには、マトリックス変数の値を編集します。 言語を削除して分析対象にならないようにすることも、コード スキャンの設定時にリポジトリに存在しなかった言語を追加することもできます。 たとえば、当初、コード スキャンの設定時にリポジトリに JavaScript のみが含まれていて、その後に Python コードを追加した場合、マトリックスに python
を追加する必要があります。
jobs:
analyze:
name: Analyze
...
strategy:
fail-fast: false
matrix:
language: ['javascript', 'python']
ワークフローに language というマトリックスが含まれていない場合、CodeQL は分析を順番に実行するように構成されています。 ワークフローで言語を指定しない場合、CodeQL では、リポジトリ内のサポートされているすべての言語を自動的に検出し、分析しようとします。 マトリックスを使用せずに分析する言語を選択する場合は、init
アクションの下の languages パラメーターを使用できます。
- uses: github/codeql-action/init@v1
with:
languages: cpp, csharp, python
コード スキャンのカスタム ビルド ステップ
サポートされているコンパイル済み言語では、CodeQL 分析ワークフローの autobuild アクションを使用してコードをビルドできます。 これにより、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 ステップの後に次の構成を使用できます。 これにより、C/C++ と C# には autobuild
をそのまま使用しつつ、Java のビルド ステップを指定します。
- 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