はじめての Web サイト作成を、 Hugo を利用して行いました。 以下では、その手順を残しておきます。

静的サイトジェネレーター

特徴plain HTMLJekyllHugo
言語基盤HTML/CSS/JSRubyGo
セットアップなし中程度やや難
GitHub Pages対応◎(直接OK)◎(公式サポート)○(ビルド後にpush)
ビルド速度遅め超高速
多言語対応手動一部可能◎(標準機能)
テンプレート/テーマ手動多い非常に多い
向き小規模・自由設計中規模・ブログ型中〜大規模・多言語型

今回は Hugo (ヒューゴ) を利用することにしました。 選択のポイントは以下の通り。

  • ブログや研究記録のようにページが増えるサイトの場合には、Jekyll、Hugo が向いている
  • 日本語と英語の両方に対応させたい
  • Github Actions で自動化することで、 Github Pages への対応 ◎

環境構築

Hugo のインストール

macOS の場合

brew install hugo

Linux の場合( apt だとバージョンが古く、 hugo.toml が読みとれません)

sudo snap install hugo --channel=extended

Windows の場合(詳細はこちら から)

winget install Hugo.Hugo.Extended

hugo version でバージョンが確認できればOK。

新規サイトの作成

作成したい場所で、以下のコマンドを入力( my-website には任意の名前をいれる)

hugo new site my-website
cd my-website

Web サイトのテーマを選定

テーマ名特徴
hugo-coderシンプル&軽量。プロフィールサイトに最適。
PaperMod見やすい&ブログ形式。学術用途にも人気。
Academic (Wowchemy)研究者向け最強。論文リストやプロジェクト紹介に対応。やや重め。

PaperMod を選択。
上で作成した web サイト用のディレクトリに移動したあと、以下のコマンドによりテーマをクローン。

git init
git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod

既存のリポジトリをクローンする場合には、以下のコマンドでサブモジュールを読み取る必要があります。

git submodule update --init --recursive

以上で環境構築は終了。

Hugo での Web ページ作成方法

Web ページのコンテンツ作成は、基本的にマークダウン形式のファイルを編集することで行います。作成したmdファイルをもとに、Hugo が静的サイトとして HTML を出力します。

ファイル構造

.
├── .github/
│   └── workflows/
│       └── deploy.yml  # Github Actions による自動化スクリプト
├── archetypes/
│   └── default.md  # マークダウンファイルのテンプレを記入
├── assets/
├── content/  # サイトの内容を作成
│   ├── en/  # 英語用
│   │   │── _index.md  # 各セクションのトップページの説明
│   │   └── blog/
│   │       │── _index.md  # 各セクションのトップページの説明
│   │       └── 01-first-post.md  # そのページのコンテンツ
│   └── ja/  # 日本語用
│       ├── _index.md
│       └── blog/
│           │── _index.md  # 各セクションのトップページの説明
│           └── 01-first-post.md  # そのページのコンテンツ
├── data/
├── hugo.toml  # サイトの設定を記入
├── i18n/
├── layouts/
├── public/  # Hugo によりビルドされたファイル群
├── static/
└── themes/
    └── PaperMod/
        ├── ... (テーマのファイル)

archetypes/default.md の設定

これを設定することで、hugo new <file-name>.md で作成するコンテンツ用の md ファイルのテンプレートを作成できます。

---
date: '{{ .Date }}'
draft: true
title: '{{ replace .File.ContentBaseName "-" " " | title }}'
type: '{{ .Section }}'
tags: []
categories: []
---

hugo.toml の設定

Hugo サイト全体の設定を管理する中心的なファイル。 これによりサイトの見た目、機能、構造を決定します。

baseURL = 'https://riichisugai.github.io/'  # サイトの公開URL
languageCode = 'en-us'  # サイトの主要言語
theme = "PaperMod"  # 使用するテーマデザイン
title = 'Riichi Sugai'  # サイトのタイトル

relativeURLs = false  # 相対URLを無効化
canonifyURLs = true   # 絶対URLを使用

# デフォルト言語を明示
defaultContentLanguage = "en"
defaultContentLanguageInSubdir = true

# 多言語対応の設定
[languages]
  # 英語ページの設定
  [languages.en]
    weight = 1
    languageName = "English"
    contentDir = "content/en"  # サイトのコンテンツが置かれているディレクトリを指定
    mainSections = ["blog"]
    
    # 英語ページのヘッダーメニュー設定
    [[languages.en.menu.main]]
      identifier = "blog"
      name = "Blog"   # サイトに表示するヘッダー名
      url = "/blog/"  # サイトのディレクトリ
      weight = 1      # 表示順序の優先度
  
  # 日本語ページの設定
  [languages.ja]
    weight = 2
    languageName = "日本語"
    contentDir = "content/ja"
    mainSections = ["blog"]
    
    # 日本語ページのヘッダーメニュー設定
    [[languages.ja.menu.main]]
      identifier = "blog"
      name = "Blog"
      url = "/blog/"
      weight = 1

[params]
  # ページ内のコードブロックにコピーボタンを表示
  ShowCodeCopyButtons = true
  author = "Riichi Sugai"

  ## プロフィールモードの設定
  #[params.profileMode]
  #  enabled = true # プロフィールモードを有効化
  
  # ホームページ情報の設定
  [params.homeInfoParams]
    ShowRecentPosts = true # 最近の投稿を表示
    RecentPostsCount = 3   # 表示する件数を3に設定
  
  # Validate Top page
  [outputs]
    home = ["HTML", "RSS", "JSON"]

トップページの作成

content/en/content/ja/ の直下にトップページを作成します。

hugo new content/en/_index.md
hugo new content/ja/_index.md

_index.md はトップページとして機能するもので、各セクションに用意するものです。そのフォルダ自身にコンテンツと設定を与えるための重要な役割を持ちます。

注意
コンテンツファイルを作成する際には必ず hugo new コマンドを使用してください。Web ページの設定や表示に不具合が生じます。

コンテンツの作成

作成するコンテンツの例として blog を作ります。
トップページと同じ階層にディレクトリ blog を作成して、そのディレクトリに移動します。

  1. /content/ja/blog/ にトップページ _index.md を作成
hugo new /content/ja/blog/_index.md

そして以下の内容のファイルを作成します。

---
date: '2025-11-01T02:14:44+09:00'
draft: false
title: 'Blog'
type: 'blog'
tags: []
categories: []
---

ここで、draft: false は公開設定になります。一方で、 draft: true でウェブに表示しない下書きの状態にできます。

  1. /content/ja/blog/ にコンテンツ 01-first-post.md を作成
hugo new /content/ja/blog/01-first-post.md

そしてファイルの冒頭には以下を記入します。

---
date: '2025-11-01T02:14:44+09:00'
draft: false
title: '<Title of blog>'
type: 'blog'
tags: []
categories: []
---

トップページと同様の冒頭にすることで、トップページ内に各コンテンツがカード形式で表示されるようになります。 コンテンツの中身はこれに続くように記入していきます。記入方法は通常の markdown の記法に倣います。

サーバーの起動

Webページの確認のために以下のコマンドを実行します。

hugo server -D

オプション -D をつけることで draft: true のページも出力されます。

Github.io での公開

Webページを公開するのに Github が提供する静的なサイトを無料で公開できるホスティングサービスである Github Pages を利用します。

  1. はじめに <username>.github.io という Github のリポジトリをpublic で作成
  2. [Settings] から Default branch を gh-pages とする(任意)
  3. [Settings] > [Pages] で Source は Deploy from a branch として、2. で設定した branch を指定

次に公開するWebページの情報を push する手順を示します。

  1. hugo を実行して web サイトをビルド
  2. cd public
  3. git init
  4. git remote add origin https://github.com/riichisugai/riichisugai.github.io.git
  5. git add .
  6. git commit -m "Initial Commit"
  7. git push -u origin gh-pages
  8. github.io のページで [Settings] > [Pages] の Branch を gh-pages に設定

これで公開可能。2回目以降は 1 → 2 → 5 → 6 → 7 を実行します。

Github Actions での自動作成

目標

ソースコード用リポジトリ( hugo-source )の main ブランチにプッシュするだけで、以下のサイト公開までの処理を全自動で実行することを目指します。

  1. GitHub のサーバー上でサイトをビルド(hugo コマンドを実行)
  2. 生成された public ディレクトリの中身を抽出
  3. 公開用リポジトリ( riichisugai.github.io )の gh-pages ブランチにプッシュ

準備するもの

  1. ソースコード用リポジトリ: riichisugai/hugo-source
  2. 公開用リポジトリ: riichisugai/riichisugai.github.io
  3. パーソナルアクセストークン (PAT):
    • 公開用リポジトリに書き込む権限 (repo スコープ) を持ったトークン
    • これは、GitHub Actions がユーザーの代わりに riichisugai.github.io へプッシュする際のパスワードとして機能
  4. GitHub Secret:
    • 上記で作成した PAT を、ソースコード用リポジトリ(hugo-source)に安全に保管するための場所
    • 今回は GH_PAT という名前で登録

導入手順

ステップ1: パーソナルアクセストークン (PAT) の準備

  1. GitHub の [Settings] > [Developer settings] > [Personal access tokens] > [Tokens (classic)] に移動
  2. [Generate new token] をクリック
  3. Note に「Hugo Deploy」など分かりやすい名前を記入
  4. Expiration(有効期限)を選択(セキュリティのため、無期限は非推奨)。
  5. Select scopes で repo にチェック
  6. Generate token をクリックし、表示されたトークンを必ずコピーして安全な場所に一時保管(この画面を閉じると二度と表示されない)。

ステップ2: GitHub Secret の登録

  1. ソースコード用リポジトリ( riichisugai/hugo-source )の [Settings] タブに移動
  2. 左側メニューの [Secrets and variables] > [Actions] を選択
  3. New repository secret ボタンをクリック
  4. Name に GH_PAT と入力
  5. Secret の欄に、ステップ1でコピーしたPATを貼り付け
  6. Add secret をクリックして保存

ステップ3: ワークフローファイルの作成

  1. ソースコード用リポジトリ(hugo-source)のルートに、.github/workflows というディレクトリを作成
  2. その中に deploy.yml という名前のファイルを作成し、以下の内容を貼り付け
# ワークフローの名前
name: Deploy Hugo site to GitHub Pages

# ワークフローが実行されるタイミング
on:
  push:
    branches:
      - main  # hugo-source の main ブランチにプッシュされた時のみ実行

# 実行される一連のジョブ
jobs:
  build-and-deploy:
    # ジョブを実行する仮想環境の種類: 自分の OS によらず以下でOK
    runs-on: ubuntu-latest

    # ジョブの各ステップ
    steps:
      # 1️⃣ ソースコードをチェックアウト
      - name: Checkout source code
        uses: actions/checkout@v4
        with:
          submodules: true  # PaperModテーマのようなサブモジュールも取得
          fetch-depth: 0    # Gitの履歴をすべて取得
          persist-credentials: false  # checkout 後の credentials を無効化

      # 2️⃣ Hugoの環境をセットアップ
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: 'latest' # 最新版のHugoを使用

      # 3️⃣ コミットメッセージ作成
      - name: Generate commit message
        id: commitmsg
        run: |
          # 直前のコミットとの差分を取得
          CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD content 2>/dev/null)
          if [ -z "$CHANGED_FILES" ]; then
            echo "MESSAGE=Deploy site on $(date '+%Y-%m-%d %H:%M:%S')" >> $GITHUB_ENV
          else
            TITLES=$(echo "$CHANGED_FILES" \
                      | sed 's|content/||g' \
                      | sed 's|/_index.md||g' \
                      | sed 's|.md||g' \
                      | tr '\n' ', ')
            echo "MESSAGE=Update: ${TITLES} ($(date '+%Y-%m-%d %H:%M:%S'))" >> $GITHUB_ENV
          fi
          echo "Commit message: $MESSAGE"

      # 4️⃣ Hugoサイトをビルド
      - name: Build Hugo site
        run: hugo --cleanDestinationDir --minify # hugoコマンドでサイトをビルドし、ファイルを圧縮

      # 5️⃣ 公開用リポジトリにプッシュ
      - name: Deploy to GitHub Pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          # ステップ1,2で設定したPATと公開先リポジトリを指定
          personal_token: ${{ secrets.GH_PAT }}
          external_repository: riichisugai/riichisugai.github.io  # ソース用リポジトリと公開用リポジトリが別の場合は external_repository: "ユーザー名/リポジトリ名" が必要
          
          # 公開するディレクトリとブランチを指定
          publish_dir: ./public
          publish_branch: gh-pages # riichisugai.github.io の gh-pages ブランチに公開
          
          # コミットメッセージとコミッター情報を設定
          commit_message: "Deploy: ${{ github.event.head_commit.message }}"
          user_name: 'github-actions[bot]'
          user_email: 'github-actions[bot]@users.noreply.github.com'
  • Checkout source; with: submodules: true がないと submodule であるテーマを取得を反映できないので注意が必要

ステップ4: ワークフローの実行と確認

  1. 作成した deploy.yml ファイルを hugo-source リポジトリの main ブランチにプッシュ
  2. プッシュが完了すると、自動的に GitHub Actions が起動
  3. hugo-source リポジトリの Actions タブで、ワークフローが実行されている様子を確認
  4. ワークフローが緑色のチェックマークで正常に完了すれば、自動デプロイは成功
  5. サイトが正しく表示されているか確認

以上が Hugo による Web サイト作成と、 Github Pages を利用した公開の手順になります。