Skip to content

CI/CD 自动化

CI/CD Automation

Claude Code 的无头模式(Headless Mode)使其可以完美集成到 CI/CD 流程中,实现自动代码审查、修复、测试生成等任务。

无头模式基础

claude -p 命令

无头模式通过 -p(print)参数启动,执行完毕后自动退出:

bash
# 基本用法
claude -p "分析这个项目的代码质量"

# 指定输出格式
claude -p "列出所有 TODO 注释" --output-format json

# 流式 JSON 输出
claude -p "审查最近的提交" --output-format stream-json

输出格式

格式参数说明
文本默认纯文本输出
JSON--output-format json结构化 JSON,含元数据
流式 JSON--output-format stream-json逐行 JSON 事件流

管道操作

bash
# 将文件内容通过管道传入
cat error.log | claude -p "分析这个错误日志,找出根本原因"

# 将 diff 传入进行审查
git diff HEAD~1 | claude -p "审查这些代码变更"

# 组合使用
git log --oneline -10 | claude -p "总结最近的开发进展"

GitHub Actions 集成

自动代码审查

yaml
# .github/workflows/claude-review.yml
name: Claude Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - 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: |
          git diff origin/main...HEAD | claude -p \
            "审查这些代码变更,关注:
            1. 安全漏洞
            2. 性能问题
            3. 代码规范
            输出 Markdown 格式的审查报告" \
            --dangerously-skip-permissions \
            --output-format json > review.json

      - name: Post Review Comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const review = JSON.parse(fs.readFileSync('review.json', 'utf8'));
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `## 🤖 Claude Code 自动审查\n\n${review.result}`
            });

自动修复 Lint 错误

yaml
# .github/workflows/claude-fix.yml
name: Claude Auto Fix
on:
  push:
    branches: [main]

jobs:
  fix:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup
        run: |
          npm ci
          npm install -g @anthropic-ai/claude-code

      - name: Run Lint
        id: lint
        continue-on-error: true
        run: npx eslint src/ --format json > lint-results.json

      - name: Fix with Claude
        if: steps.lint.outcome == 'failure'
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          cat lint-results.json | claude -p \
            "根据这些 ESLint 错误,修复源代码文件。只修复错误,不要改变代码逻辑。" \
            --dangerously-skip-permissions

      - name: Create Fix PR
        if: steps.lint.outcome == 'failure'
        run: |
          git checkout -b fix/auto-lint-$(date +%s)
          git add -A
          git commit -m "fix: auto-fix lint errors via Claude Code"
          git push origin HEAD
          gh pr create --title "Auto-fix lint errors" --body "Automated lint fix by Claude Code"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

自动生成 PR 描述

yaml
name: Auto PR Description
on:
  pull_request:
    types: [opened]

jobs:
  describe:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Generate PR Description
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          npm install -g @anthropic-ai/claude-code
          DESCRIPTION=$(git diff origin/main...HEAD | claude -p \
            "根据这些代码变更,生成一个结构化的 PR 描述,包含:
            ## 变更摘要
            ## 修改的文件
            ## 测试建议" \
            --dangerously-skip-permissions)

          gh pr edit ${{ github.event.number }} --body "$DESCRIPTION"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

权限配置

--dangerously-skip-permissions

在 CI 环境中,由于没有交互式终端,需要跳过权限确认:

bash
claude -p "任务描述" --dangerously-skip-permissions

安全警告

--dangerously-skip-permissions 会跳过所有权限检查。仅在受信任的 CI 环境中使用,确保:

  1. API Key 通过 Secrets 管理,不在日志中暴露
  2. 任务提示词经过审核,不包含恶意指令
  3. CI 环境有适当的沙箱隔离

限制模型操作范围

bash
# 结合 settings 限制
claude -p "任务" \
  --dangerously-skip-permissions \
  --model claude-haiku-4-5 \
  --max-turns 10

环境变量配置

变量说明示例
ANTHROPIC_API_KEYAPI 密钥sk-ant-...
CLAUDE_CODE_MAX_TURNS最大轮次20
CLAUDE_CODE_USE_BEDROCK使用 AWS Bedrock1
CLAUDE_CODE_USE_VERTEX使用 Google Vertex1

高级用例

批量处理脚本

bash
#!/bin/bash
# batch-review.sh — 批量审查多个文件

FILES=$(git diff --name-only origin/main...HEAD | grep -E '\.(ts|tsx)$')

for FILE in $FILES; do
  echo "=== 审查: $FILE ==="
  cat "$FILE" | claude -p \
    "审查这个 TypeScript 文件的代码质量,重点关注类型安全和错误处理。简洁输出。" \
    --dangerously-skip-permissions \
    --model claude-haiku-4-5
  echo ""
done

结合 Makefile

makefile
.PHONY: review test-gen docs

review:
	git diff HEAD~1 | claude -p "代码审查" --dangerously-skip-permissions

test-gen:
	claude -p "为 src/ 目录下缺少测试的文件生成单元测试" --dangerously-skip-permissions

docs:
	claude -p "更新 README.md,反映最新的 API 变更" --dangerously-skip-permissions

输出解析

bash
# JSON 输出解析
RESULT=$(claude -p "分析代码" --output-format json --dangerously-skip-permissions)
STATUS=$(echo "$RESULT" | jq -r '.status')
CONTENT=$(echo "$RESULT" | jq -r '.result')

if [ "$STATUS" = "success" ]; then
  echo "分析完成: $CONTENT"
else
  echo "分析失败"
  exit 1
fi

最佳实践

  1. 使用 Haiku 模型:CI 任务通常不需要最强模型,使用 --model claude-haiku-4-5 降低成本
  2. 限制轮次:设置 --max-turns 防止无限循环
  3. 超时控制:在 CI 配置中设置合理的超时时间
  4. 缓存依赖:缓存 npm 全局安装以加速 CI
  5. 错误处理:检查 Claude Code 的退出码,非零表示失败
  6. 日志管理:使用 --output-format json 便于日志解析和存档