Headless模式与自动化
Headless模式让Claude Code可以在非交互环境下运行,这是实现CI/CD集成和自动化的关键。
什么是Headless模式?
Headless模式使用 -p 参数执行单行命令,不进入交互界面:
bash
# 交互模式
claude
> 输入问题...
# Headless模式
claude -p "分析这个项目的结构"基本用法
单行命令
bash
# 分析代码
claude -p "这个项目的架构是什么?"
# 生成文档
claude -p "为src/api目录生成API文档"
# 代码审查
claude -p "审查最近一次提交的代码"指定文件
bash
# 分析特定文件
claude -p "解释 src/auth.py 的功能" --file src/auth.py
# 处理多个文件
claude -p "检查这些文件的类型定义" --file "src/**/*.ts"输出格式
JSON输出
bash
claude -p "统计项目中的TODO数量" --output-format json输出:
json
{
"result": "找到15个TODO注释",
"details": [
{"file": "src/main.ts", "line": 42, "content": "TODO: 添加错误处理"},
{"file": "src/api.ts", "line": 15, "content": "TODO: 优化性能"}
]
}流式JSON
适合实时处理:
bash
claude -p "分析日志文件并报告错误" --output-format stream-json纯文本(默认)
bash
claude -p "解释这个函数的作用"CI/CD集成
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
- name: Setup Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Configure Claude
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
claude config set apiKey $ANTHROPIC_API_KEY
- name: Run Code Review
run: |
claude -p "审查这个PR的代码变更,检查安全问题和性能问题" \
--output-format json > review-result.json
- name: Post Review Comment
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const result = JSON.parse(fs.readFileSync('review-result.json'));
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: result.result
});GitLab CI
yaml
# .gitlab-ci.yml
claude-review:
stage: test
image: node:20
script:
- npm install -g @anthropic-ai/claude-code
- export ANTHROPIC_API_KEY=$CI_ANTHROPIC_API_KEY
- claude -p "运行代码审查并生成报告" --output-format json > review.json
artifacts:
paths:
- review.jsonJenkins Pipeline
groovy
pipeline {
agent any
stages {
stage('Claude Review') {
steps {
sh 'npm install -g @anthropic-ai/claude-code'
withCredentials([string(credentialsId: 'anthropic-api-key', variable: 'API_KEY')]) {
sh 'claude config set apiKey $API_KEY'
sh 'claude -p "审查代码" --output-format json > review.json'
}
}
}
}
}Git Hooks集成
Pre-commit Hook
bash
#!/bin/bash
# .git/hooks/pre-commit
# 获取待提交的文件
files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(ts|tsx|js|jsx)$')
if [ -n "$files" ]; then
echo "运行Claude代码检查..."
result=$(claude -p "检查这些文件的代码质量:$files" \
--dangerously-skip-permissions \
--output-format text)
if echo "$result" | grep -q "CRITICAL"; then
echo "发现严重问题,提交被阻止"
echo "$result"
exit 1
fi
fi
exit 0Pre-push Hook
bash
#!/bin/bash
# .git/hooks/pre-push
echo "运行安全检查..."
result=$(claude -p "检查代码中的安全漏洞" \
--dangerously-skip-permissions)
if echo "$result" | grep -q "SECURITY"; then
echo "发现安全问题,推送被阻止"
exit 1
fi
exit 0自动化脚本示例
批量生成测试
bash
#!/bin/bash
# generate-tests.sh
# 为所有没有测试的源文件生成测试
find src -name "*.ts" -not -name "*.test.ts" | while read file; do
test_file="${file%.ts}.test.ts"
if [ ! -f "$test_file" ]; then
echo "为 $file 生成测试..."
claude -p "为这个文件生成完整的单元测试:$file" \
--file "$file" \
--output-format text > "$test_file"
fi
done自动化文档生成
bash
#!/bin/bash
# generate-docs.sh
# 生成API文档
claude -p "扫描所有API端点并生成OpenAPI文档" \
--output-format json > docs/api.json
# 生成README
claude -p "根据项目内容更新README.md" \
--dangerously-skip-permissions
# 生成CHANGELOG
claude -p "根据git历史生成CHANGELOG" \
--output-format text > CHANGELOG.md代码质量检查
bash
#!/bin/bash
# code-quality-check.sh
echo "=== 运行代码质量检查 ==="
# 1. 检查代码复杂度
echo "检查代码复杂度..."
claude -p "分析代码复杂度,找出最复杂的10个函数" \
--output-format json > reports/complexity.json
# 2. 检查安全问题
echo "检查安全问题..."
claude -p "扫描代码中的安全漏洞,包括SQL注入、XSS等" \
--output-format json > reports/security.json
# 3. 检查性能问题
echo "检查性能问题..."
claude -p "找出可能的性能瓶颈" \
--output-format json > reports/performance.json
# 4. 生成汇总报告
claude -p "根据以上检查结果生成汇总报告" \
--output-format text > reports/summary.md
echo "=== 检查完成 ==="自动化重构
bash
#!/bin/bash
# auto-refactor.sh
# 找出需要重构的代码
issues=$(claude -p "找出代码中需要重构的部分,列出文件路径和原因" \
--output-format json)
# 对每个问题执行重构
echo "$issues" | jq -r '.files[]' | while read file; do
echo "重构 $file..."
claude -p "重构这个文件以提高代码质量" \
--file "$file" \
--dangerously-skip-permissions
done定时任务
Cron集成
bash
# crontab -e
# 每天早上8点运行代码审查
0 8 * * * cd /path/to/project && claude -p "每日代码审查" >> /var/log/claude-daily.log
# 每周一生成周报
0 9 * * 1 cd /path/to/project && claude -p "生成本周开发周报" > /reports/weekly.md使用systemd
ini
# /etc/systemd/system/claude-watch.service
[Unit]
Description=Claude Code Watch Service
[Service]
Type=simple
ExecStart=/usr/local/bin/claude-watch.sh
Restart=on-failure
[Install]
WantedBy=multi-user.targetbash
#!/bin/bash
# /usr/local/bin/claude-watch.sh
while true; do
# 监控文件变化
inotifywait -r -e modify,create,delete ./src
# 运行检查
claude -p "检查最近的代码变更" --output-format json >> /var/log/claude-watch.log
sleep 60
done高级技巧
链式命令
bash
# 多步骤任务
claude -p "分析代码" && \
claude -p "根据分析结果重构" && \
claude -p "运行测试验证"管道处理
bash
# 从日志分析
tail -100 /var/log/app.log | claude -p "分析这些日志,找出错误原因"
# 从git diff分析
git diff HEAD~1 | claude -p "审查这次代码变更"环境变量传递
bash
# 传递环境变量
export BRANCH_NAME=$(git branch --show-current)
claude -p "当前分支是 $BRANCH_NAME,分析这个分支的变更"最佳实践
1. 使用 --dangerously-skip-permissions 谨慎
仅在受信任的环境中使用:
bash
# CI环境可以安全使用
if [ "$CI" = "true" ]; then
claude -p "..." --dangerously-skip-permissions
else
claude -p "..."
fi2. 错误处理
bash
#!/bin/bash
set -e
result=$(claude -p "检查代码" --output-format json)
if [ $? -ne 0 ]; then
echo "Claude执行失败"
exit 1
fi
# 处理结果
echo "$result" | jq '.result'3. 结果验证
bash
result=$(claude -p "生成配置文件")
# 验证输出
if ! echo "$result" | jq -e . > /dev/null 2>&1; then
echo "输出不是有效的JSON"
exit 1
fi下一步
学会了Headless模式后,继续学习 高级CLI参数。