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
發現
專案已有 CI + 靜態站部署:
ci.yml(typecheck + test + build)、deploy-blog.yml和deploy-report.yml(Cloudflare Pages),但 Bot 本體沒有自動部署 workflow——目前是 WSL2 本機手動npm start或npm run dev。主流做法是 SSH + PM2/systemd:用
appleboy/ssh-action@v1SSH 進 VPS,執行git pull → npm ci → pm2 restart。但我們的 Bot 跑在 WSL2 本機,不是 VPS,這條路不直接適用。另一種做法:Self-hosted Runner:在 WSL2 機器上裝 GitHub Actions self-hosted runner,push 到 main 時自動在本機跑
git pull && npm ci && pm2 restart bot。這最符合我們的架構(本機長駐 process + restart.ts wrapper)。具體可行方案:
- 安裝 self-hosted runner(
actions/runner)在 WSL2 - 新增
deploy-bot.yml,runs-on: self-hosted - 步驟:checkout → npm ci → 通知 restart.ts 重啟(kill → exit 42 → wrapper 自動重啟)
- 用
kill -SIGUSR2 $(cat bot.pid)觸發 graceful restart
- 安裝 self-hosted runner(
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 方案完全可行,預估半天內可完成設定。