Docusaurus + GitHub Actions 自動化編譯與 GitHub Pages 部署
1. 自動化部署架構拓撲
目前 GitHub Pages 支援兩種發布模式:
-
GitHub Actions 原生 Artifact 發布 (推薦首選): 建置產物(
build/)直接以二進位壓縮包形式傳送給 GitHub Pages 底層基礎設施,倉庫內不需要額外維護一個充滿編譯雜訊的gh-pages分支,乾淨且執行速度極快。 -
傳統分支覆寫發布 (
gh-pages分支): 由 Action 自動建立gh-pages分支,並將靜態產物 commit 至該分支。
[本地終端 / Obsidian / VSCode]
│
│ 1. Git Push Markdown 文件與程式碼變更
▼
[GitHub 遠端儲存庫: main 分支]
│
│ 2. Webhook 觸發 GitHub Actions (.github/workflows/deploy.yml)
▼
┌───────────────────────────────────────────────────────────┐
│ GitHub Actions Runner (ubuntu-latest) │
│ ├─ Actions Checkout: 完整拉取歷史 (包含文檔 Git 時間戳) │
│ ├─ Setup Node.js: 載入 Node.js 20 環境並自動命中 NPM 快取 │
│ ├─ npm ci: 依據 package-lock.json 嚴格安裝依賴 │
│ └─ npm run build: 編譯靜態 HTML / CSS / JS 產物至 build/ │
└────────────────────────────┬──────────────────────────────┘
│
│ 3. 封裝 build/ 並安全簽發部署憑證
▼
[GitHub Pages 託管 CDN 伺服]
│
▼
線上正式站點: https://<User>.github.io/<Repo>/
2. 前置準備:倉庫與 docusaurus.config.js 網址對齊
Docusaurus 在編譯時會嚴格依據 url 與 baseUrl 計算所有資源(CSS、JS、圖片)的絕對路徑。路徑設定錯誤是造成 GitHub Pages 上線後樣式遺失(破版)、404 的最主要原因。
2.1 網址配置計算公式
假設你的 GitHub 帳號為 kiwihome,倉庫名稱為 kiwi-wiki:
-
url:[https://kiwihome.github.io](https://kiwihome.github.io)(若綁定自訂網域則填自訂網域,如[https://wiki.example.com](https://wiki.example.com)) -
baseUrl:/<Repo名稱>/(前後必須都要有斜線,例如/kiwi-wiki/;若使用自訂頂級網域,此處必須改為'/') -
organizationName:GitHub 組織或個人帳號名稱 -
projectName:倉庫名稱 -
trailingSlash:明確指定結尾是否帶斜線(建議設為false,可避免 GitHub Pages 上特定錨點連結轉跳失敗)
編輯專案根目錄的 docusaurus.config.js:
// @ts-check
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'My HomeLab Wiki',
tagline: '自動化維運與技術文件庫',
favicon: 'img/favicon.ico',
// 核心路徑宣告 (依據專案嚴格替換)
url: 'https://<USERNAME>.github.io',
baseUrl: '/<REPO_NAME>/',
organizationName: '<USERNAME>',
projectName: '<REPO_NAME>',
trailingSlash: false,
onBrokenLinks: 'throw', // 遇到死連結直接中斷 Build,防止髒資料上線
onBrokenMarkdownLinks: 'warn',
// ... 其餘主題與外掛配置保持不變
};
module.exports = config;
3. GitHub 倉庫控制台一次性權限設定
在推送 Workflow 前,必須前往 GitHub 倉庫網頁完成權限放行:
-
開啟目標 GitHub 儲存庫。
-
點選頂部導航列的 Settings (設定)。
-
左側選單找到 Pages(位於 Code and automation 區塊):
- Build and deployment -> Source:將預設的
Deploy from a branch切換改為GitHub Actions。
- Build and deployment -> Source:將預設的
-
左側選單點擊 Actions -> General:
-
滾動至 Workflow permissions 區塊。
-
確認選取 Read and write permissions(讀取與寫入權限)。
-
勾選 Allow GitHub Actions to approve pull request requests(若有跳出),點擊 Save。
-
4. GitHub Actions 工作流程配置檔案
在本地專案根目錄建立目錄與檔案:.github/workflows/deploy.yml。
方案 A:現代化原生 Pages 部署(強烈推薦,零分支污染)
本配置採用 GitHub 官方 upload-pages-artifact 與 deploy-pages 模組,不需要建立 Personal Access Token (PAT),完全依靠 Runner 內建的短效 OIDC Token 進行安全部署。
name: Deploy Docusaurus to GitHub Pages
on:
push:
branches:
- main # 觸發分支,若專案預設為 master 請自行調整
# 嚴格定義 Workflow 權限
permissions:
contents: read # 讀取儲存庫程式碼
pages: write # 寫入 GitHub Pages 產物
id-token: write # 用於 OIDC 認證完成免金鑰部署
# 避免多個 commit 同時推送時產生並發衝突,自動取消前一個未完成的任務
concurrency:
group: 'pages'
cancel-in-progress: false
jobs:
build:
name: Build Docusaurus
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
# fetch-depth: 0 代表抓取完整 Git 歷史紀錄
# 關鍵:若設為 1,Docusaurus 將無法獲取文件的「最後編輯時間」與「作者資訊」
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm # 自動快取 ~/.npm 目錄,大幅加速 npm ci 時間
- name: Install dependencies
# 使用 npm ci 取代 npm install,依據 package-lock.json 嚴格還原版本
run: npm ci
- name: Build website
# 編譯產生靜態 build/ 目錄
run: npm run build
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: build/ # 指定 Docusaurus 的編譯輸出目錄
deploy:
name: Deploy to GitHub Pages
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4