GitLab CI/CDとJtestを連携する(静的解析編)

はじめに

本ブログでは以前からJenkinsとParasoftツールの連携をご紹介してきました。

しかし、Jtestが連携できるCIツールはJenkinsだけではありません。今回はGitLab CI/CDとの連携をご紹介します。

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

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

CIツールとの連携とは?

本記事はJtestとGitLab CI/CDとの連携の話を書きますが、他のツールも概ね同じようなことができます。
CIツールとの連携とはここでは以下の2つの意味があります。

1.JtestをCIツールから自動実行する

Jtestに限らずCIツールから何かしらのビルドやテストツールを実行する場合、コマンドラインでの実行が必要です。Jtestはコマンドラインから実行することができるため、様々なCIツールからの実行も簡単に行えます。

2.実行したJtestの結果をCIツール上にインポートし、結果を確認する

Jtestの静的解析で検出した違反をGitLab上にインポートし、確認できます。JtestはレポーティングツールとしてParasoft DTPというツールを利用することができます。DTPは専用のツールであり、テスト結果を様々な角度から分析した結果を確認することができますし、実行結果の分析や違反箇所の確認はDTPから行ったほうが使いやすく、より詳細な情報を見ることができます。しかし、CIツール上で結果を確認できれば開発者もあちこち画面を遷移する必要が無く、ビルド結果や他のツールの結果も一か所で見ることができます。
JtestとGitLab CI/CDの連携は静的解析と単体テストで行うことができますが、今回は静的解析との連携をご紹介します。

ただし、GitLab上でJtestの解析結果を確認する場合、GitLabのUltimateプランの契約が必要です。もちろん、GitLab CI/CDからJtestを自動実行するだけであればUltimateプランの契約は必要ありません。CE版でも実行可能です。

全体の構成

今回構築する環境構成です。


 

Jtestはオンプレ環境にインストールし、GitLabのSelf-managed runnerを使って実行します。ビルドツールはMavenで、Jtestと連携設定されておりmvnコマンドから静的解析が正常に実行できるものとします。ここではJtestに内包されているdemoプロジェクトをGitLabに登録して使用しています。

GitLab側の準備

GitLab runnerを登録

ここではRunnerはProject runnerを作成します。
GitLab上に作成したリポジトリを開き、左側のメニューからSettings -> CI/CDをクリックします。右のメニューからRunnersを開き、「New project runner」を選択してGitLab Runnerを作成します。

GitLab runnerの実行

JtestがインストールされているマシンにGitLab runnerをインストールし、起動します。画面の「How do I install GitLab Runner?」のリンクをクリックすると、右側にコマンドメニューが表示されるため、これをコピーして実行します。

GitLab CI/CDパイプラインの作成

実際にJtestを実行するためのパイプラインを作成します。Parasoftが作成したパイプラインのサンプルが以下にあるので、これを参考に .gitlab-ci.ymlファイルを作成します。
https://gitlab.com/parasoft/jtest-gitlab

stages:
  - build

build-maven:
  tags:
    - jtest_runner
  stage: build
  script:
    - echo "report.format=xml,html,sast-gitlab" > report.properties
    - echo "report.scontrol=full" >> report.properties
    - echo "scontrol.rep.type=git" >> report.properties
    - echo "scontrol.rep.git.url=$CI_PROJECT_URL" >> report.properties
    - echo "scontrol.branch=$CI_COMMIT_BRANCH" >> report.properties
    - echo "scontrol.rep.git.workspace=$CI_PROJECT_DIR" >> report.properties
    - echo "jtest.configuration=builtin://Recommended Rules"  >> report.properties
    - mvn package jtest:jtest -s $PWD/settings.xml -Dmaven.test.failure.ignore=true -Djtest.settings=$PWD/report.properties -Djtest.report=$PWD/reports

  artifacts:
    reports:
      sast: reports/report.sast
    paths:
      - reports/*

最後のartifactsでJtestが生成するSASTファイルを指定すると、GitLab上で解析結果を見ることが出来ます。

CIの実行と結果のレビュー

パイプラインが実行され、静的解析違反が見つかると以下のように表示されます。

違反のリンクをたどるとさらに詳細な結果を確認できます。

マージリクエスト時の品質ゲート

さらに、mainブランチにマージするためのマージリクエストを作成したときなどに、新たに静的解析違反が発見されたり、一定の数以上の静的違反が発生するとマージをさせないような品質ゲートを設けることもできます。これにより、バグの可能性のあるコードのマージを防ぎ、一定の品質条件をクリアしたコードのみをマージする事ができます。

Policyの作成

プロジェクトのSecure -> Policiesと進んでNew policyでポリシーを作成します。

例えば、以下のような設定を行うことで前回の解析と比べて新しい違反が検出されると、マージリクエスト上で警告され、マージリクエストをブロックします。

ブロックされたマージリクエストの確認

新しい違反が検出されると、以下のようにマージリクエストがブロックされていることがわかります。

Activityも以下のように表示されています。

まとめ

GitLab CI/CDと連携を行うことで、GitLab上で静的解析の結果を確認できるだけでなく、品質ゲートの設定も行うことができます。GitLabへの静的解析結果のインポートはUltimateプランの契約が必要ですが、実行するだけであれば無償のCE版でも実行が可能です。多くのプロジェクトでGitLabが使われていると思いますが、バージョン管理だけでなく、まずはParasoftツールの自動実行からCIを初めてみるのはいかがでしょうか?有償にはなりますが、弊社にて環境構築を行うことも可能です。ご興味がありましたらぜひお問い合わせください。

Top