Hugo でプロダクトのドキュメントサイトを構築する

業務でプロダクトのドキュメントを Hugo で作成したので、メモを残しておきます。

Hugo とは

Hugoは、Go 言語で書かれた高速かつ柔軟な静的サイトジェネレーターです。 静的サイトジェネレーターは、事前にコンテンツを生成し、HTMLファイルとして配信します。このため、非常に高速で、セキュリティ面でも優れています。 また、Markdown 形式でコンテンツを簡単に作成でき、多様なテーマが用意されているため、デザインも自由にカスタマイズできます。

使用したテーマ(Hextra)

今回は、Hugo Theme 一覧からドキュメントに向いてそうと思った「Hextra」を採用しました。
シンプルなデザイン、Mermaid をサポートしている、全文検索をサポートしている、ダークモードへの切り替えが簡単、なあたりがいいなと思いました。
ちなみに Hextraのドキュメントも Hugo/Hextra で作られています。

構築

セットアップ

Hugo インストール

brew でインストール可能です。

brew install hugo

プロジェクト作成

# プロジェクトのディレクトリを作成
hugo new site my-site --format=yaml

# hugo モジュール作成
cd my-site
hugo mod init {モジュールパス}

# Hextra テーマを追加
hugo mod get github.com/imfing/hextra

hugo.yaml に以下を追記します。(一番上の階層です。)

module:
  imports:
    - path: github.com/imfing/hextra

コンテンツ追加

以下のコマンドで Markdown ファイルが作成されます。

hugo new content/_index.md
hugo new content/docs/_index.md

ローカルにサイトを構築する。

hugo server --buildDrafts --disableFastRender

http://localhost:1313/にサイトが立ちます。

Hugo の config 設定

hugo.yaml で、細かな設定が可能です。
今回は以下のようになりました。

baseURL: https://example.org/
title: タイトル

module:
  imports:
    - path: github.com/imfing/hextra

defaultContentLanguage: ja
languages:
  ja:
    languageName: 日本語
    weight: 1

menu:
  main: # メインメニューの設定
    - name: Search # 全文検索用の検索窓
      weight: 1
      params:
        type: search
    - name: GitLab # このサイトの GitLab リポジトリのリンクアイコン
      weight: 2
      url: "{リポジトリリンク}"
      params:
        icon: gitlab
  sidebar: # サイドバーのコンテンツ以外の設定
    - identifier: more
      name: More
      params:
        type: separator
      weight: 1
    - identifier: hugoDocs
      name: "Hugo ドキュメント"
      url: "https://gohugo.io/documentation/"
      weight: 2
    - identifier: hextraDocs
      name: "Hextra ドキュメント"
      url: "https://imfing.github.io/hextra/"
      weight: 3

params:
  navbar: # ナビゲーションバーの設定
    displayTitle: true # タイトルを表示する
    displayLogo: true # ロゴを表示する
    logo: # カスタマイズするには、./static/images/logo.png のように画像ファイルを配置
      path: images/logo.png # static の下から記載
      dark: images/logo.png # static の下から記載
      link: / # タイトルをクリックしたときにルートに遷移する
      width: 40
      height: 40
    width: full # full (100%), wide (90rem), normal (1280px)

  page:
    width: full # full (100%), wide (90rem), normal (1280px)

  theme:
    default: system # light | dark | system
    displayToggle: true

  footer: # フッターの設定
    enable: false # 表示しない

  editURL: # ページごとの編集リンクの設定
    enable: true # リンクを表示する
    base: "{gitlab リポジトリパス}/-/edit/main/content" # ベース編集リンク

  highlight: # コードボックスの設定
    copy: # コピーボタン
      enable: true
      # hover | always
      display: hover

  enableInlineShortcodes: true # ショートコードを有効化する

  search: # 全文検索の設定
    enable: true
    type: flexsearch

    flexsearch:
      index: content # インデックスする対象: content | summary | heading | title
      tokenize: full # インデックスの粒度: full | forward | reverse | strict

コンテンツを充実させる

ドキュメントタイプのレイアウトにする

Hextra のレイアウトには、docs, blog, default の3タイプありますが、今回は docs を使います。 docs タイプはディレクトリ構成に合わせた構造化されたドキュメントを表現できます。

content/_index.md の先頭を以下のように変更します。

---
title: 'ホームページ'
cascade:
  type: docs
---

階層化されたことを確認するため、ページを追加してみます。

hugo new content/docs/page01/_index.md
hugo new content/docs/page02/_index.md

./content/docs/page01/_index.md

---
title: 'ページ01'
weight: 1
---

./content/docs/page02/_index.md

---
title: 'ページ02'
weight: 2
---

以下のようになりました。
サイドバーに階層が表現され、ページの上部にパンくずも表示されました。

ショートコードによるコンテンツ埋め込み

コールアウト

注意書きやノートを簡単に配置できます。

{{< callout type="warning" >}}
  このページは 3年以上更新されていません。情報が古くなっている可能性があります。
{{< /callout >}}

カード

カードを配置できます。アイコンや画像を設定したり、リンクにすることも可能です。

Youtube

Youtube の動画埋め込みも対応されており、プレイヤーの設定も簡単です。
以下は、自動再生、ループ再生、プレイヤーのコントローラー非表示としています。

{{< youtube id=xxxxxxxxx autoplay=true controls=false loop=true >}}

固定された文言を変更する

ページ編集画面へのリンクの文言が、「このページをGitHubで編集→」となっています。
今回は GitLab を使用しているので変えられないかなーと思って調べたところ、Hetraのi18n/ja.yamlで設定された値が使われていました。

./i18n/ja.yaml を自作して上書きすることで変更できます。

backToTop: "トップにスクロール"
changeLanguage: "言語を変更"
changeTheme: "テーマを変更"
copyright: "© 2024 Hextra プロジェクト。"
dark: "ダーク"
editThisPage: "このページをGitLabで編集 →"
lastUpdated: "最終更新日"
light: "ライト"
noResultsFound: "結果が見つかりませんでした。"
onThisPage: "このページの内容"
poweredBy: "提供元 Hextra"
readMore: "もっと読む →"
searchPlaceholder: "検索..."

変更できました。

GitLab Pages へのデプロイ

Hetraドキュメントの Deploy Siteに GitHub Pages、Cloudflare Pages、Netlify、Vercel へのデプロイ方法が記載されています。
今回は、社内の Gitlab Pages にデプロイしたかったので、それ用の .gitlab-ci.yml を用意しました。

.gitlab-ci.yml

image: hugomods/hugo:ci-0.131.0

variables:
  HUGO_ENV: production

cache:
  paths:
    - .hugo_cache

pages:
  script:
    - hugo mod get -u
    - hugo
  artifacts:
    paths:
      - public
  only:
    - main

変更が main ブランチに反映されてから 10秒程度で、GitLab Pages が更新されていました。

おわりに

Hugo/Hextra を使ってプロダクトドキュメントを構築しました。
シンプルですが、無駄なくいい感じのデザインのサイトを簡単に作れました。