本教程聚焦 Claude Code 在 Agent 模式与自动化 领域的"上云"场景:不再在终端里手动驱动,而是把它挂进 CI/CD 流水线 和 定时调度系统,让它在你睡觉时审查 PR、自愈 Lint、巡检代码健康度。我们将覆盖两条主路径——基于 -p Headless 模式的 GitHub Actions 自建流水线,以及 Anthropic 2026 年 4 月推出的 Claude Code Routines 云端定时 Agent——并给出一个可直接套用的"每周代码健康巡检"完整案例。适合已掌握 Claude Code 交互用法、希望把 Agent 推向无人值守自动化的开发者和 DevOps 工程师。
npm i -g @anthropic-ai/claude-code),能跑通 claude -p "hello" 的一次性调用claude 完成登录(CI 中建议用 API Key)很多人一上来就写 YAML,结果发现做出来的东西又贵又脆。Claude Code 的 CI/自动化其实有三条不同层次的实现路径,先选对路径能省掉 80% 的返工:
| 路径 | 运行位置 | 适合场景 | 状态管理 | 成本 |
|---|---|---|---|---|
GitHub Actions + -p Headless |
GitHub Runner | PR 审查、Lint 自愈、push 触发的确定性检查 | 无状态,每次冷启 | Actions 分钟数 + API Token |
| Claude Code Routines(2026.4) | Anthropic 云端容器 | 定时(cron)/ Webhook / GitHub 事件触发的巡检、摘要、分类 | 单次运行内,最长 2 小时 | API Token + $0.08/运行小时 |
| Claude Managed Agents | Anthropic 云端 | 长时间(>2h)、有持久状态、自定义 MCP 的复杂工作流 | 持久状态卷 | API Token + 运行小时 |
一个简单的判断准则:如果任务你已经能用一句 Claude Code 会话描述清楚,且希望它定时跑,就用 Routines;如果它必须卡在 git 事件(PR/push)上做确定性检查,就用 Actions;如果它要跑好几个小时还带自定义 MCP,就用 Managed Agents。
本文重点覆盖前两条路径,因为它们是"把本地 Agent 经验迁移到无人值守"时成本最低、ROI 最高的两种。
flowchart TD
A[我要自动化一个 Claude Code 任务] --> B{触发方式是什么?}
B -->|PR/push 等确定性 git 事件| C[GitHub Actions + -p Headless]
B -->|定时 cron / Webhook / GitHub 事件| D[Claude Code Routines]
B -->|长时运行+持久状态+自定义MCP| E[Managed Agents]
C --> F{是否要改代码?}
F -->|只读审查| G[contents: read + PR 评论]
F -->|要提交修复| H[contents: write + skip-ci]
D --> I[云端容器: 系统/输入/输出/触发器]
CI 场景下你几乎不会用交互式 TUI,而是用 -p(即 --print)让 Claude Code 处理单个 prompt 后立即退出。下面是 CI 中最常用的几个开关,建议把它们当作"自动化挡位盘"来记:
# 最小可用:单 prompt,纯文本输出
claude -p "总结当前仓库的目录结构"
# CI 标配:结构化 JSON 输出 + 限制工具 + 限制轮次
claude -p "审查这个 diff 的潜在 bug" \
--output-format json \
--allowed-tools "Read,Bash(git diff:*)" \
--max-turns 8
# 续跑:基于上次会话继续(长任务分片)
claude -p "继续上次的迁移工作" --resume <session_id>
# 权限模式:CI 里通常用 acceptEdits 让它能自动改文件
claude -p "修复所有 lint 错误" --permission-mode acceptEdits
各参数在 CI 中的作用:
| 参数 | CI 中的作用 | 推荐取值 |
|---|---|---|
-p / --print |
非 TTY 环境、单轮执行后退出 | CI 必加 |
--output-format json |
把结果喂给下游脚本/解析;含 token、工具调用等元数据 | 需要解析时加 |
--allowed-tools |
白名单工具,最小权限原则 | 只给任务必需的 |
--disallowed-tools |
黑名单(如禁 Write 做只读审查) |
审查类任务必加 |
--max-turns |
硬上限,防 Agent 陷入死循环烧钱 | 审查 5–10,修复 15–25 |
--permission-mode |
acceptEdits(CI 改码)/ plan(只规划)/ bypassPermissions(危险,慎用) |
改码用 acceptEdits |
--resume / -r |
续接指定会话,长任务断点续跑 | 分片长任务时用 |
常见问题:CI 里报 Failed to enable TUI 之类错误?原因是你用了交互模式。解法就是一律加 -p。另一个高频坑是 Agent 在 CI 里无限循环——务必给 --max-turns 兜底。
最经典、ROI 最高的 CI 集成:PR 一开/一更新,Claude Code 自动读 diff 并评论。先做三件准备工作:
ANTHROPIC_API_KEYcontents: read + pull-requests: writeactions/checkout 时设 fetch-depth: 0,让 Agent 能拿到完整 diff 上下文最小可用的审查工作流:
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: read
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Run code review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
DIFF=$(git diff origin/${{ github.base_ref }}...HEAD)
claude -p "审查以下 diff 中的明显 bug、缺失的错误处理和潜在安全问题。\
输出精简的发现列表;若无问题输出 'No issues found'。Diff: $DIFF" \
--output-format json \
--allowed-tools "Read" \
--max-turns 8 \
| tee review-output.json
预期结果:每次 PR 触发后,Actions 日志里出现一段 JSON,其中 result 字段是审查意见。结合 GitHub 官方的 anthropics/claude-code-action,可以把这段结果自动转成 PR review comment。
常见问题:审查跑得太慢、太贵?原因是没做 path filtering——每个 commit 都跑一遍。解法是给 on.pull_request 加 paths 过滤,只在 src/** 等关键路径变化时触发:
on:
pull_request:
paths:
- 'src/**'
- '!**/*.md'
审查只是评论,真正省事的是让 Claude Code 直接改代码并提交回分支。这里有两个关键点:用 contents: write 权限 + --permission-mode acceptEdits,以及用 [skip ci] 防止无限循环。
name: Auto-fix linting
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: write
jobs:
autofix:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Fix linting errors
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
claude -p "运行 'npm run lint -- --fix',然后检查是否仍有无法自动修复的 lint 错误并列出。\
若全部干净,输出 'All clean.'" \
--permission-mode acceptEdits \
--allowed-tools "Bash,Edit,Read" \
--max-turns 15
- name: Commit changes
run: |
git config user.name "claude-bot"
git config user.email "[email protected]"
git add -A
git diff --staged --quiet || git commit -m "chore: auto-fix lint errors [skip ci]"
git push
关键点解读:
ref: ${{ github.head_ref }} 确保检出的是 PR 分支而非默认分支git diff --staged --quiet || 这个短路逻辑:没有改动就不提交,避免空 commit[skip ci] 是这一步的灵魂——否则提交会再次触发本工作流,形成 Agent 自我触发的死循环常见问题:跑了一次后发现 Claude 把不该改的文件也改了?根因是 --allowed-tools 给太宽。解法是收紧到 Bash(npm run lint:*) 这种带前缀限制的精确工具授权,只允许它跑 lint 相关命令。
第三种 CI 模式价值最高却最容易被忽视:没人 push 也定时跑的"家务活"。把 on: 从 pull_request 换成 schedule 即可:
on:
schedule:
- cron: '0 2 * * 0' # 每周日凌晨 2 点 UTC
workflow_dispatch: {} # 同时允许手动触发,方便调试
实践里最稳的几类定时任务:
| 任务 | 频率 | 目标范式 |
|---|---|---|
| 依赖升级 | 每周日 | 升 minor/patch、跑测试、列出失败项 |
| 文档新鲜度 | 每月 | 找 6 个月未动的 /docs,标记过时 API 引用 |
| 死代码扫描 | 双周 | 找无调用方的导出函数,列出可删除候选 |
| 测试缺口 | 每周 | 找 0% 覆盖的文件,为 import 数 top5 写冒烟测试 |
注意:GitHub Actions 跑这种"静默后台任务"在规模化后有两个硬伤——CI 分钟费贵、且除了 Actions 日志没有结构化运行历史。当定时任务超过 3–5 个时,把这类持久后台任务迁到下一节的 Routines,架构会干净很多。
这是本教程的"新特性主角"。Routines 是 Anthropic 在 2026 年 4 月推出的产品,把一个你已经在写的 Claude Code 会话,直接变成云端可调度的自治 Agent,无需自建 cron、无需配 Runner、无需写胶水代码。
一个 Routine 的本质是几样东西的打包:
触发器一 fire,Anthropic 就拉起一个 Claude Code 容器、加载你的 Routine、传入输入、跑到完成,最后持久化输出或通过 Webhook 暴露。下面是官方高频用法"每晚依赖升级 PR"的 Routine 定义(YAML 为示意结构):
name: nightly-dep-bumps
trigger:
cron: "0 3 * * *" # 每天凌晨 3 点
timezone: America/Los_Angeles
mcp_servers:
- github
- bash
model: haiku-4-5 # 分类/摘要类用便宜模型
system_prompt: |
检查本仓库中安全的 minor/patch 依赖升级。对每个:
1. 在新分支上应用升级
2. 运行测试套件(npm test 或 pytest)
3. 若测试通过,开一个带变更摘要的 PR
4. 若测试失败,丢弃分支并记录失败
不要做 major 版本升级,单次运行不超过 5 个包。
outputs:
on_complete:
post_to_slack:
channel: "#dep-upgrades"
关键能力与限制(2026 年 4 月口径):
| 项目 | 数值 |
|---|---|
| 单次最长运行 | 2 小时(Managed Agents 是 24 小时) |
| 并发运行数 | 每工作区 100 |
| 工作区 Routine 上限 | 500 |
| 输出产物大小 | 500 MB |
| 容器冷启动 | 典型 ~8 秒 |
| 定价 | 标准 API 费率 + $0.08/运行小时 |
一个 45 秒的摘要类 Routine 大约 $0.001 运行费 + Token;一个 15 分钟的 Routine 约 $0.02 运行费 + Token。也就是说,每天跑一次摘要类巡检,一个月运行费不到 1 块钱,主要成本在 Token。
GitHub 集成是 Routines 快速被工程团队采纳的原因:安装 Claude Code GitHub App 后,它会以 claude-code-bot[bot] 身份在 PR/issue 上行动,权限按仓库粒度授予,审计痕迹干净。一个挂在 pull_request.opened 上的 Routine 会收到 PR 的 title/body/diff/author 作为输入,可以做测试、留审查意见、提建议,甚至在授权后批准 trivial PR。
常见问题:Routine 经常跑到 2 小时上限被掐断?解法有两个——把 Routine 拆得更窄(见下文 Pattern 1),或把状态持久化到卷然后重新触发;若仍不够,迁到 Managed Agents。
无论 Actions 还是 Routines,自动化成败的瓶颈不是 YAML,是 prompt。交互场景里你能随时澄清歧义;凌晨 3 点的 CI 任务里没人能救场。所以 CI 目标必须满足四条铁律:
src/handlers/ 里已有的模式处理错误"是可执行的;"正确处理错误"不是。claude -p "..." 在本地把 prompt 跑通再塞进 CI,省掉大量迭代。flowchart LR
P[写 CI 目标] --> Q1{上下文显式?}
Q1 -->|否| R[重写:给出文件路径/模式名]
Q1 -->|是| Q2{范围精确?}
Q2 -->|否| R
Q2 -->|是| Q3{有硬退出?}
Q3 -->|否| R
Q3 -->|是| Q4[本地 claude -p 跑通]
Q4 --> S[塞进 CI / Routine]
R --> P
经验法则:一条 Routine 只做一件事。"每晚依赖升级"是好 Routine;"每晚依赖升级 + 检查 TODO + 同步文档"是三个 Routine 假装成一个——拆开能让失败隔离、输出可读。
规模化后必须正面处理两个运营问题:
限流(Rate Limits)。活跃团队在每个 PR 上都跑 Claude Code,很快撞 Anthropic API 限流。三板斧:path filtering(只在关键路径变才触发)、workflow 内 concurrency: 限并发、以及批处理。下面这段并发控制能让同一 PR 的快速连续 push 只跑最后一次:
concurrency:
group: claude-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
成本可见性。每次调 Claude Code 都有直接 API 成本。务必在 Anthropic Console 设账单告警——一个卡在 10 分钟静默循环里的 CI 任务,成本通常是正常运行的 4–8 倍。--max-turns 是你的第一道闸。
可观测性五原则(来自 Routines 两周生产实践):
用这张表快速对号入座,避免过度工程或选错工具:
| 你的情况 | 选择 |
|---|---|
| 任务今天就是用 Claude Code 会话跑的 | Routines |
| 需要定时、且单次 < 2 小时 | Routines |
| 需要 GitHub 原生触发(PR/issue) | Routines 或 Actions |
| 需要 > 2 小时、有持久状态 | Managed Agents |
| 需要超定制容器(GPU/小众语言) | 自建 Modal/Fly/AWS |
| 只是想定时跑个调 API 转 JSON 发 Slack 的脚本 | GitHub Actions + 10 行 Python 就够,别硬塞 LLM |
最后一条特别重要:不是所有定时任务都需要 LLM。Routines 的正确性来自 Claude 的推理——挑该报什么、写叙事、审查正确性、分类开放式输入。如果你的"自动化"其实是确定性数据搬运,Actions 里一段普通脚本更便宜更稳。
把前面所有知识串成一个端到端案例:每周日凌晨,Claude Code 扫描仓库的死代码、过期文档、测试缺口和技术债,汇总成一条结构化 issue。我们给出 Routines 版本(云端)和 Actions 版本(自建)两套,按你的环境选一套即可。
name: weekly-code-health
trigger:
cron: "0 2 * * 0" # 每周日凌晨 2 点
timezone: Asia/Shanghai
mcp_servers:
- github
- bash
model: haiku-4-5 # 巡检以分类/汇总为主,便宜模型够用
max_turns: 30
system_prompt: |
你是代码健康巡检 Agent。对当前仓库执行以下四项检查,每项最多 3 条发现:
1. 死代码:找出无调用方的导出函数(用 ripgrep 验证 0 引用)
2. 过期文档:找出 /docs 下 6 个月未修改、且引用了已重命名/删除 API 的文件
3. 测试缺口:找出 import 数 top5 但测试覆盖率为 0 的源文件
4. 技术债:扫 TODO/FIXME/HACK 注释,列出最值得处理的 3 条
最后输出一段 Markdown 汇总,并在结尾加一段"自检":
说明你检查了哪些目录、跳过了什么、为什么。
outputs:
on_complete:
create_github_issue:
title: "[巡检] 周度代码健康报告 {{date}}"
labels: ["tech-debt", "automated"]
name: Weekly Code Health Scan
on:
schedule:
- cron: '0 18 * * 6' # UTC 周六 18:00 = 北京周日 02:00
workflow_dispatch: {}
permissions:
contents: read
issues: write
jobs:
scan:
runs-on: ubuntu-latest
concurrency:
group: weekly-health
cancel-in-progress: false
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- run: npm install -g @anthropic-ai/claude-code
- name: Run health scan
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -x
claude -p "对仓库做代码健康巡检:死代码、过期文档、测试缺口、技术债各最多 3 条。\
末尾加自检说明。输出 Markdown。" \
--output-format json \
--allowed-tools "Read,Bash(rg:*),Bash(git log:*),Bash(find:*)" \
--disallowed-tools "Edit,Write" \
--max-turns 30 \
2>&1 | tee scan.json
# 从 JSON 取 result 字段,开一条 issue
REPORT=$(jq -r '.result // .text // empty' scan.json)
[ -z "$REPORT" ] && { echo "空报告,终止"; exit 1; }
gh issue create \
--title "[巡检] 周度代码健康报告 $(date +%F)" \
--body "$REPORT" \
--label "tech-debt,automated"
设计要点拆解:
--disallowed-tools "Edit,Write" 保证巡检绝不改代码,只产出报告Bash(rg:*) 等只允许特定命令族,杜绝命令注入面--max-turns 30:给够探索深度又有上限兜底set -x + tee scan.json:--print 输出到 stdout,落成制品便于事后排查[ -z "$REPORT" ] && exit 1 让"静默失败"变成可见失败concurrency 不取消进行中:巡检是后台任务,宁可排队也不要被中途掐预期结果:每周日凌晨自动开一条带 tech-debt,automated 标签的 issue,正文是结构化 Markdown 报告 + 自检说明。打开 GitHub Issues 按标签筛选即可看到完整周度巡检历史。
调优路径:跑两周后,若报告噪音多,就在 prompt 里加"按团队惯例,忽略 vendor/ 和 __generated__/ 目录"这类显式排除(呼应第七步"上下文显式"铁律)。
下图把"本地 → CI → 云端"三层自动化串成一张全景:
flowchart TB
subgraph Local[本地交互层]
L1[claude -p 一次性调用]
L2[本地试跑 prompt 验证]
end
subgraph CI[GitHub Actions 层]
PR[PR/push 事件] --> A1[自动代码审查]
PR --> A2[Lint 自愈 + skip-ci 提交]
SCHED[cron schedule] --> A3[定时维护任务]
end
subgraph Cloud[Claude Code Routines 层]
R1[cron 触发]
R2[GitHub 事件触发]
R3[Webhook/API 触发]
R1 & R2 & R3 --> CONT[Anthropic 云端容器]
CONT --> OUT[开 PR / 开 issue / Slack 通知]
end
L2 -->|prompt 成熟| CI
L2 -->|prompt 成熟| Cloud
A1 --> GH[GitHub 评论]
A2 --> GIT[分支提交]
A3 --> GH
OUT --> GH
style Cloud fill:#e8f5e9
style CI fill:#fff3e0
code.claude.com/docs/en/scheduled-tasks):/loop 与 cron 调度工具的权威说明code.claude.com/docs/en/routines):把 Claude Code 设为自动驾驶,定义按调度/API/GitHub 触发运行的 Routine-p 调用)/loop 与 cron 调度工具的官方文档[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
