skip to content
BlogZzz

[Dev] GitHub Actions 自動排程發文設定

/ 5 min read

Table of Contents

這篇文章介紹這個部落格使用的 GitHub Actions Workflow,用來自動排程發布文章

Workflow 檔案位置

.github/workflows/publish-scheduled.yml

主要功能

這個 workflow 每天自動檢查是否有排程發布的文章,並在指定的發布時間自動將文章公開。

本站 Blog 配置解析

name: Publish Scheduled Posts
on:
schedule:
- cron: "0 16 * * *"
workflow_dispatch:
permissions:
contents: write
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: node scripts/publish-scheduled.mjs
- name: Commit and push changes
run: |
git add src/content/post
if git diff --cached --quiet; then
exit 0
fi
git -c user.name="github-actions[bot]" -c user.email="github-actions[bot]@users.noreply.github.com" commit -m "chore: publish scheduled posts"
git push

各區塊說明

觸發條件 (on)

on:
schedule:
- cron: "0 16 * * *"
workflow_dispatch:
  • schedule: 使用 cron 表達式設定定時執行
    • 0 16 * * *: 每天 UTC 16:00 (台灣時間午夜 12 點)執行 (但之前經驗是沒有那麼準時,通常我也睡了也不確定幾點)
  • workflow_dispatch: 允許手動觸發 workflow

權限設定 (permissions)

permissions:
contents: write

給予 workflow 寫入 repository 內容的權限,這樣才能提交變更。

Job 執行步驟

  1. Checkout 程式碼: 取得完整的 git 歷史記錄
  2. 設定 Node.js: 安裝 Node.js 20 並啟用 npm 快取
  3. 安裝依賴: 執行 npm ci 安裝套件
  4. 執行發布腳本: 運行 scripts/publish-scheduled.mjs 檢查並發布排程文章
  5. 提交變更: 如果有文章被發布,自動 commit 並 push 到 repository

發布腳本

這個 workflow 會執行 scripts/publish-scheduled.mjs 來處理排程發布的邏輯。

為什麼需要自己寫腳本?

因為每個人的部落格架構、frontmatter 格式、檔案結構都不同,市面上沒有現成的工具可以完全符合需求。所以需要根據自己的情況客製化:

  • 文章放在哪個目錄?
  • 如何標記草稿狀態?(draft: true?還是其他欄位?)
  • 如何判斷發布時間?(publishDatedate?)
  • 發布時要怎麼修改檔案?(移除 draft?改成 published: true?)

這些都取決於你使用的靜態網站產生器(Astro、Hexo、Hugo 等)和個人配置

腳本的核心邏輯

以這個部落格為例,腳本主要做這幾件事:

  1. 遞迴掃描:找出文章目錄下所有的 .md.mdx 檔案
  2. 解析 frontmatter:讀取每篇文章的 metadata
  3. 檢查草稿狀態:確認文章是否標記為 draft: true
  4. 比對發布時間:解析 publishDate,與目前時間比較
  5. 更新檔案:如果已到發布時間,將 draft: true 從 frontmatter 移除
  6. 輸出結果:顯示哪些文章被發布了

給想自己實作的人

如果你也想做類似的功能,可以參考這個思路:

  • 使用 Node.js 的 fs 模組讀寫檔案
  • 用正則表達式或 YAML parser 處理 frontmatter
  • 注意處理不同作業系統的換行符號(\n vs \r\n
  • 考慮子目錄的遞迴處理

寫完腳本後,別忘了在 workflow 裡面呼叫它:

- run: node scripts/publish-scheduled.mjs

CI/CD 流程

這個部落格使用的 CI/CD 流程:

  1. GitHub Actions: 負責定時檢查並發布排程文章,將變更推送到 repository
  2. Vercel: 監聽 GitHub repository 的變更,每次 push 後自動觸發重新部署,讓新文章立即上線

這樣的組合實現了全自動的發布流程:

  • 設定好文章的 publishDate 後,完全不需要人工介入
  • 到達發布時間時,GitHub Actions 自動更新文章狀態
  • Vercel 偵測到程式碼變更,自動重新建置並部署
  • 整個過程從排程到上線完全自動化

總結

透過 GitHub Actions + Vercel 的 CI/CD 配置,實現了部落格文章的全自動排程發布。只需要設定好發布時間,系統就會在指定時間自動完成發布和部署,不需要任何手動操作