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 环境中使用,确保:
- API Key 通过 Secrets 管理,不在日志中暴露
- 任务提示词经过审核,不包含恶意指令
- CI 环境有适当的沙箱隔离
限制模型操作范围
bash
# 结合 settings 限制
claude -p "任务" \
--dangerously-skip-permissions \
--model claude-haiku-4-5 \
--max-turns 10环境变量配置
| 变量 | 说明 | 示例 |
|---|---|---|
ANTHROPIC_API_KEY | API 密钥 | sk-ant-... |
CLAUDE_CODE_MAX_TURNS | 最大轮次 | 20 |
CLAUDE_CODE_USE_BEDROCK | 使用 AWS Bedrock | 1 |
CLAUDE_CODE_USE_VERTEX | 使用 Google Vertex | 1 |
高级用例
批量处理脚本
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最佳实践
- 使用 Haiku 模型:CI 任务通常不需要最强模型,使用
--model claude-haiku-4-5降低成本 - 限制轮次:设置
--max-turns防止无限循环 - 超时控制:在 CI 配置中设置合理的超时时间
- 缓存依赖:缓存 npm 全局安装以加速 CI
- 错误处理:检查 Claude Code 的退出码,非零表示失败
- 日志管理:使用
--output-format json便于日志解析和存档