GitHub ActionsとJtestを連携する

Jtestは様々なCIツールとの連携することで実行を自動化することができます。これまでもいくつかのCIツールとの連携について触れてきましたが、今回はGitHub Actionsとの連携についてご紹介します。

Parasoft Jtest は Javaコードに潜むさまざまなセキュリティ脆弱性を早期発見
ソースコードの品質向上を実現します。

>> Parasoft Jtest の詳細はこちら <<

構成

構築する環境は以下の通りです。

構成図

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で完結したいという方は試してみてはいかがでしょうか。弊社で有償の環境構築サービスもご提供していますのでご興味がありましたら、ぜひお問い合わせください。

Top