Headless模式与CI/CD集成2

6 流式输出:实时监控长耗时任务

点击查看代码
claude -p "分析整个src/目录的架构问题" \
  --output-format stream-json \
  --allowedTools "Read,Grep,Glob" | while read -r line; do

  TYPE=$(echo "$line" | jq -r '.type // ""')

  case "$TYPE" in
    "system")
      # 初始化阶段:输出模型信息
      echo "[INIT] 模型: $(echo "$line" | jq -r '.model // "unknown"')"
      ;;

    "assistant")
      # 提取并输出 Claude 生成的文本内容
      TEXT=$(echo "$line" | jq -r '.message.content[0].text // ""')
      [ -n "$TEXT" ] && echo "[CLAUDE] $TEXT"
      ;;

    "result")
      # 任务结束:输出总轮数与费用
      COST=$(echo "$line" | jq -r '.total_cost_usd // 0')
      TURNS=$(echo "$line" | jq -r '.num_turns // 0')
      echo "[DONE] 任务完成!共 $TURNS 轮,费用: \$$COST"
      ;;
  esac

done
  • stream_event(需要添加--include-partial-messages参数):提供Claude输出的增量数据,精确到每一个Token级别的文本片段。
  • system/compact_boundary:上下文压缩边界事件。

7 会话管理:跨步骤维持上下文

  • 在Headless模式下,系统默认不持久化会话状态——每次调用均视为独立的全新上下文。然而,在涉及多轮交互的复杂场景中,往往需要在多次调用之间保持上下文的连续性。请看以下代码示例。
点击查看代码
# 第一步:执行初始分析
# 调用 Claude 分析代码结构,并捕获完整的 JSON 输出
RESULT=$(claude -p "分析 src/ 的模块依赖关系" \
  --output-format json \
  --allowedTools "Read,Grep,Glob")

# 第二步:提取会话标识符
# 从返回结果中解析 session_id,用于后续恢复会话
SESSION_ID=$(echo "$RESULT" | jq -r '.session_id')

# 第三步:基于上下文继续对话
# 使用 --resume 参数载入上一轮的会话状态,实现连续推理
claude -p "基于刚才的分析,指出循环依赖问题" \
  --resume "$SESSION_ID" \
  --output-format text
  • CLI工具还提供了一系列高级参数以应对复杂的交互场景。请看以下代码示例。

8 CI 环境配置:生产级清单

8.1 必须设置的环境变量

点击查看代码
# 认证
ANTHROPIC_API_KEY=sk-ant-... # API密钥
# 功能禁用
# 方案一:使用聚合变量(推荐,可一次性禁用多项非必要功能)
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 # 禁用自动更新、遥测及错误上报
# 方案二:分别禁用(如需更细粒度的控制)
DISABLE_AUTOUPDATER=1 # 禁用自动更新(CI环境中必需)
DISABLE_TELEMETRY=1 # 禁用遥测
DISABLE_ERROR_REPORTING=1 # 禁用错误上报

8.2 性能调优参数

点击查看代码
# 超时控制
# Bash 命令默认超时时间(单位:毫秒)
BASH_DEFAULT_TIMEOUT_MS=120000 # 对应2min
# Bash 命令最大允许超时时间(单位:毫秒)
BASH_MAX_TIMEOUT_MS=600000 # 对应10min
# 输出控制
CLAUDE_CODE_MAX_OUTPUT_TOKENS=32000 # 模型单次响应最大Token数(默认值32 000,上限64 000)
MAX_MCP_OUTPUT_TOKENS=25000 # MCP工具响应最大Token数
#上下文管理
CLAUDE_CODE_AUTOCOMPACT_PCT_OVERRIDE=50 # 自动压缩触发阈值(取值范围1~100,代表上下文使用百分比;默认值50%)

8.3 GitHub Actions中的完整配置模板

点击查看代码
- name: Run Claude Analysis
  env:
    # 认证密钥(从仓库 Secrets 中获取)
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
    # 性能与环境控制
    CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"   # 禁用非必要后台流量
    BASH_DEFAULT_TIMEOUT_MS: "300000"                # Bash 命令默认超时:5 min
  run: |
    npx @anthropic-ai/claude-code -p "$PROMPT" \
      --output-format json \
      --max-turns 10 \
      --max-budget-usd 1.00 \
      --allowedTools "Read,Grep,Glob" \
      --model claude-sonnet-4-6 \
      --fallback-model haiku \
      --append-system-prompt "遵循项目根目录 CLAUDE.md 中的审查规范。"

8.4 MCP服务器在CI中的配置

点击查看代码
npx @anthropic-ai/claude-code \
  -p "分析数据库Schema的优化空间" \
  --mcp-config ./ci-mcpconfig.json \
  --strict-mcp-access \
  --allowedTools "Read,Grep,Glob,mcp__database__query" \
  --max-turns 10

9 跨平台CI/CD集成(没有的自查,这个可能存在差异)

9.1 GitLab CI/CD配置
9.2 JenkinsPipeline集成配置

9.3 本地自动化脚本

点击查看代码
#!/bin/bash
# review.sh — 团队共享的本地代码审查脚本
set -e

TARGET=${1:-.}

# 前置检查
[ -z "$ANTHROPIC_API_KEY" ] && echo "Error: ANTHROPIC_API_KEY not set" && exit 1
command -v claude &> /dev/null || { echo "Error: Claude Code not installed"; exit 1; }

echo "Starting review for: $TARGET"

# 构建文件列表
if [ -d "$TARGET" ]; then
  FILES=$(find "$TARGET" -type f \( -name "*.ts" -o -name "*.js" -o -name "*.py" \) | head -20)
else
  FILES="$TARGET"
fi

# 运行审查
RESULT=$(claude -p "审查以下文件的代码质量和安全问题:
$FILES
输出格式:使用Markdown格式,每个问题必须指明文件名和行号。" \
  --output-format text \
  --max-turns 15 \
  --max-budget-usd 0.50 \
  --allowedTools "Read,Grep,Glob")

# 保存报告
REPORT="review-$(date +%Y%m%d-%H%M%S).md"
echo -e "# Code Review Report\n\n**Date**: $(date)\n**Target**: $TARGET\n\n---\n\n$RESULT" > "$REPORT"

echo "Report saved: $REPORT"

10 安全原则与最佳实践

  • 机密泄露
  • 破坏性操作
  • 费用失控
  • 内容污染

10.1 最小权限原则

点击查看代码
# 代码审查任务:只读
--allowedTools "Read,Grep,Glob"
# 格式修复任务:读写
--allowedTools "Read,Grep,Glob,Edit,Write"
# Git操作任务:细粒度Bash白名单
--allowedTools "Read,Grep,Glob,Bash(git diff ),Bash(git log )"

10.2 Secrets管理

点击查看代码
# 错误做法:硬编码密钥(密钥将直接明文出现在 Actions 运行日志中)
env:
ANTHROPIC_API_KEY: "sk-ant-xxx"
# 正确做法:引用仓库密钥
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

10.3 容器隔离

点击查看代码
jobs:
review: runs-on: ubuntu-latest container: image: node:20
options: --read-only --tmpfs /tmp --network none 

10.4 成本防护

点击查看代码
# 路径过滤:仅在 src 目录变更时触发
on:
  pull_request:
    paths:
      - 'src/**'
      - '!src/**/*.test.*'  # 排除测试文件

# 并发限制:同一 PR 仅保留最新一次运行,自动取消中间版本
concurrency:
  group: claude-${{ github.event.pull_request.number }}
  cancel-in-progress: true

10.5 审计日志

点击查看代码
# JSON输出格式天然包含完整的审计信息
claude -p "任务" --output-format json | tee -a varlog/claude-audit.jsonl 

11 从CLI到Agent SDK:Headless模式的编程接口

  • TypeScript Agent
点击查看代码
// TypeScript Agent SDK 示例
import { query } from "@anthropic-ai/claude-agent-sdk";

// 假设 reviewSchema 已在外部定义
// const reviewSchema = { ... };

async function reviewPR(changedFiles: string[]) {
  let sessionId: string | undefined;
  let result: string = "";

  for await (const message of query({
    prompt: `审查以下文件的代码变更:${changedFiles.join(", ")}`,
    options: {
      allowedTools: ["Read", "Grep", "Glob"],
      maxTurns: 10,
      maxBudgetUsd: 0.50,
      model: "claude-sonnet-4-6",
      outputFormat: {
        type: "json_schema",
        schema: reviewSchema,
      },
    },
  })) {
    if (message.type === "system" && message.subtype === "init") {
      sessionId = message.session_id;
    }
    if (message.type === "result" && message.structured_output) {
      result = message.structured_output;
    }
  }

  return { sessionId, result };
}
  • Python Agent SDK
点击查看代码
# Python Agent SDK 示例
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage


async def review_pr(changed_files: list[str]):
    options = ClaudeAgentOptions(
        allowed_tools=["Read", "Grep", "Glob"],
        max_turns=10,
        max_budget_usd=0.50,
        model="claude-sonnet-4-6",
    )

    async for message in query(
        prompt=f"审查以下文件:{', '.join(changed_files)}",
        options=options,
    ):
        if isinstance(message, ResultMessage):
            return message.result

12 渐进式落地策略

  • 阶段一:观察者模式。
  • 阶段二:顾问模式。
  • 阶段三:门禁模式。
  • 阶段四:主动修复模式。

本章小结

  • -p(入口):将Claude Code的运行模式从交互式会话切换为非交互式执行,奠定自动化基础。
  • --output-format(数据接口):规范输出结构,确保下游系统能高效解析与调用审查结果。
  • --allowedTools(安全边界):严格限定工具权限,确保自动化环境中的操作合规、可控。
  • --max-turns与--max-budget-usd(成本护栏):设定执行轮次与预算上限,防止无人值守场景下的资源失控。
posted @ 2026-08-04 10:29  不知者buwei  阅读(0)  评论(0)    收藏  举报