CI/CD 集成
wescode 提供命令行模式(CLI),可以将 AI 代码审查、测试生成、重构检查等能力集成到 CI/CD 流水线中,实现自动化的代码质量保障。
命令行模式
CLI 入口
wescode 提供 wescode run 子命令用于非交互式执行:
# 基本用法
wescode run "修复这个 Bug" --workdir /path/to/repo
# 等价于在 IDE Chat 面板中输入提示
# 但以命令行方式运行,适合 CI 环境
命令行参数
wescode run [OPTIONS] "PROMPT"
Options:
--workdir PATH # 项目目录(默认当前目录)
--model MODEL # 指定模型
--provider PROVIDER # 指定 Provider
--max-turns N # 最大对话轮次(默认 90)
--timeout SECONDS # 超时时间
--output FORMAT # 输出格式:text/json/markdown
--quiet # 安静模式,只输出最终结果
--no-edit # 只分析不修改文件
--session ID # 指定会话 ID(续接对话)
使用示例
# 代码审查(只分析不修改)
wescode run "/review --no-edit" --workdir ./myproject --output json
# 测试生成
wescode run "/test generate internal/service/" --workdir ./myproject
# 代码分析
wescode run "分析这个项目的架构问题" --workdir ./myproject --no-edit
# 指定模型
wescode run "/review" --model claude-sonnet-4-20250514 --provider anthropic
自动化脚本
Shell 脚本集成
#!/bin/bash
# scripts/ai-review.sh
set -e
PROJECT_DIR="${1:-.}"
OUTPUT_DIR="${2:-./review-reports}"
mkdir -p "$OUTPUT_DIR"
echo "🔍 运行 AI 代码审查..."
# 审查当前变更
wescode run "/review" \
--workdir "$PROJECT_DIR" \
--output json \
--no-edit \
--quiet \
> "$OUTPUT_DIR/review-report.json"
# 解析结果
ERRORS=$(jq '.summary.errors' "$OUTPUT_DIR/review-report.json")
WARNINGS=$(jq '.summary.warnings' "$OUTPUT_DIR/review-report.json")
echo "审查完成: $ERRORS 个错误, $WARNINGS 个警告"
# 如果有错误,返回非零退出码
if [ "$ERRORS" -gt 0 ]; then
echo "❌ 发现 $ERRORS 个错误,审查未通过"
exit 1
fi
echo "✅ 审查通过"
Makefile 集成
# Makefile
.PHONY: ai-review ai-test ai-check
# AI 代码审查
ai-review:
@echo "Running AI code review..."
@wescode run "/review" --no-edit --output json --quiet > .review-report.json
@jq '.summary' .review-report.json
# AI 测试生成
ai-test:
@echo "Generating tests for changed files..."
@git diff --name-only HEAD~1 | xargs -I {} wescode run "/test generate {}" --quiet
# 完整 AI 检查
ai-check: ai-review
@echo "Running AI quality check..."
@wescode run "/refactor analyze --output json" --no-edit --quiet > .refactor-report.json
@echo "Review and refactor analysis complete."
# CI 一键检查
ci: lint test ai-check
@echo "All CI checks passed."
pre-commit Hook
#!/bin/bash
# .git/hooks/pre-commit
# 只审查暂存的文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACMR)
if [ -z "$STAGED_FILES" ]; then
exit 0
fi
echo "🔍 AI 审查暂存文件..."
# 运行快速审查
RESULT=$(wescode run "/review --severity error" \
--no-edit --output json --quiet 2>&1)
ERRORS=$(echo "$RESULT" | jq -r '.summary.errors // 0')
if [ "$ERRORS" -gt 0 ]; then
echo "❌ 发现 $ERRORS 个严重问题"
echo "$RESULT" | jq -r '.issues[] | select(.severity == "error") | " - \(.file):\(.line) \(.message)"'
echo ""
echo "使用 --no-verify 跳过此检查"
exit 1
fi
echo "✅ 审查通过"
持续集成
GitHub Actions
# .github/workflows/ai-review.yml
name: AI Code Review
on:
pull_request:
branches: [main]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install wescode CLI
run: |
curl -sSL https://install.wescode.dev | bash
echo "$HOME/.wescode/bin" >> $GITHUB_PATH
- name: Configure Provider
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
wescode init --non-interactive
wescode config set provider.default anthropic
- name: Run AI Review
run: |
wescode run "/review" \
--no-edit \
--output json \
--quiet \
> review-report.json
- name: Check Results
run: |
ERRORS=$(jq '.summary.errors' review-report.json)
if [ "$ERRORS" -gt 0 ]; then
echo "::error::AI Review found $ERRORS errors"
jq -r '.issues[] | select(.severity == "error") | "::error file=\(.file),line=\(.line)::\(.message)"' review-report.json
exit 1
fi
- name: Upload Report
if: always()
uses: actions/upload-artifact@v4
with:
name: ai-review-report
path: review-report.json
GitLab CI
# .gitlab-ci.yml
ai-review:
stage: review
image: wescode/cli:latest
script:
- wescode init --non-interactive
- wescode run "/review" --no-edit --output json --quiet > review-report.json
- |
ERRORS=$(jq '.summary.errors' review-report.json)
if [ "$ERRORS" -gt 0 ]; then
echo "AI Review found $ERRORS errors"
exit 1
fi
artifacts:
reports:
codequality: review-report.json
when: always
only:
- merge_requests
Jenkins Pipeline
// Jenkinsfile
pipeline {
agent any
stages {
stage('AI Review') {
steps {
sh '''
wescode run "/review" \
--no-edit \
--output json \
--quiet \
> review-report.json
'''
}
post {
always {
archiveArtifacts artifacts: 'review-report.json'
}
}
}
}
}
质量门禁
门禁规则配置
通过 .wescode/quality-gate.yaml 定义质量门禁:
# .wescode/quality-gate.yaml
gates:
# 代码审查门禁
review:
enabled: true
max-errors: 0 # 不允许任何错误
max-warnings: 10 # 最多 10 个警告
required-score: 7.0 # 最低质量评分
# 测试覆盖门禁
coverage:
enabled: true
min-statement: 80 # 语句覆盖率 ≥ 80%
min-branch: 70 # 分支覆盖率 ≥ 70%
min-function: 90 # 函数覆盖率 ≥ 90%
# 重构检测门禁
refactoring:
enabled: true
max-complexity: 15 # 最大圈复杂度
max-duplication: 5 # 最大重复代码百分比
max-function-length: 100 # 最大函数行数
# 安全检查门禁
security:
enabled: true
block-on: ["high", "critical"]
门禁执行
# 运行所有门禁检查
wescode gate check
# 运行特定门禁
wescode gate check --gate review
# 输出详细报告
wescode gate check --verbose
# 返回退出码
# 0 = 全部通过
# 1 = 有门禁未通过
# 2 = 执行错误
门禁报告
质量门禁检查报告
═══════════════════════════════════
代码审查 ✅ 通过
错误: 0 (≤ 0)
警告: 3 (≤ 10)
评分: 8.5 (≥ 7.0)
测试覆盖 ⚠️ 警告
语句: 82% (≥ 80%) ✅
分支: 68% (≥ 70%) ❌
函数: 95% (≥ 90%) ✅
重构检测 ✅ 通过
最大复杂度: 12 (≤ 15)
代码重复: 3% (≤ 5%)
安全检查 ✅ 通过
高危: 0
中危: 2
═══════════════════════════════════
总结: 1 个门禁未通过 (测试覆盖/分支)
建议: 为 config.go 的条件分支补充测试
报告生成
报告格式
wescode 支持多种报告输出格式:
| 格式 | 用途 | 命令参数 |
|---|---|---|
| JSON | CI 系统集成 | --output json |
| Markdown | PR 评论、文档 | --output markdown |
| HTML | 邮件报告 | --output html |
| JUnit XML | 测试报告集成 | --output junit |
| SARIF | GitHub Code Scanning | --output sarif |
自定义报告模板
# .wescode/report-template.yaml
template:
header: |
# AI 代码质量报告
项目: {{ project_name }}
日期: {{ date }}
分支: {{ branch }}
sections:
- review-summary
- issues-by-severity
- coverage-summary
- recommendations
footer: |
---
由 wescode AI 自动生成
报告集成示例
# 生成 SARIF 报告用于 GitHub Code Scanning
wescode run "/review" --output sarif > results.sarif
# 上传到 GitHub
gh api \
-X POST \
-H "Accept: application/vnd.github+json" \
"/repos/{owner}/{repo}/code-scanning/sarifs" \
-f "sarif=$(gzip -c results.sarif | base64)"
常见问题
Q: CI 环境如何配置 API Key?
A: 通过环境变量传入:ANTHROPIC_API_KEY、OPENAI_API_KEY 等。或使用 wescode config set 命令在 CI 步骤中配置。
Q: CI 运行速度慢?
A: 使用 --no-edit 避免不必要的文件修改,使用 --quiet 减少输出开销。对于大项目,可以只审查变更文件:git diff --name-only HEAD~1 | xargs wescode run "/review"。
Q: 如何处理 CI 中的 CKG 索引?
A: CLI 模式下 CKG 索引自动构建。建议缓存 Cell 数据目录以加速后续构建。使用 GitHub Actions 的缓存功能:
- uses: actions/cache@v4
with:
path: ~/.local/share/wescode/cells/
key: wescode-ckg-${{ hashFiles('**/*.go') }}
Q: 质量门禁配置能覆盖 CI 级别吗?
A: 项目级 .wescode/quality-gate.yaml 是默认配置。CI 中可以通过命令行参数覆盖:wescode gate check --min-coverage 90。