ゆふてっく。

ソフトウェアテスト界隈の話を書きます多分。

Jenkins の HTML Publisher Plugin を使って、Gauge が出したテスト結果の HTML レポートをいい感じに見れるようにする

Jenkins の Declarative Pipeline でやる方法です。
特に Gauge のレポート専用という訳ではなく、「Jenkins ジョブ実行中に作られた HTML ファイルを、Jenkins UI 上でいい感じに見れるようにする方法」です。

前提

環境

HTML レポートの構成

Gauge の HTML レポートはこんな感じの構成で出力されます。

reports
    └── html-report
        ├── css/
        ├── fonts/
        ├── images/
        ├── index.html
        ├── js/
        └── (test_project)/

手順

1. ビルド中に生成される HTML レポートを成果物として保存する

Pipeline の post セクションで、Gauge の出力する html-report ディレクトリをゴソッと保存します。
これにより、ジョブを何度実行してもビルド毎のレポート一式を保持し続けられるようになります。
(参考: https://www.jenkins.io/doc/pipeline/steps/core/)

pipeline {
  stages {
    stage('execute test') {
      steps {
        // テスト実行する
      }
      post {
        always {
          archiveArtifacts artifacts: 'reports/html-report/**/*', fingerprint: true
        }
      }
    }
  }
}

注意点

保存対象を reports/html-report/* とすると reports/html-report/index.html だけが保存されてしまいます。
reports/html-report/**/* とすると、ちゃんと html-report/ 配下をすべて保存してくれます。

2. HTML publisher で、保存した HTML レポートをジョブ画面に公開する

Pipeline の post セクションで、保存した HTML レポートを公開します。
これにより、Jenkins のジョブページのサイドメニューに HTML レポートへのリンクが出現します。
(参考: https://www.jenkins.io/doc/pipeline/steps/htmlpublisher/)

pipeline {
  stages {
    stage('execute test') {
      steps {
        // テスト実行する
      }
      post {
        always {
          archiveArtifacts artifacts: 'reports/html-report/**/*', fingerprint: true
          publishHTML target: [
            allowMissing: false,
            alwaysLinkToLastBuild: true,
            keepAll: false,
            reportDir: 'reports/html-report',
            reportFiles: 'index.html',
            reportName: 'HTML Report'
          ]
        }
      }
    }
  }
}

3. Jenkins のセキュリティ設定を変更する

この時点では、index.html を表示しても CSS などが何も読み込まれません。
Chrome の開発者ツールでコンソールを見ると以下のようなエラーが出ている状態です。

Blocked script execution in '<URL>' because the document's frame is sandboxed and the 'allow-scripts' permission is not set.

これは Jenkins のセキュリティ設定のためなので、正常に HTML レポートを読み込むためにはセキュリティ設定を下げる必要があります。
(参考: https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy/ )

手っ取り早くセキュリティ設定を変更する

Jenkins で Jenkins の管理 -> スクリプトコンソール を開き、以下のコマンドを実行します。

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

コマンド実行後、即座に設定変更が反映され HTML レポートを正常に表示できるようになります。 (わたしの場合はブラウザキャッシュのクリアが必要でした。必ず必要かどうかは分かりません)

ただし、Jenkins の再起動などを行うと設定が元に戻ってしまうらしいです (まだ試してません)。

セキュリティ設定の変更を永続化する

Jenkins の起動時オプションで以下のように設定するらしいです (まだ試してません)。

java -Dhudson.model.DirectoryBrowserSupport.CSP="" -jar jenkins.war

備考

Jenkins 2.200 以降は、セキュリティ設定を変更するのではなく Resource Root URL というのを使っていい感じにできるっぽぃ?? のですが、会社の共用 Jenkins のバージョンは 2.164.3 なので 上記の方法を採りました。