探索主題

Agent: 探索者 (explorer)
Confidence: 90%
Cost: $0.4404
Duration: 1m 45s
Task ID: e315aece-9471-488d-96ba-96eb47c1ad5f


Now I have all the information needed. Let me compile the exploration report.

探索主題

GitHub Actions 自動化 CI/CD:測試與部署 Telegram Bot

發現

  • 目前無任何 CI/CD:專案沒有 .github/workflows/ 目錄,所有測試和部署都是手動執行。現有的 pre-commit hook(tsgo --noEmit)和 pre-push hook(npm test)僅在本機 git 操作時觸發。

  • 最適方案:Self-hosted Runner on WSL2:由於 Bot 跑在本機 WSL2(不是雲端),最佳路線是在同一台 WSL2 安裝 GitHub Actions self-hosted runner。Push 到 main 時自動:npm ci → tsgo --noEmit → vitest run → git pull → npm start。不需 SSH/rsync,runner 直接存取本機檔案系統。

  • 三階段 Workflow 設計

    1. CI(每次 push/PR)npm ci + tsgo --noEmit + vitest run — 用 GitHub-hosted runner 即可
    2. CD(push to main 通過 CI):觸發 self-hosted runner,git pull + npm ci + 重啟 bot(可用 restart.ts 的 exit code 42 機制或 systemd restart
    3. Blog Deploy(可選):偵測 blog/ 變更時自動 hexo generate + wrangler pages deploy
  • 關鍵安全考量:Self-hosted runner 不應用於 public repo(任何人的 PR 可在你的機器跑任意程式碼)。目前 repo 是 private 所以安全。建議用 ephemeral mode(--ephemeral)避免狀態殘留。

  • 具體 Workflow YAML 範例(CI 階段):

1
2
3
4
5
6
7
8
9
10
11
12
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20 }
- run: npm ci
- run: npm run typecheck
- run: npm test

有趣的連結

  • Self-hosted runner 可以同時作為本機部署器——不需要另外設定 SSH/PM2/systemd,runner 本身就在目標機器上,直接 git pull && npm start 就完成部署
  • 現有的 restart.ts wrapper 已支援 exit code 42 自動重啟,可結合 systemctl restart metacognitive-bot 來實現 zero-downtime deploy

延伸問題

  • 如何在 WSL2 上將 self-hosted runner 設為 systemd service 使其開機自動啟動?
  • 是否該將 Bot 本身也包裝成 systemd service(取代手動 npm start),讓 CI/CD 的 deploy 步驟只需 systemctl restart bot

重要性:4/5

能直接改善專案品質:自動化測試防止回歸、自動部署減少人工操作風險。尤其現在 multi-agent 系統頻繁修改 code,沒有 CI 保護容易出事。

—HANDOFF—
TO: blog-writer
INTENT: handoff
ARTIFACT_TYPE: report
SUMMARY: GitHub Actions CI/CD 自動化部署 Telegram Bot 的探索報告,可寫成技術部落格文章