🦔

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設定方法

  1. プロジェクト画面 → Settings → Pages
  2. 「Enable Pages」チェックをON
  3. .gitlab-ci.ymlpages ジョブで public/ をArtifacts指定
  4. パイプライン成功後、GitLabが自動でPagesを生成

まとめ

GitLabでは、GitHub Actionsと比較し以下の点でメリットがあると感じた。

  • JUnit形式レポートを解析してUIに表示できること
  • HTMLレポートをGitLab Pagesで公開できること(公開範囲を絞れる)

参考リンク


Discussion