Jtestは様々なCIツールとの連携することで実行を自動化することができます。これまでもいくつかのCIツールとの連携について触れてきましたが、今回はGitHub Actionsとの連携についてご紹介します。
構成
構築する環境は以下の通りです。
GitHub上にCIの対象リポジトリを登録しています。オンプレミス環境にはJtestおよびビルドツール(Maven)をインストールし、GitHub Actionsによる実行のためにランナーを設定しています。これにより、開発者がリポジトリにコミットなどで変更を加えると、オンプレミス環境のランナー経由でJtestによる静的解析が実行されます。
構築
構築の流れは以下の通りです。
- セルフホステッドランナーの準備
Jtestがインストールされているマシンをランナーとして登録します。 - GitHubワークフローの作成
静的解析を実行するワークフローを作成します。 - GitHubワークフローの静的解析の結果確認
静的解析の結果を確認します。 - プルリクエストの静的解析のベースライン設定
プルリクエストで静的解析の差分を確認する場合に設定します。 - プルリクエストの品質ゲートの設定
プルリクエストで静的解析の違反が検出された時にマージをブロックする場合に設定します。
セルフホステッドランナーの準備
GitHub Actionsで利用できるランナーは2種類ありますが、今回はオンプレミス環境で実行するためセルフホステッドランナーを利用します。
- GitHubホステッドランナー:GitHubがホストしている仮想マシン
- セルフホステッドランナー:独自にホストしているマシン
リポジトリの [Settings] > [Actions] > [Runners] から “New self-hosted runner” を選択して作成します。オンプレミス環境のマシンにあわせて “Runner image” と “Architecture” を選択し、画面に表示されているコマンドをマシンで実行します。コマンドを実行することでランナーをマシンにダウンロードし、実行することができます。
GitHubワークフローの作成
GitHub Actionsは自動化するプロセスをワークフローとしてYAMLファイルに定義し、リポジトリの.github/workflowsディレクトリに保存します。Parasoftのワークフローのサンプルがあるため、こちらを参考にmain.ymlファイルを作成します。https://github.com/parasoft/run-jtest-action
name: Jtest with Maven
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
build:
name: Analyze project with Jtest
permissions:
security-events: write
runs-on: self-hosted
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Create input for Jtest
run: mvn clean install jtest:jtest "-Djtest.skip=true"
- name: Run Jtest
id: jtest
uses: parasoft/run-jtest-action@2.0.0
with:
input: target/jtest/jtest.data.json
- name: Upload results (SARIF)
if: always()
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: reports/report.sarif
- name: Archive reports
if: always()
uses: actions/upload-artifact@v3
with:
name: Static analysis reports
path: reports/*.*
- 3~8行目:ワークフローのトリガー。mainブランチにプッシュ、プルリクエストが作成された時に実行されます。手動実行も可能です。
- 19~20行目:Jtestの解析範囲を決定するJSONファイルを作成します。
- 21~25行目:Jtestによる静的解析を実行します。
- 26~30行目:JtestのSARIFレポートファイルをGitHubにアップロードします。
- 31~36行目:JtestのレポートファイルをGitHubにアーカイブします。
GitHubワークフローの静的解析の結果確認
ワークフローが実行されると、リポジトリの [Security] > [Code scanning] から静的解析の結果を確認することができます。検出された違反を選択すると詳細も確認することができます。
※プライベートリポジトリでCode scanningから結果を確認するためには、GitHub Advanced Securityライセンスの契約が必要です。
プルリクエストの静的解析のベースライン設定
ワークフローでプルリクエストをトリガーに設定するとプルリクエストが作成された時にマージ対象のブランチに対して検出された静的解析の結果とマージ先のブランチの結果が比較されます。これにより、新しく検出された違反のみを確認することができるため、開発者はコードの変更に関連する問題の対応に集中することができます。
ワークフローでプルリクエストをトリガーするためには、ワークフローを以下のように定義します。
on:
pull_request:
branches: [ main ]
プルリクエストの品質ゲートの設定
ブランチ保護ルールを設定すると、プルリクエスト時に新しい違反が検出された場合にマージをブロックする品質ゲートのような仕組みを実現することができます。
※プライベートリポジトリでブランチ保護ルールを利用するためには、GitHub Pro、GitHub Team、GitHub Enterpriseプランの契約が必要です。
リポジトリの [Settings] > [Branches] から “Add branch ruleset” を選択し、以下のように設定します。
- Ruleset Name:main-rule(任意の名前)
- Enforcement status:Active
- Target branches:Include default branch
- Require status checks to pass:オン
- Status checks that are required:Jtest(GitHub Advanced Security)
まとめ
GitHub Actionsと連携することで、静的解析の実行を自動化して結果をGitHub上で確認することができます。自動化には様々な選択肢がありますが、GitHubで完結したいという方は試してみてはいかがでしょうか。弊社で有償の環境構築サービスもご提供していますのでご興味がありましたら、ぜひお問い合わせください。