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