探索主題

Agent: 探索者 (explorer)
Confidence: 73%
Cost: $0.5990
Duration: 2m 18s
Task ID: 37b84c5f-c331-41a4-b952-40f2d9cce684


Good — now I have a clear picture. The project already has CI (typecheck + test) and blog/report deploy workflows, but is missing the CD step for the bot itself. Let me finalize my findings.

探索主題

探索 — GitHub Actions 自動化 CI/CD 部署 Telegram Bot 的現狀與缺口

發現

  1. CI 已完成(Phase 1 已落地).github/workflows/ci.yml 在每次 push/PR 時跑 npm citypecheckvitest,用 GitHub-hosted ubuntu-latest,含 npm cache 加速。

  2. Blog + Report 自動部署已完成deploy-blog.ymldeploy-report.yml 監聽各自 source/** 路徑變更,自動 hexo generatewrangler pages deploy,使用 cloudflare/wrangler-action@v3,secrets 透過 GitHub Secrets 注入。

  3. Bot 本體的 CD 是唯一缺口:CI 通過後,Bot 部署仍是手動(Ctrl+Cnpm start)。原因是 Bot 跑在 WSL2 本機,不是雲端服務。解決方案是 Self-hosted Runner:在同一台 WSL2 裝 runner,CI 通過後觸發 workflow_rungit pull && npm ci && systemctl restart

  4. workflow_run 是串接 CI→CD 的正確機制on: workflow_run: workflows: ["CI"] + types: [completed] + if: conclusion == 'success',讓 CD 只在 CI 全過的 main push 才觸發。

  5. 安全考量:Private repo 使用 self-hosted runner 安全;若未來開源需改用 --ephemeral 模式(每次 job 完即銷毀 runner 環境)。Runner registration token 不可 commit 進 repo。

有趣的連結

  • restart.ts 的 exit code 42(蛻皮重啟)可以和 systemd 的 RestartPreventExitStatus=0 + Restart=on-failure 共存——systemd 管理生命週期,restart.ts 管理蛻皮邏輯,兩者不衝突。
  • GitHub Actions 免費額度:Private repo 每月 2,000 分鐘,以目前的 push 頻率(日均 10+ 次)大約消耗 300-500 分鐘/月,充足。

延伸問題

  1. Self-hosted runner 安裝 + systemd service 配置的具體步驟是什麼? WSL2 的 systemd 支援(2022 年加入)是否穩定到可以同時管理 runner 和 bot 兩個 service?
  2. Bot CD workflow 應該如何處理 .envsoul/ 的保護? deploy step 做 git pull 時不能覆蓋本機的 .envsoul/(這些不在 repo 裡但需要確認 .gitignore 正確)。

素材重疊度評估

已發布文章 ci-cd-self-hosted-runner-wsl2-2026-03-01.md 覆蓋了本報告 80% 的內容(三層架構、安全考量、systemd 整合)。本次探索的增量發現:現有 CI/CD 已實作 2/3(CI + 靜態站部署),僅差 Bot CD。不建議再寫新文章,適合在實際實作 CD 後撰寫跟進文。

重要性:4/5

Bot 自動部署是目前系統自動化的最後一塊拼圖,直接改善開發品質和部署效率。

—HANDOFF—
TO: pm
INTENT: handoff
ARTIFACT_TYPE: analysis
SUMMARY: CI/CD 現狀分析完成——CI 和靜態站部署已落地,Bot 本體 CD(self-hosted runner + systemd)是唯一待實作缺口,建議排入待辦