コンテンツにスキップ

MkDocs を使って GitHub Pages に公開する

MkDocs Material で Markdown の記事をサイトにし、公式が提供する Actions を使って GitHub Pages へ公開した。記事を submodule で管理する構成、デプロイのワークフロー、検索の設定でつまずいた点をまとめる。構築ではMkDocs Material の導入ドキュメントを参考にした。

技術選定

基本無料で GitHub のエコシステムにのっかれるので GitHub Pages を使ってサイトを公開することにした。Pages の公開がブランチ指定ではなく Actions から出来るようになったので使ってみたいというのも理由の 1 つ。

記事は Markdown で手軽に書きたかったので、それに対応しているサービスを探した。

探してみると、Markdown で文章を書けるサービスはいろいろある。その中でmkdocs-materialを使うことにした理由は 2 つある。1 つは、私が普段触っている OSS のドキュメントがこれで書かれていたことだ。おかげで、どんな機能があって何ができるかイメージできた。もう 1 つは、気になるプラグインmkdocstringsがあったことだ。Markdown で文章を書いておけば、代替のサービスはたくさんあるので移行も簡単そうだ。

デプロイ

依存関係を pip でインストールして、サイトをビルド。ビルドしたものをアーティファクトとして出力、そのアーティファクトを GitHub Pages に公開している。公開する作業が終わればアーティファクトの削除が走る。

従来の GitHub Pages で公開する際には公開用のブランチを作る必要があったが、今回のやり方ではそれが必要ない。

.github/workflows/mkdocs.yml
name: GitHub Pages

on:
  push:
    branches:
      - master
  workflow_dispatch:

concurrency:
  group: "pages"
  cancel-in-progress: true

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  build:
    runs-on: ubuntu-22.04
    timeout-minutes: 3
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v2
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.10"
          cache: "pip"

      - name: Install dependencies
        run: pip install -r ./requirements.txt

      - run: mkdocs build
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v1
        with:
          path: ./site

  # Deployment job
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v1

      - uses: geekyeggo/delete-artifact@v1
        with:
          name: github-pages

Python セットアップ時に pip のキャッシュを使おうとしているが、実はうまく使えていない。

検索の有効化

日本語の検索がうまくできずハマった。lang に en を含むことで動作するようになったが、これが意図した挙動なのかバグなのかは分かっていない。

mkdocs.yml
1
2
3
4
5
6
plugins:
  - monorepo
  - search:
      lang:
        - ja
        - en