[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 執行步驟
- Checkout 程式碼: 取得完整的 git 歷史記錄
- 設定 Node.js: 安裝 Node.js 20 並啟用 npm 快取
- 安裝依賴: 執行
npm ci安裝套件 - 執行發布腳本: 運行
scripts/publish-scheduled.mjs檢查並發布排程文章 - 提交變更: 如果有文章被發布,自動 commit 並 push 到 repository
發布腳本
這個 workflow 會執行 scripts/publish-scheduled.mjs 來處理排程發布的邏輯。
為什麼需要自己寫腳本?
因為每個人的部落格架構、frontmatter 格式、檔案結構都不同,市面上沒有現成的工具可以完全符合需求。所以需要根據自己的情況客製化:
- 文章放在哪個目錄?
- 如何標記草稿狀態?(
draft: true?還是其他欄位?) - 如何判斷發布時間?(
publishDate?date?) - 發布時要怎麼修改檔案?(移除 draft?改成
published: true?)
這些都取決於你使用的靜態網站產生器(Astro、Hexo、Hugo 等)和個人配置
腳本的核心邏輯
以這個部落格為例,腳本主要做這幾件事:
- 遞迴掃描:找出文章目錄下所有的
.md和.mdx檔案 - 解析 frontmatter:讀取每篇文章的 metadata
- 檢查草稿狀態:確認文章是否標記為
draft: true - 比對發布時間:解析
publishDate,與目前時間比較 - 更新檔案:如果已到發布時間,將
draft: true從 frontmatter 移除 - 輸出結果:顯示哪些文章被發布了
給想自己實作的人
如果你也想做類似的功能,可以參考這個思路:
- 使用 Node.js 的
fs模組讀寫檔案 - 用正則表達式或 YAML parser 處理 frontmatter
- 注意處理不同作業系統的換行符號(
\nvs\r\n) - 考慮子目錄的遞迴處理
寫完腳本後,別忘了在 workflow 裡面呼叫它:
- run: node scripts/publish-scheduled.mjsCI/CD 流程
這個部落格使用的 CI/CD 流程:
- GitHub Actions: 負責定時檢查並發布排程文章,將變更推送到 repository
- Vercel: 監聽 GitHub repository 的變更,每次 push 後自動觸發重新部署,讓新文章立即上線
這樣的組合實現了全自動的發布流程:
- 設定好文章的
publishDate後,完全不需要人工介入 - 到達發布時間時,GitHub Actions 自動更新文章狀態
- Vercel 偵測到程式碼變更,自動重新建置並部署
- 整個過程從排程到上線完全自動化
總結
透過 GitHub Actions + Vercel 的 CI/CD 配置,實現了部落格文章的全自動排程發布。只需要設定好發布時間,系統就會在指定時間自動完成發布和部署,不需要任何手動操作