1. CI 红了别慌:gh run view 拉日志 + Claude Code 定位的闭环 Debug 是什么
CI 失败这件事,几乎每个写代码的人都经历过。你刚 push 完,去泡了杯咖啡,回来一看 GitHub Actions 上挂着一个红叉。点进去,日志几千行,滚到中间发现一个Type 'undefined' is not assignable to type 'string',再往下翻又是十几条连锁报错,你根本分不清哪个才是真正的第一现场。
这套「gh run view 拉日志 + Claude Code 分析 + 最小修复 + 重新触发 CI」的闭环,解决的就是这个问题。它把原本靠肉眼在几千行日志里捞针的过程,变成结构化的三步:先用 GitHub CLI 把失败日志精确抓下来,再交给 Claude Code 定位第一个真正的失败点并给出最小修复方案,最后本地验证、提交、用gh run watch盯着新一轮 CI 从红变绿。
适合谁?适合所有用 GitHub Actions 做 CI、又不想在日志海洋里泡半小时的前后端开发者。不管你是 TypeScript 项目、Node 服务还是前端构建,只要 CI 跑在 GitHub 上,这套流程就能用。我试过在一个 40 多个 workflow 的 monorepo 里跑这套流程,定位时间从平均 15 分钟压到 3 分钟左右。
核心工具就两个:gh(GitHub 官方 CLI)和 Claude Code(终端里的 AI 编码助手)。中间用 TaoToken 统一 Key 接入,省去每个工具单独配 Key 的麻烦。下面从环境准备开始,一步步把这条闭环搭起来。
2. 前置准备:TaoToken 统一 Key 接入 Claude Code 与 gh CLI 环境
在开始拉日志之前,先把两件事搞定:gh CLI 装好并登录,Claude Code 通过 TaoToken 接入。
2.1 安装并登录 gh CLI
macOS 用 Homebrew:
brew install ghUbuntu/Debian:
sudo apt update sudo apt install gh -yWindows 用 winget:
winget install --id GitHub.cli装完登录:
gh auth login交互式选择 GitHub.com → HTTPS → 用浏览器登录。登录成功后验证:
gh auth status看到Logged in to github.com就对了。这一步是后面所有gh run命令的前提,没登录的话gh run list会直接报 401。
2.2 通过 TaoToken 接入 Claude Code
Claude Code 默认要你配 Anthropic 的 Key。用 TaoToken 的好处是一个 Key 打通多个模型,配置也集中。先拿到 Key:访问https://taotoken.net/api-keys(deep link 带 utm:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite),创建一个新 Key,复制出来。
然后配置 Claude Code 的环境变量。在~/.zshrc或~/.bashrc里加:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的TaoToken密钥"如果你用的是 Claude Code 的 settings 文件方式,编辑~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoToken密钥" } }注意 Base URL 是https://taotoken.net/api,不要加 UTM 参数,那是给网页链接用的。Key 和 Model ID 三件套要配齐:Base URL、API Key、Model ID。Model ID 在 Claude Code 里一般不用手动指定,它会用默认的 Claude 模型;如果你要指定,可以在 settings 里加"model": "claude-sonnet-4-20250514"这类值。
配完重开终端,验证:
claude --version能输出版本号就说明 CLI 装好了。再跑一个简单对话确认 Key 生效:
claude -p "回复 ok"返回ok就说明 TaoToken 接入成功。如果报 401,检查 Key 有没有复制完整、Base URL 有没有写错。
2.3 确认仓库上下文
Claude Code 要在你的项目目录里跑,才能读到代码。先 cd 到项目根:
cd ~/projects/your-repo确认 gh 能识别当前仓库:
gh repo view --json name,defaultBranchRef输出仓库名和默认分支就对了。到这里,gh 和 Claude Code 都准备好了,可以进入实战。
3. 可复制配置:gh run 命令与 Claude Code 提示词模板
这一节把整条闭环里用到的命令和提示词都整理成可直接复制的片段。建议你把它们存成一个ci-debug.sh脚本或者 shell alias,下次 CI 红了直接调用。
3.1 查看最近 CI 运行
gh run list --limit 10输出类似:
STATUS TITLE WORKFLOW BRANCH EVENT ID ELAPSED X fix: user search CI feat/search pull_request 123456789 2m30s ✓ chore: bump deps CI main push 123456788 1m50s找到那个X(failure)的 run ID,比如123456789。
3.2 拉取失败日志
只看失败步骤的日志,这是最关键的过滤:
gh run view 123456789 --log-failed如果不知道 run ID,可以交互式选:
gh run view --log-failed它会列出最近的 run 让你选。把日志存成文件,方便 Claude Code 读取:
gh run view 123456789 --log-failed > ci-failed.log3.3 Claude Code 分析提示词模板
在项目目录里启动 Claude Code:
claude然后贴入这段提示词:
请读取 ci-failed.log,分析 GitHub Actions 失败原因。 要求: 1. 找出第一个真正失败的错误,不要被后续连锁错误干扰。 2. 判断失败类型(TypeScript 类型错误 / ESLint / 单元测试 / 构建 / 依赖 / 环境变量)。 3. 判断是否与当前分支改动有关。 4. 给出最小修复方案。 5. 如果需要修改代码,请先输出计划,不要直接改。3.4 最小修改约束提示词
定位到问题后,用这段约束 Claude Code 只做最小改动:
请只做修复 CI 的最小修改。 限制: 1. 不要重构无关代码。 2. 不要修改业务逻辑,除非失败原因就是业务逻辑错误。 3. 不要引入新依赖。 4. 不要修改测试期望,除非能证明原测试已不符合需求。 5. 修改后请说明改动原因。3.5 本地验证与提交
npm run lint npm run test npm run build三个都过了再提交:
git add . git commit -m "fix: resolve ci failure" git push3.6 等待新一轮 CI
gh run watch它会实时刷新当前分支最新 run 的状态,红了绿了一眼看到。如果要重跑失败的 run:
gh run rerun 1234567893.7 生成 CI 修复报告并评论到 PR
claude -p "请根据当前 git diff 和 ci-failed.log,生成 CI 修复说明。格式:1.失败原因 2.修复方式 3.修改文件 4.已运行测试 5.是否存在风险" > ci-fix-summary.md gh pr comment --body-file ci-fix-summary.md这套配置里,TaoToken 的 Key 只需要配一次,Claude Code 和后续任何走 Anthropic 接口的工具都能复用。如果你还想在别的编辑器里用同一个 Key,去https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite能看到用量和 Key 管理。
4. 验证请求:一次从红到绿的完整闭环演示
光看配置不够,走一遍真实流程。假设你在feat/user-search分支上推了个 commit,CI 挂了。
4.1 发现失败
gh run list --limit 5输出:
STATUS TITLE WORKFLOW BRANCH EVENT ID ELAPSED X feat: user search CI feat/search pull_request 123456789 2m18s拿到 run ID123456789。
4.2 拉日志
gh run view 123456789 --log-failed > ci-failed.log wc -l ci-failed.log假设输出342 ci-failed.log,342 行,比几千行好多了。
4.3 交给 Claude Code
claude贴入 3.3 的提示词。Claude Code 读完ci-failed.log后,输出类似:
第一个真正失败的错误: src/services/user.service.ts:42:5 Type 'undefined' is not assignable to type 'string'. 失败类型:TypeScript 类型错误 与当前分支改动有关:是,本次改动新增了 getUserName 方法 最小修复方案: 在 user.service.ts 第 42 行,getUserName 的返回类型声明为 string, 但 user.nickname 可能为 undefined。建议改为: return user.nickname ?? user.username; 或调整返回类型为 string | undefined。 计划: 1. 修改 src/services/user.service.ts 第 42 行 2. 不改动其他文件 3. 本地跑 npm run build 验证4.4 应用修复
确认计划合理后,让 Claude Code 执行:
按上述计划修改,只改 user.service.ts 第 42 行。Claude Code 改完后,你 review 一下 diff:
git diff确认只动了一行,没有夹带私货。
4.5 本地验证
npm run build npm run test npm run lint三个都绿了。如果 test 挂了,说明修复引入了新问题,回到 Claude Code 继续分析。
4.6 提交并触发新一轮 CI
git add src/services/user.service.ts git commit -m "fix: handle undefined nickname in getUserName" git push4.7 盯 CI
gh run watch终端会实时刷新:
✓ feat/search CI · 123456790 ✓ Set up job ✓ Install dependencies ✓ Lint ✓ Test ✓ Build从红到绿,整个闭环走完。这一轮里,你手动做的事只有:拉日志、贴提示词、review diff、push。定位和修复方案都是 Claude Code 给的,你负责把关。
4.8 生成修复报告
claude -p "请根据当前 git diff 和 ci-failed.log,生成 CI 修复说明。格式:1.失败原因 2.修复方式 3.修改文件 4.已运行测试 5.是否存在风险" > ci-fix-summary.md gh pr comment --body-file ci-fix-summary.mdPR 上就多了一条结构化的修复说明,reviewer 一眼看懂改了什么、为什么改、验证了什么。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这套流程跑起来,最容易卡在几个固定报错上。逐个拆。
5.1 401 Unauthorized
现象:gh run list或 Claude Code 请求时报 401。
原因分两种:
如果是gh报 401,说明 gh 没登录或 token 过期:
gh auth status看到not logged in就重新gh auth login。
如果是 Claude Code 报 401,说明 TaoToken Key 没配好。检查:
echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_API_KEYBase URL 应该是https://taotoken.net/api,Key 应该是sk-开头。如果 Base URL 末尾多了斜杠或者带了 UTM 参数,改成干净的https://taotoken.net/api。Key 如果复制时带了空格,删掉重贴。
5.2 local proxy failed
现象:Claude Code 启动时报local proxy failed或连接被拒。
原因:通常是环境变量里配了本地代理地址,但代理没跑。检查:
env | grep -i proxy如果有HTTP_PROXY或HTTPS_PROXY指向127.0.0.1:xxxx,而那个端口没有服务在听,就会报这个。解决方式是清掉这些变量:
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY然后重开终端。注意,TaoToken 的接入不需要任何本地代理,直接走https://taotoken.net/api就行。
5.3 reading choices 报错
现象:Claude Code 在分析日志时输出reading choices相关错误,或者卡在读取文件阶段。
原因:通常是ci-failed.log文件太大,或者路径不对。Claude Code 读文件时如果文件超过上下文窗口,会截断或报错。先确认文件存在且在项目目录:
ls -la ci-failed.log如果文件几百 KB,先精简:
grep -n "error\|Error\|FAIL\|failed" ci-failed.log | head -50 > ci-failed-trimmed.log把精简后的文件给 Claude Code。另外确认你是在项目根目录启动的claude,不然它读不到相对路径。
5.4 OAuth 相关报错
现象:gh命令报 OAuth token 相关错误,比如OAuth token is invalid。
原因:gh 的 OAuth token 过期或被撤销。重新登录:
gh auth logout gh auth login如果公司环境用 SSO,可能需要在 GitHub 网页端重新授权 gh CLI。登录后gh auth status确认 scopes 里有repo和workflow,没有workflow的话gh run rerun会失败。
5.5 CC Switch / Cline MCP / Codex auth.json 三件套
如果你同时用 CC Switch 管理多个 Claude Code 配置,或者用 Cline 的 MCP、Codex 的auth.json,记住三件套必须一致:Base URL、Key、Model ID。
CC Switch 里配置 TaoToken:
Base URL: https://taotoken.net/api API Key: sk-你的TaoToken密钥 Model ID: claude-sonnet-4-20250514Cline 的 MCP 配置里,如果走 Anthropic 兼容接口,同样填这三个。Codex 的~/.codex/auth.json:
{ "openai_api_key": "sk-你的TaoToken密钥", "base_url": "https://taotoken.net/api" }三件套任何一个写错,都会报 401 或 model not found。改完记得重启对应的工具。
5.6 gh run view 报 no runs found
现象:gh run view --log-failed说找不到 run。
原因:当前分支没有 CI run,或者 run 已经过期被清理。先gh run list --branch $(git branch --show-current)确认当前分支有没有 run。如果没有,可能是 workflow 没触发,检查.github/workflows/里的触发条件。
6. 把闭环用起来:从手动到半自动的下一步
走到这里,你已经有一条能跑的闭环了:gh run list找失败 →gh run view --log-failed拉日志 → Claude Code 分析 → 最小修复 → 本地验证 → push →gh run watch盯结果。
下一步可以把它半自动化。比如写个 shell 函数放进~/.zshrc:
ci-debug() { local run_id=$(gh run list --limit 1 --json databaseId --jq '.[0].databaseId') gh run view "$run_id" --log-failed > ci-failed.log echo "日志已保存到 ci-failed.log,run ID: $run_id" claude -p "请读取 ci-failed.log,分析失败原因并给出最小修复计划。" }下次 CI 红了,直接敲ci-debug,日志自动拉好,Claude Code 自动分析。你只需要 review 计划、应用修改、push。
再进一步,可以把修复报告自动评论到 PR,甚至用gh run rerun在修复后自动重跑。但别一上来就全自动,先手动跑通几轮,确认 Claude Code 的分析质量稳定,再逐步加自动化。CI 修复最忌讳的是让 AI 大改代码,所以提示词里的「最小修改」约束一定要保留。
如果你还没配 TaoToken,去https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite拿个 Key,按第 2 节的配置接上。想先试试模型对话效果,可以走https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite。长期做编码和 Agent 的话,Coding Plan 在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,Claude Code 专项配置看https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite。
最后留一个我踩过的坑:gh run view --log-failed有时候会把多个 job 的日志混在一起,第一个error不一定是根因。让 Claude Code 分析时,明确要求它「找第一个真正失败的错误,忽略连锁错误」,这一步能省掉大量误判。