CodeQL の結果のトラブルシューティング

完了

このユニットでは、CodeQL とコード スキャンを使用する際の最適化とトラブルシューティングに関するヒントを提供します。

CodeQL 分析ランタイムを最適化する

CodeQL 分析の完了に時間がかかりすぎる理由はいくつかあります。

  • CodeQL 分析にセルフホステッド ランナーを使用する場合は、メモリまたはコアの数を増やすことができます。
  • リポジトリに複数の言語が含まれている場合、問題が発生する可能性があります。 ワークフローを変更して、複数の言語の分析を高速化するマトリックスを使用できます。 各言語の分析は、既定の CodeQL 分析ワークフローと並行して実行されます。 言語の初期化と分析を順番に実行するように設定されている場合は、高度なワークフローを同様に構成する必要がある場合があります。
  • 分析しているコードの量によって、長時間のランタイムが発生する可能性があります。 通常、分析時間は、分析対象のコードの量に比例します。 テスト コードを除外するか、コードを複数のワークフローに分割して、各スキャンでサブセットのみを分析することで、コードのサイズを小さくできます。
  • pushまたはpull_requestイベント中に分析が遅すぎる場合には、scheduleイベントでのみ分析をトリガーすることを検討すると良いでしょう。

CodeQL クエリの最適化

カスタム クエリによってパフォーマンスの問題が発生する場合があります。 一般的な問題とそのトラブルシューティング方法については、 クエリのパフォーマンスのトラブルシューティングに関する CodeQL ドキュメントを参照してください。

CodeQL と QL クエリ言語を使用する際に留意すべき重要な点を次に示します。

  • CodeQL 述語とクラスは、データベース テーブルに対して評価されます。 大きな述語では多数の行を含む大きなテーブルが生成されるため、計算にコストがかかります。
  • QL 言語は、標準のデータベース操作と、結合、プロジェクション、共用体などのリレーショナル代数を使用して実装されます。
  • クエリは ボトムアップで評価されます。つまり、述語が依存するすべての述語が評価されるまで、述語は評価されません。

成果物をデバッグする

CodeQL コード スキャンに関する問題をデバッグするのに役立つ成果物を取得できます。 CodeQL ワークフロー ファイルの init ステップを変更し、 debug: true設定します。 デバッグ 成果物は、 debug-artifactsという名前の成果物としてワークフロー実行にアップロードされます。 データには、CodeQL ログ、CodeQL データベース、およびワークフローによって生成されるすべての SARIF ファイルが含まれます。

VS Code の CodeQL 拡張機能のトラブルシューティング

VS Code 拡張機能のログ ファイルには、トラブルシューティングに役立つ詳細情報が含まれます。

進行状況とエラー メッセージは、ワークスペースの右下隅に通知として表示されます。 CodeQL 拡張機能ログドロップダウン リストを使用して、必要なログを選択できます。

出力ビューでのログの選択を示すスクリーンショット。

一般的なエラー メッセージ

CodeQL ワークフローのトラブルシューティングを行うには、次の一般的なエラー メッセージを理解してください。

エラー: "サーバー エラー"

サーバー エラーが原因でコード スキャンのワークフロー実行が失敗した場合、一時的な通信の問題が原因である可能性があります。 ワークフローをもう一度実行してみてください。 問題が解決しない場合は、GitHub サポートにお問い合わせください。

エラー: "ディスク不足" または "メモリ不足"

非常に大規模なプロジェクトでは、CodeQL でランナーのディスクまたはメモリが不足する可能性があります。 ホストされている GitHub Actions ランナーの場合は、GitHub サポートに問い合わせて問題を調査してください。 セルフホステッド ランナーの場合は、サーバーの仕様を調整する必要があります。 詳細については、 CodeQL を実行するための推奨ハードウェアに関する CodeQL ドキュメントを参照してください。

エラー: 403 Dependabot を使用すると、"統合によってリソースにアクセスできません"

Dependabot は、ワークフローの実行をトリガーするときに信頼されていないと見なされます。 ワークフローは読み取り専用スコープで実行されます。 ブランチのコード スキャン結果をアップロードするには、通常、 security_events: write scopeが必要です。 ただし、コード スキャンでは、 pull_request イベントによってアクションの実行がトリガーされたときに、常に結果をアップロードできます。 Dependabot ブランチの場合は、push イベントの代わりに pull_request イベントを使用することをお勧めします。

簡単な方法は、既定のブランチおよび他の重要な実行時間の長いブランチへのプッシュと共に、この一連のブランチに対して開かれた pull request を進めることです。

次に例を示します。

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

エラー: "既定のセットアップが原因で SARIF アップロードが拒否されました"

CodeQL の既定のセットアップが有効になっているリポジトリに CodeQL 分析の結果を含む SARIF ファイルをプロセスがアップロードしようとすると、エラーが発生します。 この問題には、REST API と CodeQL CLI を使用したアップロードが含まれます。 複数のシステムで同様のコード スキャン アラートが生成されたときにユーザーの混乱を招く可能性を減らすために、CodeQL の既定のセットアップが有効になっている場合、SARIF のアップロードはブロックされます。

このエラーは、CodeQL を使用して作成した結果を含む SARIF ファイルに対してのみ発生します。 このエラーを解決するには、リポジトリで CodeQL を無効にしてから、SARIF ファイルのアップロードを再試行します。

詳細については、次を参照してください。

トラブルシューティングの詳細については、 コード スキャンのトラブルシューティングに関する CodeQL ドキュメントを参照してください。