用 dsh-ci-doctor 在打開日誌前診斷 GitHub Actions 失敗

前言

CI 紅了之後,常見動作是打開 GitHub Actions,點進失敗的 job,在幾千行日誌裏找真正的報錯。時間戳、容器 id、重試序號會把同一類失敗拆成看起來完全不同的幾段文字,翻完一輪還不一定分得清是測試掛了、依賴拉不下來,還是基礎設施超時。

DeepSeek Harness(dsh)的架構是「一切皆插件」:工具、會話、技能都可以以外掛形式接到智能體循環裏。社區站點 DeepSeek Harness 插件庫 收錄了大量這類插件,它是獨立目錄,與 DeepSeek / 幻方沒有官方從屬關係。其中 dsh-ci-doctor 做的事情很具體:監視 GitHub Actions 上新出現的失敗,把原始構建日誌收成對話裏的診斷卡,並給錯誤做歸一化簽名。

本文依據插件目錄頁、GitHub 倉庫 README(含中文版)、npm 頁面和 DeepSeek Harness 官方倉庫 交叉覈對後整理。

這是什麼

dsh-ci-doctor 是一款 DeepSeek Harness 插件,由 jkrandom-sudo 維護,許可證爲 MIT,主要語言是 TypeScript。社區目錄把它歸在「會話與消息」分類;截至 2026-08-18,GitHub 星標爲 3。npm 上當前版本是 0.1.2(2026-08-14 發佈)。

它解決的是「日誌還沒打開,先把失敗說清楚」這件事。插件向智能體註冊兩個工具:ci_watch 負責盯新失敗,ci_diagnose 負責出診斷卡。底層只通過本機已登錄的 GitHub CLI(gh)調用 gh api 讀取狀態,不另配一套 GitHub Token。

核心功能

監視新失敗:ci_watch

ci_watch 會啓動一個後臺作業,按間隔輪詢 GitHub Actions。第一次輪詢只建立基線,歷史上已經紅掉的運行不會當成新告警。可以顯式傳入 repo,也可以省略,監視當前工作目錄所在倉庫。

README 給出的調用參數形如:

{ "repo": "owner/name", "branch": "main", "intervalSeconds": 30, "timeoutMinutes": 60 }

目錄頁和 README 對行爲邊界寫得很清楚:

  • 狀態行隨時可讀,作業可以隨時取消。
  • 瞬時錯誤指數退避;連續 5 次失敗則放棄;認證錯誤立即失敗。
  • 發現新失敗後,會給出下一步:對對應 reporunId 調用 ci_diagnose

結構化診斷:ci_diagnose

ci_diagnose 可以指向某一次運行,也可以默認取最近一次失敗運行。返回的是一張 markdown 診斷卡,出現在對話裏,而不是讓你自己去 Actions 頁面翻日誌。

參數示例:

{ "repo": "owner/name", "runId": 31782742089 }

診斷卡里會包含這些已覈實的內容:

  • 歸一化錯誤簽名:掩碼時間戳、十六進制 id 和數字,同一類失敗在不同運行裏得到同一個 id。
  • 失敗類別:test / build / lint / typecheck / dependency / network / permission / timeout / infra。
  • 嫌疑文件:從日誌裏挖路徑,並自動剔除 vendor 路徑。
  • 日誌摘錄:按預算裁剪,用 … (skipped N lines) … 標明跳過了多少行,文檔寫明不會編造內容。

倉庫 README 裏的示例卡如下(示例倉庫是 cli/cli,來自項目文檔,不是筆者實測):

## CI diagnosis: cli/cli run #31782742089

**Conclusion:** failure · [run](https://github.com/cli/cli/actions/runs/31782742089)

### Job: Issue Triage (skills-driven)

**Failed steps:** triage
**Signatures:**

- `81a0edf32878` (timeout, first time seen) — server:http_server Session timeout configured…
  **Suspect files:** `script/triage.ts`

失敗簽名賬本

每個診斷過的簽名會被記住:見過幾次、首次和最近出現時間、最近一次所在倉庫和運行鏈接。復發時報告裏會寫成 seen 3×,而不是當成全新問題。

持久化依賴宿主是否提供 storage domain:有的話寫入 DSH 存儲目錄下的 ci_doctor 單元;沒有則只放在內存裏。配置項 ledgerEnabled 默認開啓。

只讀契約

兩個工具按文檔約定只讀 GitHub 狀態,不會 push、合併、取消、重跑,也不會改倉庫內容。每條結果帶 repositoryWrites: false。包裏還導出可選伴隨插件 dsh-ci-doctor/invariant:在提供 invariants 服務的宿主上,如果這個標記丟了會直接報錯。倉庫的 cordis.patch.yml 註明,默認 web/base profile 沒有該服務,所以 invariant 沒有寫進默認補丁,以免卡住啓動。

安裝與啓用

社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行:

dsh plugin add github:jkrandom-sudo/dsh-ci-doctor

需要可復現安裝時,按目錄頁說明固定 commit 哈希(把 commit 換成實際哈希):

dsh plugin add github:jkrandom-sudo/dsh-ci-doctor#commit

倉庫 README 另外寫了一種按 npm 包名、指定 web profile 的裝法:

dsh plugin --profile web add dsh-ci-doctor

兩種寫法都能在公開資料裏找到。目錄頁命令以頁面原文爲準;若你平時用 web profile 裝 npm 插件,可以對照 README。

前置條件:本機已安裝並登錄 GitHub CLI

gh auth login

插件複用這次登錄會話,README 寫明沒有其他必填配置。

可調選項(README 與源碼 src/config.ts 一致):

選項 默認值 含義
pollIntervalSeconds 30 監視輪詢間隔(秒,最小 5)
watchTimeoutMinutes 60 單次監視存活時長(分鐘,最小 1)
maxLogLines 200 每個失敗 job 的日誌摘錄行數(最小 20)
ghBin gh GitHub CLI 可執行文件
ledgerEnabled true 是否把簽名寫入賬本

典型用法

裝好後用自然語言即可,README 給出的對應關係是:

  1. 「幫我盯着這個倉庫的 CI,掛了告訴我」→ 啓動 ci_watch 後臺作業。
  2. 「nightly 構建爲什麼掛了?」→ 對最近一次失敗運行跑 ci_diagnose
  3. 「診斷一下 cli/cli 的 31782742089 這次運行」→ 針對指定 run 做定向診斷。

監視發現新失敗後,作業會收尾成調用 ci_diagnose 的下一步,智能體可以接着把診斷卡貼進對話。

適用場景與注意事項

比較適合這些情況:

  • 日常在 dsh 裏寫代碼,希望 CI 紅燈先變成結構化摘要,而不是先打開 Actions。
  • 同一類失敗反覆出現,需要靠歸一化簽名和賬本判斷是不是老問題。
  • 只想讀日誌、定位類別和嫌疑文件,不希望插件去改遠程倉庫。

使用前要注意:

  1. 權限與安全。 目錄頁寫明:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查 GitHub 源碼倉庫和許可證(本插件爲 MIT)。
  2. 只覆蓋 GitHub Actions。 文檔描述的是通過 gh api 讀 GitHub 狀態,不要把它理解成通用的 Jenkins / GitLab CI 診斷器。
  3. 它不負責修代碼。 工具是隻讀的,不會重跑 workflow,也不會自動提交修復;後續改代碼仍由智能體或開發者完成。
  4. 依賴本機 gh 登錄。 認證失敗會立即退出監視,沒有登錄就談不上輪詢。
  5. 賬本不一定落盤。 沒有 storage domain 時只在內存裏,進程重啓後復發統計會丟。
  6. 社區插件,不是官方應用商店貨架。 DeepSeek Harness 官方倉庫強調一切皆插件;本插件由社區維護者發佈,目錄站也是獨立站點。

小結

dsh-ci-doctor 把「盯 CI」和「讀日誌」收成兩個工具:ci_watch 只報告基線之後的新失敗,ci_diagnose 把原始日誌收成帶簽名、類別、嫌疑文件和誠實摘錄的診斷卡。對經常在 GitHub Actions 上翻紅燈的 dsh 用戶,它省掉的是打開日誌之前那一輪檢索,而不是替你改倉庫。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-ci-doctor/

GitHub:https://github.com/jkrandom-sudo/dsh-ci-doctor

npm:https://www.npmjs.com/package/dsh-ci-doctor

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜