Qodanaによる静的コード解析をCIに組み込んだ話
はじめに
こんにちは、WealthNaviでバックエンドエンジニアを担当しているかるかんです。
今回は、Qodanaによる静的解析をCIに組み込むことでコード品質を上げた話を紹介します。
概要
WealthNaviではQodanaを全社的なコード解析ツールとして導入しました。(過去記事)
しかし、開発中にローカル環境で実行できるようになったものの、新規参画者が多いプロジェクトではローカル環境での実行が徹底されない可能性があります。
そのため、参画したプロジェクトにてGitHub ActionsにQodanaを組み込み、コード解析を自動化する試みを行いました。本記事ではその方法と結果をご紹介します。
方法
以下の通りにQodanaを設定し、GitHub Actionsのワークフローを利用することで、プルリクエスト作成・更新時に自動でQodanaが実行されコード解析が行われるようにしました。
Qodana
QodanaはJetBrainsが提供する静的コード解析ツールです。実行することでコード品質やバグ、脆弱性を自動で検出可能。詳しくは過去記事を参照のこと。
また、本記事はQodana Cloudの使用を前提としています。
解析ルールの設定
下記のようなQodanaの設定ファイル(qodana.yml)をプロジェクトルートに作成することで解析ルールを指定できます。
なお、今回はJVMベースのプロジェクトであるため、以下のように設定しました。
詳細については公式を参照。
version: "1.0"
projectJDK: "corretto-21"
linter: jetbrains/qodana-jvm:2025.2 # 使用するQodanaのリンターを指定。
profile:
name: qodana.recommended # JetBrains IDEのデフォルトプロファイルに近い解析ルールセットを適用
# 追加の解析ルールの有効化
include:
- name: VulnerableLibrariesGlobal # 依存ライブラリの脆弱性検出
- name: VulnerableCodeUsagesInspection # 脆弱なAPIが使用されているかどうかを確認
- name: IncorrectFormatting # コードフォーマットの不備検出※適用するコードスタイルの指定方法に関しては下項参照
# 一部の解析ルールの無効化
exclude:
- name: NullableProblems # null許容型に関する指摘を無効化
- name: IncorrectFormatting
paths:
- folder_name/docs # コードフォーマットの不備検出を特定のフォルダパスのみ無効化
追記:適用するコードスタイルの指定
Qodanaの設定ファイル(qodana.yml)でコードフォーマットの不備検出を有効化した場合、
適用すべきコードフォーマットを指定する必要があります。Qodanaの公式ドキュメント
WealthNaviではIntelliJ IDEAのコードフォーマットをベースにしたコードスタイルを適用しているため、プロジェクトルートに.idea/codeStylesのディレクトリを作成し、codeStyleConfig.xmlというファイル名で適用するコードスタイルを保存しました。
これを他のコードと同様にGitHubのリモートレポジトリにプッシュすることで、ワークフローで実行されるQodanaがそのコードスタイルを参照してコードフォーマットの不備を検出できるようになりました。
CIへの組み込み
WealthNaviではCI/CDにGitHub Actionsを利用しており、Qodanaの公式ドキュメントとGitHub ActionsのQodana Scanに従い、以下のように設定しました。
ワークフローの作成
ワークフローを以下のように定義し、.github/workflowsフォルダ配下に保存しました。
name: Lint with Qodana
# 実行契機の指定
on:
push:
branches:
- 'main' # mainブランチへのpush時に実行
pull_request:
branches:
- '**' # 全てのプルリクエストで実行
jobs:
lint:
runs-on: ubuntu-latest
permissions:
contents: read # Qodanaがコードの読み取り権限を必要とするため追加
pull-requests: write # Qodanaがプルリクエストへのコメント権限を必要とするため追加
checks: write # Qodanaが解析結果をチェックの項に書き込む権限を必要とするため追加
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0 # コミット履歴を全て取得するように設定。Qodanaによるプルリクエスト解析には完全なコミット履歴が必要であるため。
- name: Qodana Scan
# Qodanaが提供しているGitHub Actionを利用。
uses: JetBrains/qodana-action@v2025.2
with:
args: --env,ENVIRONMENT_VARIABLE_IF_REQUIRED=${{ vars.ENVIRONMENT_VARIABLE_IF_REQUIRED }} # 必要に応じて環境変数を渡す
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }} # Qodana CloudのトークンをGitHub Secretsから取得
結果
上記のような設定で、プルリクエストへのコードのプッシュを契機にQodanaが自動実行され、解析結果をプルリクエスト上に表示できるようになりました。
これにより、レビュー時にコード品質の問題を把握しやすくなり、コードスタイルが適用されているか潜在的なコードの問題がないか等を容易に確認できます。
これによりレビュアーの負担の軽減、開発者のコード品質意識の向上が期待できます。
以下の項目に実際にプルリク上に表示されたQodanaからの指摘の例を示します。
プルリクエストでの表示例

このようにプルリクエストのコメント欄にQodanaからの指摘が表示されます。
コメント下部の「View the detailed Qodana report」リンクをクリックすると、次項で示すQodana Cloud上の詳細な解析結果を確認できます。
Qodana Cloudでの表示例
プルリク上のQodanaの指摘をクリックすると、Qodana Cloud上で詳細な解析結果を確認できます。

Overview下部の指摘点一覧では、指摘の詳細が確認できます。

考察
このように、Qodanaによる静的解析をCIに組み込むことでコード解析を自動化し、プルリクエストで結果を自動表示させることで、容易にQodanaの指摘を把握できるようになりました。
これはプロジェクト全体でのコード品質の向上に寄与していると考えられます。
さいごに
WealthNaviでは、コード品質を上げるために様々な取り組みを行っています。
設立間もない会社であることもあって全社的なルールの策定が道半ばですが、エンジニア一人ひとりがコード品質を意識して開発しています。
Discussion