GitLab Pagesの真の実力:GitHub Pagesを超えた自動化と、CI/CDパイプラインを極限まで加速する実践テクニック
テックリードの皆さん、日々のCI/CDパイプラインの最適化、本当にお疲れ様です。
「静的サイトのホスティング」と聞いて、まずGitHub Pagesを思い浮かべるエンジニアは多いでしょう。しかし、GitLabをメインストリームで使っているチームにとって、GitLab Pagesを使わないことは、手元にある最高峰のランチャーを使わずに手押し車で坂を登るようなものです。
単なる「無料の静的置場」として扱っていませんか?
GitLab Pagesの本質は、GitLab CI/CDの強大なオーケストレーション能力と直結している点にあります。ビルド、テスト、プレビュー環境の動的生成、そしてセキュアな配信までを、1つのプラットフォームで完結させる。その極限のワークフローを、プロの視点で徹底解説します。
—
1. なぜGitLab PagesがGitHub Pagesより「圧倒的に便利」なのか?
結論から言えば、「CI/CDエンジンとの結合度と柔軟性」が桁違いだからです。
- 任意のCI/CDツール不要: GitHub Pagesで複雑なビルド(Hugo, Jekyll, Nuxtなど)を走らせる場合、専用のGitHub Actionsを書くか、ローカルでビルドした成果物をコミットし直すというアンチパターンを踏みがちです。GitLab Pagesは、標準の`gitlab-ci.yml`の成果物(Artifacts)をそのままパブリックにマウントするだけなので、シームレスです。
- Merge Requestごとの「プレビュー環境(Review Apps)」: これが最大のキラー機能です。コードを修正してMRを作った瞬間、そのブランチ専用のプレビュー用URLが自動生成され、デザインや挙動の確認が爆速で行えます。
- 強固なアクセス制御(GitLab Pages Access Control): Enterprise/Ultimateプランに限らず、グループ設定やプロジェクト単位で「ログインユーザーのみ閲覧可能」に制限できます。社内ドキュメントや仕様書のホスティングにおいて、これ以上の選択肢はありません。
—
2. 実践:Hugo/Jekyllを最速でデプロイする `.gitlab-ci.yml` ベストプラクティス
百聞は一見に如かず。実務でそのまま使える、極限まで無駄を削ぎ落としたCI/CD設定ファイルを公開します。今回はモダンな静的サイトジェネレーターの代表格である Hugo を例取りますが、JekyllやAstroでも構造は同じです。
=====================================================================
GitLab Pages Production-Ready CI/CD Pipeline for Hugo
=====================================================================
workflow:
rules:
# デバッグビルドの無駄撃ちを防ぐため、デフォルトブランチとMR、タグのみで発火
- if: ‘$CI_PIPELINE_SOURCE == “merge_request_event”‘
- if: ‘$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH’
- if: ‘$CI_COMMIT_TAG’
stages:
- build
- test
- deploy
variables:
GIT_SUBMODULE_STRATEGY: recursive
HUGO_VERSION: “0.111.3” # バージョンを固定し、ビルドの再現性を担保する
———————————————————————
1. Build Stage
———————————————————————
build:site:
stage: build
image:
name: klakegg/hugo:${HUGO_VERSION}-ext-alpine
entrypoint: [“”]
script:
- hugo –minify –destination public
artifacts:
name: “hugo-artifacts-$CI_COMMIT_REF_SLUG”
expire_in: 1 days # ストレージ容量を圧迫しないよう短めに設定
paths:
- public
rules:
- if: ‘$CI_COMMIT_BRANCH’
———————————————————————
2. Test Stage (Link Checker & Security)
———————————————————————
test:links:
stage: test
image: alpine:latest
dependencies:
- build:site
script:
# リンク切れがないかを検証するプロセスの例(必要に応じてhtmlproofer等に変更)
- echo “Running internal link validation…”
- grep -rn “http://localhost” public/ && exit 1 || echo “Link check passed.”
allow_failure: true
———————————————————————
3. Deploy Stage (GitLab Pages Reserved Job Name)
———————————————————————
pages:
stage: deploy
image: alpine:latest
dependencies:
- build:site
script:
- echo “Deploying static files to GitLab Pages…”
# GitLab Pagesは必ず ‘public’ というディレクトリ名を探しに行く仕様
artifacts:
paths:
- public
rules:
- if: ‘$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH’
environment:
name: production
url: $CI_PAGES_URL
この設定のこだわりポイント
- `GIT_SUBMODULE_STRATEGY: recursive`: テーマをGitサブモジュールとして管理しているプロジェクトでも、設定一つで確実に依存関係を解決します。
- 成果物の有効期限(`expire_in`): デフォルトのままだとストレージがゴミファイルで溢れます。静的サイトのビルド成果物は数日経てば再生成できるため、`1 days` で十分です。
- ジョブ名 `pages`: GitLab Pagesの公式仕様として、デプロイを実行するジョブ名は必ず `pages` である必要があります。ここを間違えると一生デプロイされません。
—
3. 開発スピードを爆上げする「プロの隠し技」
ここからは、チーム全体の開発体験(DX)を一段引き上げるための実践テクニックです。
① WebIDEとキーボードショートカットで秒速修正
ローカル環境を立ち上げるまでもないタイポの修正や、マークダウンの微調整には、GitLab内蔵の Web IDE を使います。
- `Ctrl` + `.` (Macでは `Cmd` + `.`): リポジトリ内のファイルを瞬時に検索して開く。
- `Ctrl` + `Shift` + `P`: コマンドパレットを開き、各種操作をキーボードだけで完結させる。
Web IDEで変更を加え、コミット&MR作成までをブラウザータブを切り替えずに完結させることで、CONTEXT SWITCHING(文脈の切り替え)コストをゼロに近づけられます。
② チーム開発を加速する「共有設定テンプレート(CI/CD Components)」
複数チームで静子サイトを乱立させる場合、毎回同じようなYAMLを書かせるのはテックリードの怠慢です。GitLabの CI/CD Components 機能(または従来の `include:project`)を使い、組織共通の「静人サイトホスティング・テンプレート」を作成しましょう。
.gitlab/ci/templates/static-pages.yml としてリポジトリ(または共通プロジェクト)に配置
spec:
inputs:
hugo_version:
default: “0.111.3”
type: string
—
stages:
- build
- deploy
build_and_deploy_pages:
stage: build
image: klakegg/hugo:$[[ inputs.hugo_version ]]-ext-alpine
script:
- hugo –minify –destination public
artifacts:
paths:
- public
rules:
- if: ‘$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH’
pages:
stage: deploy
dependencies:
- build_and_deploy_pages
script:
- echo “Pages deployed successfully.”
artifacts:
paths:
- public
rules:
- if: ‘$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH’
各プロジェクト側では、たったこれだけの行数を書くだけでセキュアでモダンなPagesパイプラインが即座に手に入ります。
include:
- project: ‘my-org/ci-templates’
file: ‘/static-pages.yml’
inputs:
hugo_version: “0.111.3”
—
4. トラブルシューティング:ありがちな「ハマりどころ」
GitLab Pagesを運用する上で、誰もが一度は踏む地雷と、その回避策をシェアします。
1. 404 Not Found エラーが消えない
- 原因: プロジェクトのルートディレクトリに `public` フォルダが出力されていない、あるいは出力先のパスが間違っている。
- 対策: `artifacts: paths: – public` が正しく設定されているか、ビルドコマンドの出力先(`–destination public` など)が一致しているかをジョブのログで確認してください。
2. カスタムドメインでSSL/TLS証明書が発行されない
- 原因: Let’s Encryptの自動発行プロセスにおいて、DNSのTXTレコードやCNAMEの設定が伝播しきっていない。
- 対策: GitLabの設定画面でカスタムドメインを追加後、DNSレコードが正しく引けることを `dig` コマンド等で確認し、数分〜数時間待ちます。大半はDNSのTTL設定のミスです。
3. サブグループ(Subgroups)でのパス解決エラー
- 原因: `https://namespace.gitlab.io/project-name/` のように、ルート直下ではなくサブパスでホスティングされるため、絶対パスで指定したアセット(CSS/JS/画像)が読み込めなくなる。
- 対策: Hugoの `config.toml` の `baseURL` に `$CI_PAGES_URL` を動的に埋め込むか、相対パス(Relative URLs)を有効にしてください(例: Hugoなら `relativeURLs = true`)。
—
まとめ:GitLab Pagesで「静的サイトの民主化」を推し進めろ
GitLab Pagesは、単なる「無料のウェブサーバー」ではありません。
GitLab CI/CDの強大なパイプライン、レビュー環境、そしてコード管理が三位一体となった、エンジニアのための強力なパブリッシング・プラットフォームです。
今日からあなたのチームでも、面倒なサーバー管理や複雑なデプロイ手順を捨て、GitLab Pagesと洗練されたCI/CD YAMLによる「オートメーション・ファースト」の文化を根付かせてみませんか? 開発スピードの次元が変わることを、私が保証します。