首页 › tutorials › Claude Code CI/CD全实战:Actions到Agent SDK

Claude Code CI/CD全实战:GitHub Actions到Agent SDK

概述

本教程面向希望在CI/CD流水线中集成Claude Code的开发者和DevOps工程师。你将学会三种自动化路径:GitHub Actions官方Action集成、Headless模式脚本编排、以及Agent SDK程序化调用。学完后,你的团队可以在每次PR触发AI代码审查、定时批量重构、甚至构建自定义AI Agent串联整个交付流程。

适用人群:有基础命令行经验的开发者、DevOps工程师、技术负责人 预计教学时长:6-8小时(含实战练习)

前置条件

整体架构:三条自动化路径

flowchart TB
    subgraph 触发层
        PR[Pull Request事件]
        Issue[Issue评论 @claude]
        Schedule[定时任务 cron]
        Manual[手动触发 workflow_dispatch]
        API[外部API调用]
    end

    subgraph 路径A[路径A: GitHub Actions]
        A1[claude-code-action@v1]
        A2[自动PR审查]
        A3[Issue自动实现]
        A1 --> A2
        A1 --> A3
    end

    subgraph 路径B[路径B: Headless模式]
        B1[claude -p '提示词']
        B2[stdin/stdout管道]
        B3[shell脚本编排]
        B1 --> B2 --> B3
    end

    subgraph 路径C[路径C: Agent SDK]
        C1[Python: claude_agent_sdk]
        C2[TypeScript: @anthropic-ai/claude-code]
        C3[自定义工具+Hook]
        C1 --> C3
        C2 --> C3
    end

    PR --> A1
    Issue --> A1
    Schedule --> B1
    Manual --> B1
    API --> C1
    API --> C2

    style 路径A fill:#e8f5e9
    style 路径B fill:#e3f2fd
    style 路径C fill:#fff3e0

第一章:GitHub Actions官方集成

1.1 三步快速接入

Anthropic提供的anthropics/claude-code-action是官方GitHub Action,零代码即可在PR和Issue上触发Claude Code。

步骤一:配置API Key

进入你的GitHub仓库 → Settings → Secrets and variables → Actions → New repository secret,添加:

名称: ANTHROPIC_API_KEY
值: sk-ant-api03-xxxxx

步骤二:创建Workflow文件

在仓库中创建.github/workflows/claude.yml:

name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize]
  issue_comment:
    types: [created]

permissions:
  contents: write
  pull-requests: write
  issues: write

jobs:
  claude-review:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

步骤三:触发使用

sequenceDiagram
    participant Dev as 开发者
    participant GH as GitHub
    participant GHA as GitHub Actions
    participant CC as Claude Code Action
    participant PR as Pull Request

    Dev->>GH: 创建PR
    GH->>GHA: 触发 pull_request 事件
    GHA->>CC: 启动 claude-code-action@v1
    CC->>PR: 读取diff和上下文
    CC->>CC: 分析代码变更
    CC->>PR: 发布审查评论
    Note over PR: 带有具体建议的行内评论

    Dev->>PR: 评论 @claude 请修复这个问题
    PR->>GHA: 触发 issue_comment 事件
    GHA->>CC: 启动action,传入评论内容
    CC->>PR: 自动push修复commit

1.2 进阶配置:权限控制与自定义提示

官方Action支持精细化的权限控制:

jobs:
  claude-advanced:
    runs-on: ubuntu-latest
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          # 限制可用工具,防止CI环境中执行危险操作
          allowed_tools: |
            Read
            Glob
            Grep
            Bash(git diff*)
            Bash(git log*)
          # 自定义系统提示词
          custom_instructions: |
            你是一个代码审查专家。请重点关注:
            1. 安全漏洞(SQL注入、XSS等)
            2. 性能问题(N+1查询、内存泄漏)
            3. 测试覆盖率不足
            用中文回复,给出具体的改进建议和代码示例。
          # 指定使用的模型
          model: claude-sonnet-4-6

1.3 三种典型CI场景

场景一:每次PR自动审查

on:
  pull_request:
    types: [opened, synchronize, ready_for_review]

场景二:定时代码质量扫描

on:
  schedule:
    - cron: '0 2 * * 1'  # 每周一凌晨2点
  workflow_dispatch:  # 同时支持手动触发

jobs:
  weekly-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Claude Code analysis
        run: |
          npm install -g @anthropic-ai/claude-code
          claude -p "审查整个src/目录,找出所有潜在的TypeScript类型安全问题、未处理的Promise、以及可以优化的异步代码。输出格式化的Markdown报告。" \
            --allowedTools "Read,Glob,Grep" \
            --output-format text > report.md
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
      - name: Create Issue from report
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const report = fs.readFileSync('report.md', 'utf8');
            await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: `Weekly Code Review - ${new Date().toISOString().split('T')[0]}`,
              body: report,
              labels: ['automated-review']
            });

场景三:CI失败自动修复

on:
  workflow_run:
    workflows: ["CI"]  # 监听你的CI workflow
    types: [completed]

jobs:
  auto-fix:
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.workflow_run.head_branch }}
      - name: Get CI failure logs
        run: |
          # 获取失败的CI日志
          gh run view ${{ github.event.workflow_run.id }} --log-failed > ci-errors.txt
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Claude auto-fix
        run: |
          claude -p "$(cat ci-errors.txt)" \
            --allowedTools "Read,Edit,Bash(npm test*),Bash(git *)" \
            --output-format text
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

1.4 常见问题与解决方案

问题 原因 解决方案
Action无响应 API Key未配置或无效 检查Secret名称和Key有效性
审查评论过长 默认审查范围过大 在custom_instructions中限定审查维度
超时失败 大型PR处理时间过长 使用timeout-minutes: 10增加超时
权限被拒绝 permissions配置不全 确保包含contents: write和pull-requests: write

第二章:Headless模式深度实战

2.1 核心参数全景

Headless模式通过-p(或--print)标志启动,将Claude Code从交互式工具变为命令行管道工具:

# 基础用法:单次提示
claude -p "解释这个项目的架构"

# 管道输入:将文件内容作为上下文
cat src/main.ts | claude -p "重构这个文件,提取可复用的函数"

# JSON输出:便于程序解析
claude -p "列出所有TODO注释" --output-format json

# 流式JSON:实时获取Agent执行过程
claude -p "修复所有lint错误" --output-format stream-json

# 限制工具权限
claude -p "检查安全漏洞" --allowedTools "Read,Glob,Grep"

# 指定模型
claude -p "性能优化建议" --model claude-sonnet-4-6

# 组合使用:完整参数
claude -p "为所有API端点编写集成测试" \
  --output-format json \
  --allowedTools "Read,Write,Edit,Glob,Grep,Bash(npm test*)" \
  --model claude-sonnet-4-6 \
  --max-turns 30

2.2 输出格式详解

三种输出格式对应不同场景:

flowchart LR
    subgraph text["text 纯文本"]
        T1[简单查询]
        T2[邮件/报告生成]
        T3[管道到其他命令]
    end

    subgraph json["json 结构化"]
        J1[程序解析]
        J2[CI结果判定]
        J3[数据库存储]
    end

    subgraph stream["stream-json 流式"]
        S1[实时监控]
        S2[进度追踪]
        S3[超长时间任务]
    end

    text -->|简单| D{场景选择}
    json -->|需要解析| D
    stream -->|长任务| D

text格式:直接输出纯文本,适合人类阅读或管道传递:

# 生成变更日志
claude -p "根据最近的git log生成CHANGELOG.md" \
  --output-format text > CHANGELOG.md

json格式:结构化输出,适合程序处理:

# 分析结果输出为JSON
claude -p "分析package.json中的所有依赖,按风险等级分类" \
  --output-format json | jq '.result'

stream-json格式:实时流式输出,适合监控长时间运行的任务:

# 流式输出并实时解析
claude -p "重构整个src目录,将所有class组件转为函数组件" \
  --output-format stream-json | \
  while read line; do
    event=$(echo "$line" | jq -r '.type')
    if [ "$event" = "tool_use" ]; then
      echo "🔧 使用工具: $(echo "$line" | jq -r '.tool_name')"
    elif [ "$event" = "text_delta" ]; then
      echo -n "$(echo "$line" | jq -r '.text')"
    fi
  done

2.3 stdin多轮对话

Headless模式支持通过stdin传入多轮对话,实现复杂的工作流:

# 多轮对话:每行一个JSON消息
echo '{"role":"user","content":"分析这个项目的目录结构,找出架构问题"}' | \
  claude -p --input-format messages --output-format json

更复杂的多轮场景,通过会话恢复实现:

# 第一轮:分析问题
SESSION=$(claude -p "分析src/api/目录下的所有endpoint,列出缺少错误处理的" \
  --output-format json | jq -r '.session_id')

# 第二轮:基于前一轮上下文修复
claude -p "请修复上一轮列出的所有问题" \
  --resume "$SESSION" \
  --output-format text

2.4 批量任务编排实战

实战:批量更新多个仓库的依赖

创建batch-update-deps.sh:

#!/bin/bash
set -euo pipefail

# 仓库列表
REPOS=(
  "org/frontend-app"
  "org/backend-api"
  "org/shared-libs"
  "org/admin-dashboard"
  "org/mobile-gateway"
)

# 要更新的依赖模式
UPDATE_PATTERN="$1"  # 例如 "lodash" 或 "eslint*"

BRANCH_NAME="deps/update-${UPDATE_PATTERN}-$(date +%Y%m%d)"

for repo in "${REPOS[@]}"; do
  echo "====== 处理仓库: $repo ======"

  # 克隆仓库
  git clone "https://github.com/$repo.git" "/tmp/$repo" 2>/dev/null
  cd "/tmp/$repo"

  # 创建分支
  git checkout -b "$BRANCH_NAME"

  # Claude执行依赖更新
  RESULT=$(claude -p "更新与 '${UPDATE_PATTERN}' 相关的所有npm依赖到最新版本。步骤:
    1. 检查当前版本
    2. 运行npm update或npm install更新
    3. 确保没有breaking changes
    4. 如果有breaking changes,做必要的代码适配
    5. 运行npm test确保通过
    如果测试失败,回滚并报告失败原因。" \
    --allowedTools "Read,Write,Edit,Bash(npm*),Bash(git*)" \
    --max-turns 50 \
    --output-format json)

  # 检查结果
  SUCCESS=$(echo "$RESULT" | jq -r '.success // false')

  if [ "$SUCCESS" = "true" ]; then
    # 提交并推送
    git add -A
    git commit -m "chore: update ${UPDATE_PATTERN} dependencies"
    git push origin "$BRANCH_NAME"

    # 创建PR
    gh pr create \
      --title "chore: update ${UPDATE_PATTERN} dependencies" \
      --body "Automated dependency update by Claude Code" \
      --label "dependencies,automated"

    echo "✅ $repo 更新成功,PR已创建"
  else
    echo "❌ $repo 更新失败: $(echo "$RESULT" | jq -r '.error // unknown')"
  fi

  # 清理
  cd -
  rm -rf "/tmp/$repo"
done

echo "====== 批量更新完成 ======"

运行:

chmod +x batch-update-deps.sh
./batch-update-deps.sh "lodash"

第三章:Agent SDK程序化调用

3.1 Agent SDK概述

Claude Agent SDK将Claude Code的完整Agent循环暴露为Python和TypeScript库,你可以:

flowchart TB
    subgraph 你的应用
        A[Python/TypeScript代码]
    end

    subgraph Agent SDK
        B[query函数]
        C[ClaudeSDKClient]
        D[自定义Tool注册]
        E[Hook事件回调]
        F[流式StreamEvent]
    end

    subgraph Claude Code引擎
        G[Agent循环]
        H[内置工具<br/>Read/Write/Edit/Bash]
        I[MCP服务器]
    end

    A -->|调用| B
    A -->|创建| C
    C --> D
    C --> E
    B --> G
    C --> G
    G --> H
    G --> I
    G -->|返回| F
    F --> A

    style Agent SDK fill:#fff3e0
    style Claude Code引擎 fill:#e8f5e9

3.2 Python SDK快速开始

安装:

pip install claude-agent-sdk

最小示例:

from claude_agent_sdk import query

# 最简单的调用
result = query("分析当前目录结构,找出可以改进的地方")
print(result)

使用Client进行流式调用:

from claude_agent_sdk import ClaudeSDKClient
from claude_agent_sdk.types import StreamEvent

client = ClaudeSDKClient()

# 流式处理
for event in client.stream("重构src/utils.ts,提取所有可复用的helper函数"):
    if isinstance(event, StreamEvent.TextDelta):
        print(event.text, end="", flush=True)
    elif isinstance(event, StreamEvent.ToolUse):
        print(f"\n[工具调用] {event.tool_name}: {event.tool_input}")
    elif isinstance(event, StreamEvent.ToolResult):
        print(f"[工具结果] 成功: {event.is_success}")

3.3 注册自定义工具

这是Agent SDK最强大的能力——扩展Claude的工具集:

from claude_agent_sdk import ClaudeSDKClient, tool
from claude_agent_sdk.types import StreamEvent

client = ClaudeSDKClient()

# 注册自定义工具:查询内部API
@tool(name="query_internal_api", description="查询内部REST API获取服务状态和指标")
def query_internal_api(endpoint: str, method: str = "GET") -> str:
    """查询内部API端点并返回结果。

    Args:
        endpoint: API端点路径,如 /api/v1/services/status
        method: HTTP方法,默认GET
    """
    import requests
    base_url = "http://internal-api.company.com"
    response = requests.request(method, f"{base_url}{endpoint}", timeout=10)
    return response.text

# 注册自定义工具:发送Slack通知
@tool(name="send_slack_alert", description="向指定Slack频道发送告警消息")
def send_slack_alert(channel: str, message: str, severity: str = "info") -> str:
    """发送Slack告警通知。

    Args:
        channel: Slack频道名称,如 #ops-alerts
        message: 告警消息内容
        severity: 严重程度 info/warning/critical
    """
    import requests
    webhook_url = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
    emoji = {"info": "ℹ️", "warning": "⚠️", "critical": "🚨"}.get(severity, "📢")
    payload = {
        "channel": channel,
        "text": f"{emoji} [{severity.upper()}] {message}"
    }
    response = requests.post(webhook_url, json=payload)
    return f"消息已发送到 {channel},状态码: {response.status_code}"

# 使用自定义工具进行巡检
for event in client.stream(
    "执行以下巡检任务:\n"
    "1. 查询所有微服务状态\n"
    "2. 检查每个服务的错误率\n"
    "3. 如果发现异常,向 #ops-alerts 发送critical级别告警\n"
    "4. 生成巡检报告摘要"
):
    if isinstance(event, StreamEvent.TextDelta):
        print(event.text, end="", flush=True)
    elif isinstance(event, StreamEvent.ToolUse):
        print(f"\n→ 调用工具: {event.tool_name}")

3.4 TypeScript SDK快速开始

安装:

npm install @anthropic-ai/claude-code

使用示例:

import { query, ClaudeCodeClient } from '@anthropic-ai/claude-code';

// 简单调用
const result = await query(
  '审查src/目录下的所有TypeScript文件,找出any类型的使用'
);
console.log(result);

// 流式调用
const client = new ClaudeCodeClient();

for await (const event of client.stream(
  '为src/api/下所有endpoint添加JSDoc文档注释'
)) {
  switch (event.type) {
    case 'text_delta':
      process.stdout.write(event.text);
      break;
    case 'tool_use':
      console.log(`\n[Tool] ${event.tool_name}`);
      break;
    case 'tool_result':
      console.log(`[Done] ${event.is_success ? '✓' : '✗'}`);
      break;
  }
}

3.5 Hook回调机制

Agent SDK支持Hook,让你在Agent执行的关键节点注入逻辑:

from claude_agent_sdk import ClaudeSDKClient, HookType

client = ClaudeSDKClient()

# PreToolUse Hook:在工具执行前拦截
@client.hook(HookType.PRE_TOOL_USE)
def on_before_tool(tool_name: str, tool_input: dict) -> dict:
    """在工具执行前的回调。返回修改后的tool_input或抛出异常阻止执行。"""
    if tool_name == "Bash":
        command = tool_input.get("command", "")
        # 安全检查:禁止执行危险命令
        dangerous_patterns = ["rm -rf", "DROP TABLE", "force push", ":(){:|:&};:"]
        for pattern in dangerous_patterns:
            if pattern in command:
                raise ValueError(f"安全拦截:禁止执行包含 '{pattern}' 的命令")

        # 记录所有命令执行
        with open("/var/log/claude-commands.log", "a") as f:
            f.write(f"[{tool_name}] {command}\n")

    return tool_input  # 返回(可能修改后的)tool_input

# PostToolUse Hook:工具执行后的回调
@client.hook(HookType.POST_TOOL_USE)
def on_after_tool(tool_name: str, tool_input: dict, result: str, success: bool):
    """工具执行完成后的回调。可用于审计、通知等。"""
    if tool_name == "Edit" and not success:
        # 编辑失败时发送通知
        print(f"⚠️ 文件编辑失败: {tool_input.get('file_path', 'unknown')}")

    if tool_name == "Bash":
        # 记录所有bash命令结果
        import logging
        logger = logging.getLogger("claude-audit")
        logger.info(f"Command: {tool_input.get('command')} -> Success: {success}")

第四章:实战案例——全自动代码审查与修复流水线

4.1 项目结构

构建一个完整的自动化流水线,实现以下功能:

flowchart TB
    subgraph 触发器
        T1[PR创建/更新]
        T2[每日定时扫描]
        T3[Issue @claude触发]
    end

    subgraph GitHub Actions Workflow
        A1[检出代码]
        A2[Claude自动审查]
        A3{发现问题?}
        A4[创建审查评论]
        A5[自动修复并推送]
        A6[运行测试验证]
        A7{测试通过?}
        A8[保留修复]
        A9[回滚并报告]
    end

    subgraph 报告层
        R1[Slack通知]
        R2[GitHub Dashboard]
        R3[邮件摘要]
    end

    T1 --> A1
    T2 --> A1
    T3 --> A1
    A1 --> A2 --> A3
    A3 -->|是| A4
    A3 -->|否| R1
    A4 --> A5 --> A6 --> A7
    A7 -->|通过| A8 --> R1
    A7 -->|失败| A9 --> R1
    R1 --> R2 --> R3

4.2 完整Workflow配置

创建.github/workflows/claude-pipeline.yml:

name: Claude Code Pipeline

on:
  pull_request:
    types: [opened, synchronize]
  schedule:
    - cron: '0 6 * * 1-5'  # 工作日每天早上6点
  issue_comment:
    types: [created]

concurrency:
  group: claude-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: write
  pull-requests: write
  issues: write
  checks: write

env:
  CLAUDE_MODEL: claude-sonnet-4-6

jobs:
  # 作业1:自动审查
  review:
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-latest
    outputs:
      has_issues: ${{ steps.analyze.outputs.has_issues }}
      report: ${{ steps.analyze.outputs.report }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Get PR diff
        id: diff
        run: |
          git diff origin/main...HEAD > pr-diff.txt
          echo "lines=$(wc -l < pr-diff.txt)" >> $GITHUB_OUTPUT

      - name: Claude Code Review
        id: analyze
        run: |
          REPORT=$(claude -p "你是一个高级代码审查专家。请审查以下PR diff,重点检查:

          1. **安全漏洞**: SQL注入、XSS、CSRF、硬编码密钥
          2. **性能问题**: N+1查询、内存泄漏、不必要的同步操作
          3. **代码质量**: 命名规范、函数复杂度、重复代码
          4. **测试覆盖**: 是否有对应的测试用例
          5. **兼容性**: 是否引入breaking changes

          输出格式:
          - 如果没有严重问题,输出: PASS
          - 如果有问题,按严重程度列出,每个问题给出文件名、行号和修复建议

          DIFF内容:
          $(cat pr-diff.txt)" \
            --allowedTools "Read,Glob,Grep" \
            --output-format text \
            --model ${{ env.CLAUDE_MODEL }})

          echo "report<<EOF" >> $GITHUB_OUTPUT
          echo "$REPORT" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

          if echo "$REPORT" | grep -q "PASS"; then
            echo "has_issues=false" >> $GITHUB_OUTPUT
          else
            echo "has_issues=true" >> $GITHUB_OUTPUT
          fi
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Post Review Comment
        if: steps.analyze.outputs.has_issues == 'true'
        uses: actions/github-script@v7
        with:
          script: |
            const report = `${{ steps.analyze.outputs.report }}`;
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.payload.pull_request.number,
              body: `## 🤖 Claude Code Review\n\n${report}`
            });

  # 作业2:自动修复
  auto-fix:
    needs: review
    if: needs.review.outputs.has_issues == 'true'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.ref }}
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Claude Auto-Fix
        run: |
          claude -p "根据以下审查报告修复所有问题:

          ${{ needs.review.outputs.report }}

          修复后运行测试确保没有引入新问题。" \
            --allowedTools "Read,Write,Edit,Bash(npm*),Bash(git*)" \
            --model ${{ env.CLAUDE_MODEL }} \
            --max-turns 50
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Run Tests
        id: test
        run: npm test
        continue-on-error: true

      - name: Commit and Push Fix
        if: steps.test.outcome == 'success'
        run: |
          git config user.name "Claude Code Bot"
          git config user.email "claude-bot[bot]@users.noreply.github.com"
          git add -A
          git diff --staged --quiet || git commit -m "fix: auto-fix review issues [skip ci]"
          git push

      - name: Report Failure
        if: steps.test.outcome == 'failure'
        uses: actions/github-script@v7
        with:
          script: |
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.payload.pull_request.number,
              body: '⚠️ Claude自动修复后测试未通过,已回滚。请手动处理。'
            });

  # 作业3:每日代码质量扫描
  daily-scan:
    if: github.event_name == 'schedule'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Quality Scan
        run: |
          REPORT=$(claude -p "对整个代码库进行全面质量扫描,输出以下维度的评估报告:

          1. **技术债务评分** (1-10): 找出所有TODO、FIXME、HACK注释
          2. **安全扫描**: 检查硬编码密钥、不安全的依赖
          3. **性能热力图**: 识别可能的性能瓶颈
          4. **测试覆盖率评估**: 分析测试文件和源文件的比例
          5. **依赖健康度**: 检查过时或有漏洞的依赖

          每个维度给出评分和改进建议。" \
            --allowedTools "Read,Glob,Grep,Bash(npm*),Bash(git*)" \
            --output-format text \
            --model ${{ env.CLAUDE_MODEL }})

          echo "$REPORT" > quality-report.md
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Create Quality Issue
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const report = fs.readFileSync('quality-report.md', 'utf8');
            const date = new Date().toISOString().split('T')[0];
            await github.rest.issues.create({
              owner: context.repo.owner,
              repo: context.repo.repo,
              title: `📊 Weekly Quality Report - ${date}`,
              body: report,
              labels: ['quality-report', 'automated']
            });

4.3 验证流水线

推送workflow文件后,通过以下方式触发:

# 方式1:创建PR自动触发审查
git checkout -b test-claude-ci
echo "// TODO: fix this later" >> src/index.ts
git add . && git commit -m "test: trigger claude review"
git push origin test-claude-ci
gh pr create --title "Test: Claude CI Pipeline" --body "Testing Claude auto-review"

# 方式2:在PR评论中触发
gh pr comment 123 --body "@claude 请检查这个PR中是否有安全隐患"

# 方式3:手动触发定时扫描
gh workflow run claude-pipeline.yml

第五章:计费变更与成本控制

5.1 2026年6月15日计费拆分

Anthropic宣布从2026年6月15日起,将Claude订阅的计费拆分为两个独立的池:

flowchart LR
    subgraph 变更前["2026年6月15日前"]
        A[Claude订阅<br/>Pro/Max/Team] --> B[所有用途共用<br/>同一额度池]
        B --> C[交互式使用]
        B --> D[Agent SDK]
        B --> E[claude -p]
        B --> F[GitHub Actions]
    end

    subgraph 变更后["2026年6月15日后"]
        G[Claude订阅<br/>Pro/Max/Team] --> H[交互式使用<br/>原有额度]
        G --> I[自动化用量<br/>独立Credit池<br/>按API计费]
        I --> J[Agent SDK]
        I --> K[claude -p]
        I --> L[GitHub Actions]
    end

    变更前 -.->|拆分| 变更后

关键影响: - claude -p(Headless模式)的用量不再占用你的交互式订阅额度 - Agent SDK的使用将通过独立的API Credit池计费 - GitHub Actions中的Claude Code同样计入新的自动化额度池 - 需要在Anthropic Console中为自动化用途单独配置预算

5.2 成本控制策略

# 策略1:使用--max-turns限制Agent循环次数
claude -p "修复lint错误" --max-turns 10

# 策略2:使用更经济的模型处理简单任务
claude -p "格式化代码" --model claude-haiku-4-5

# 策略3:限制工具范围减少token消耗
claude -p "检查README中的拼写错误" --allowedTools "Read"

# 策略4:CI中添加超时保护
timeout 300 claude -p "分析代码" --output-format text

在GitHub Actions中添加预算保护:

- name: Claude with budget guard
  run: |
    # 设置最大执行时间
    timeout 600 claude -p "$PROMPT" \
      --max-turns 30 \
      --model claude-sonnet-4-6 \
      --output-format text || echo "Claude执行超时或失败"

第六章:安全最佳实践

6.1 CI环境安全清单

flowchart TB
    S[CI安全策略] --> A[API Key保护]
    S --> B[工具权限限制]
    S --> C[网络隔离]
    S --> D[审计日志]
    S --> E[输入验证]

    A --> A1[使用GitHub Secrets]
    A --> A2[不记录到日志]
    A --> A3[定期轮换]

    B --> B1[allowedTools白名单]
    B --> B2[禁止危险Bash命令]
    B --> B3[只读模式优先]

    C --> C1[限制外部网络访问]
    C --> C2[不暴露内网地址]

    D --> D1[记录所有工具调用]
    D --> D2[Hook审计]
    D --> D3[结果归档]

    E --> E1[验证PR作者]
    E --> E2[限制触发条件]
    E --> E3[输入长度限制]

6.2 安全配置模板

# .github/workflows/claude-secure.yml
jobs:
  claude-secure:
    runs-on: ubuntu-latest
    # 仅允许仓库协作者触发
    if: github.event.pull_request.author_association == 'COLLABORATOR'
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          # 严格限制工具权限
          allowed_tools: |
            Read
            Glob
            Grep
          # 添加安全指令
          custom_instructions: |
            安全规则:
            - 不要执行任何写操作
            - 不要运行任何命令
            - 不要访问环境变量中的密钥
            - 仅做分析和建议

Agent SDK的安全Hook:

from claude_agent_sdk import ClaudeSDKClient, HookType
import re

client = ClaudeSDKClient()

BLOCKED_PATTERNS = [
    r"rm\s+-rf",
    r"DROP\s+TABLE",
    r"git\s+push\s+.*--force",
    r"curl.*\|\s*sh",
    r"eval\s*\(",
    r"chmod\s+777",
    r">\s*/dev/sd",
]

@client.hook(HookType.PRE_TOOL_USE)
def security_guard(tool_name: str, tool_input: dict) -> dict:
    if tool_name == "Bash":
        command = tool_input.get("command", "")
        for pattern in BLOCKED_PATTERNS:
            if re.search(pattern, command, re.IGNORECASE):
                raise ValueError(
                    f"安全策略阻止执行: 检测到危险模式 '{pattern}'"
                )
    if tool_name in ("Write", "Edit"):
        file_path = tool_input.get("file_path", "")
        sensitive_files = [".env", "credentials", "secrets", "id_rsa"]
        for sf in sensitive_files:
            if sf in file_path.lower():
                raise ValueError(f"安全策略阻止修改敏感文件: {file_path}")
    return tool_input

延伸阅读

训练营适用性评估

训练营类型 适用性 建议时长 备注
企业DevOps内训 ★★★★★ 4小时 直接应用于团队CI/CD流水线
AI工具培训班 ★★★★☆ 3小时 侧重GitHub Actions部分
高级开发者工作坊 ★★★★★ 6小时 含Agent SDK完整实战
安全合规培训 ★★★★☆ 2小时 重点第六章安全实践
在线自学课程 ★★★★☆ 自定进度 需提供GitHub模板仓库

前置依赖:建议先完成Round 1(入门篇)和Round 3(MCP服务器开发),理解Claude Code基础概念后再学习本教程。


Claude Code自动化之旅 | 由Claude Code深度使用专家系列教程出品 | 2026年5月

参考来源

  1. Run Claude Code programmatically - Claude Code Docs — Headless模式官方文档,涵盖-p标志、输出格式、stdin管道
  2. Claude Code GitHub Actions - Claude Code Docs — 官方GitHub Action集成指南,含YAML配置和权限设置
  3. Agent SDK overview - Claude Code Docs — Agent SDK架构概述,Python和TypeScript双语言支持
  4. Use the Claude Agent SDK with your Claude plan - Anthropic Support — 2026年6月15日计费拆分政策详解
  5. anthropics/claude-code-action - GitHub — 官方Action源码仓库,含完整示例和配置参考

[!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 等场景全覆盖。

51学通信知识星球海报-扫码加入