🐡

ServerspecをGitHub Actionsで実行し、Pagesでレポートを公開してみた

に公開

はじめに

インフラ構成のテストを自動化できる Serverspec
コマンドで毎回叩くのは少し手間がかかるので、
GitHub Actionsで実行し、結果をHTMLレポートとして自動公開する構成を試した。


Pages設定

ServerspecはHTML形式のレポートを出力できる。
これをGitHub Pagesと組み合わせることで、
テスト結果をブラウザ上でそのまま確認できるようになる。

設定はリポジトリの Settings → Pages で有効化するだけ。

詳しい手順は以下を参照。
GitHub Pages公式ドキュメント

(無料プラン(GitHub Free)では Public リポジトリのみ Pages サイトを公開できる。
有料プラン(GitHub Pro/Team/Enterprise)であれば、Public/Private 両方のリポジトリから Pages 公開が可能)


検証環境

項目 内容
テスト対象 Docker上のコンテナ
実行環境 self-hosted runner
構成 GitHub Actions → Serverspec実行 → HTML出力 → ArtifactsとPagesに保存

実行の流れ

1. 手動実行

ワークフローを手動で起動し、スペース区切りでサーバ名を指定。
例:server1 server2


2. テスト完了

結果はArtifactsとして自動アップロードされる。
Actionsの実行履歴からZIPでダウンロードできる。


3. 自動デプロイ

ジョブ完了後に pages-build-deployment が起動し、
HTMLレポートが自動的に公開される。


4. レポート確認

生成された index.html に各サーバーのレポートリンクが一覧表示される。
リンクをクリックすると個別のテスト結果を確認できる。


ワークフロー定義(.github/workflows/serverspec.yml)

self-hosted runner上で実行しているため、Rubyやbundlerのセットアップは省略。
Rakefileは以前検証したRakefile(参考: https://zenn.dev/bighero_14/articles/e5238c1ea13a25) から編集せず動作確認を優先している。

name: Serverspec Tests

on:
  workflow_dispatch:
    inputs:
      servers:
        description: "スペース区切りでテスト対象サーバを指定 (例: web db)"
        required: true
        default: "server1 server2"

jobs:
  serverspec:
    name: Serverspec on self-hosted runner
    runs-on: [self-hosted, Linux, X64, label-1]
    permissions:
      contents: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Run Serverspec tests
        continue-on-error: true
        run: |
          mkdir -p reports
          DATE=$(date +%Y%m%d-%H%M%S)
          for server in ${{ github.event.inputs.servers }}
          do
            echo "Running Serverspec for $server"
            rake "spec:$server" RSPEC_OPTS="--format documentation --format html --out reports/${DATE}-${server}.html" || true
          done

      - name: Upload all reports as artifact
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: serverspec-html-reports
          path: ${{ github.workspace }}/reports
          retention-days: 7

      - name: Generate index page
        run: |
          INDEX=reports/index.html
          DATE=$(date +%Y%m%d-%H%M%S)
          echo "<html><head><meta charset='utf-8'><title>Serverspec Reports</title></head><body>" > $INDEX
          echo "<h2>Serverspec Reports ($DATE)</h2><ul>" >> $INDEX

          for file in reports/*.html; do
            [ "$file" = "reports/index.html" ] && continue
            base=$(basename "$file")
            echo "<li><a href='${base}'>${base}</a></li>" >> $INDEX
          done

          echo "</ul></body></html>" >> $INDEX

      - name: Deploy HTML report to GitHub Pages
        uses: peaceiris/actions-gh-pages@v3
        if: always()
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ${{ github.workspace }}/reports

各処理のポイント

パラメータ入力

workflow_dispatch.inputs で手動実行時にサーバ名を指定できる。

ループ制御

for 内の || true により、途中で失敗しても後続サーバのテストを継続する。

Artifacts登録

reports/ 配下のHTMLをアップロードし、Actions画面から直接ダウンロード可能。

index.html生成

全レポートを自動リンク化。
ブラウザ上でサーバごとの結果を確認できる。


まとめ

ServerspecをGitHub Actionsに組み込み、
テスト → レポート出力 → 公開 までを自動化できた。
FreeプランではPublic限定だが、結果をWeb上で共有できるのは便利だと思う。
(レポート履歴の保持の仕組みを入れ込めればよいが別の機会で。。。)


参考リンク

Discussion