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 支持多种报告输出格式:

格式用途命令参数
JSONCI 系统集成--output json
MarkdownPR 评论、文档--output markdown
HTML邮件报告--output html
JUnit XML测试报告集成--output junit
SARIFGitHub 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。