🦔
GitLab CIで Serverspec 自動実行・Pagesで公開する
はじめに
インフラ構成のテストを自動化できる Serverspec。
以前はGitHub Actionsで実行し、結果をHTMLレポートとして自動公開する構成を試した。
今回はGitLab CIで実行してみた。
構成概要
| 項目 | 内容 |
|---|---|
| 実行環境 | self-hosted runner(Docker / Linux) |
| テスト対象 | 複数サーバ(SERVERS変数で指定) |
| 出力形式 | JUnit XML + HTML |
| 公開方法 | GitLab Pages(ブラウザで閲覧可能) |
| 解析機能 | GitLab内の「Tests」タブ(JUnitレポート解析) |
処理の流れ
① 手動実行
今回は固定でserver1, servrer2を対象にテストを実行
② Serverspec実行
各サーバーのspecを実行し、
JUnit(XML)とHTML両方の形式でレポートを生成する。
rake "spec:$server" \
RSPEC_OPTS="--format RspecJunitFormatter --out reports/${DATE}-${server}.xml \
--format html --out reports/${DATE}-${server}.html"
③ GitLab CIのJUnit連携
GitLab CIの .gitlab-ci.yml で
artifacts:reports:junit: にXMLを登録すると、
Pipelineの 「Tests」タブ に自動解析結果が表示される。

このレポートはGitLab Premium以上なら Test Analytics にも反映され、
テスト数・失敗数・経過時間のトレンド分析が可能。
④ HTMLレポートをGitLab Pagesに公開
JUnitはGitLab UIで見られるが、
Serverspec標準のHTMLレポート をブラウザで直接見れるようにするため
GitLab Pagesを使う。
Pipeline完了後、public/ にレポートを配置すると
自動的にPagesが生成される。
URL例:
https://<your-group>.gitlab.io/<your-project>/
.gitlab-ci.yml 設定例
stages:
- test
- pages
variables:
GIT_STRATEGY: clone
REPORTS_DIR: reports
SERVERS: "server1 server2" # Run pipelineで上書き可
default:
tags:
- serverspec
serverspec:
stage: test
image: ruby:3.3
script:
- gem install serverspec rspec_junit_formatter rake
- mkdir -p "$REPORTS_DIR"
- DATE="$(date +%Y%m%d-%H%M%S)"
- |
for server in $SERVERS; do
echo "=== Running Serverspec for: $server ==="
rake "spec:$server" RSPEC_OPTS="--format RspecJunitFormatter --out $REPORTS_DIR/${DATE}-${server}.xml --format html --out $REPORTS_DIR/${DATE}-${server}.html" || true
done
- |
INDEX=$REPORTS_DIR/index.html
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_DIR/*.html; do
[ "$file" = "$INDEX" ] && continue
base=$(basename "$file")
echo "<li><a href='${base}'>${base}</a></li>" >> $INDEX
done
echo "</ul></body></html>" >> $INDEX
artifacts:
when: always
reports:
junit:
- $REPORTS_DIR/*.xml
paths:
- $REPORTS_DIR/*.html
expire_in: 7 days
rules:
- if: '$CI_PIPELINE_SOURCE == "web"'
pages:
stage: pages
image: alpine:latest
needs:
- job: serverspec
artifacts: true
optional: true
script:
- mkdir -p public
- cp -r $REPORTS_DIR/* public/ || echo "No reports found"
artifacts:
paths:
- public
rules:
- if: '$CI_PIPELINE_SOURCE == "web"'
実行結果
GitLab UIでのJUnit解析
Pipelineタブ → Tests
→ テスト総数・失敗数・各ジョブごとの実行時間を自動集計。
また、「Filename」に記載のリンクを押下すると、テストコードにリンク可能

GitLab PagesでのHTML公開
HTMLレポートをブラウザ上で直接確認できる。
今回のスクリプトではindex.html から各サーバーごとの結果へリンク可能。


Pages設定方法
- プロジェクト画面 → Settings → Pages
- 「Enable Pages」チェックをON
-
.gitlab-ci.ymlのpagesジョブでpublic/をArtifacts指定 - パイプライン成功後、GitLabが自動でPagesを生成
まとめ
GitLabでは、GitHub Actionsと比較し以下の点でメリットがあると感じた。
- JUnit形式レポートを解析してUIに表示できること
- HTMLレポートをGitLab Pagesで公開できること(公開範囲を絞れる)
Discussion