探索主題

Agent: 探索者 (explorer)
Confidence: 86%
Cost: $0.4899
Duration: 1m 38s
Task ID: df04c63f-0aa0-4baf-b2fd-3046797496e4


現在我有足夠資訊來撰寫報告了。Bot 跑在 WSL2 本機上,沒有 Docker / systemd / PM2,也沒有自動部署 workflow。


探索主題

探索 — GitHub Actions 自動化 CI/CD 部署 Telegram Bot

發現

  1. 專案已有 CI + 靜態站部署ci.yml(typecheck + test + build)、deploy-blog.ymldeploy-report.yml(Cloudflare Pages),但 Bot 本體沒有自動部署 workflow——目前是 WSL2 本機手動 npm startnpm run dev

  2. 主流做法是 SSH + PM2/systemd:用 appleboy/ssh-action@v1 SSH 進 VPS,執行 git pull → npm ci → pm2 restart。但我們的 Bot 跑在 WSL2 本機,不是 VPS,這條路不直接適用。

  3. 另一種做法:Self-hosted Runner:在 WSL2 機器上裝 GitHub Actions self-hosted runner,push 到 main 時自動在本機跑 git pull && npm ci && pm2 restart bot。這最符合我們的架構(本機長駐 process + restart.ts wrapper)。

  4. 具體可行方案

    • 安裝 self-hosted runner(actions/runner)在 WSL2
    • 新增 deploy-bot.ymlruns-on: self-hosted
    • 步驟:checkout → npm ci → 通知 restart.ts 重啟(kill → exit 42 → wrapper 自動重啟)
    • kill -SIGUSR2 $(cat bot.pid) 觸發 graceful restart
  5. Telegram 通知整合:用 appleboy/telegram-action@master 在 deploy 成功/失敗後推送通知到管理員 chat,閉環整個 CI/CD 流程。

有趣的連結

  • 我們的 restart.ts 已經實作了 exit code 42 = 自動重啟的機制,這和 CI/CD 的 rolling restart 概念天然契合——只需要讓 CI 觸發一個 graceful shutdown 信號,wrapper 就會自動拉起新版本。
  • Cloudflare Pages 部署(blog/report)已經是最佳實踐了(path filter + wrangler-action),Bot 部署可以沿用同樣的模式。

延伸問題

  • Self-hosted runner 安全性:在本機跑 runner 等於允許 GitHub 在本機執行任意指令,如何用 runner group + label 限制只跑信任的 workflow?
  • Bot 零停機部署:目前 restart.ts 重啟有 2 秒空窗,是否能用 grammY 的 bot.stop() → 排空佇列 → 重啟,實現真正的 graceful restart?

重要性:4/5

直接改善開發效率和部署可靠性。目前手動部署容易遺漏步驟(忘記 npm ci、忘記重啟),自動化後每次 push 自動測試+部署,品質和速度都有保障。Self-hosted runner 方案完全可行,預估半天內可完成設定。