Merge commit 'ac794a6a7051497ff60b947642d44f0f8c04d6c6' into lsp-server

This commit is contained in:
csh
2026-01-08 15:56:37 +08:00
113 changed files with 254751 additions and 176 deletions
@@ -0,0 +1,419 @@
name: 🧪 Playbook 测试套件
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch: # 允许手动触发
concurrency:
group: test-${{ github.repository }}-${{ github.ref }}
cancel-in-progress: true
# ==========================================
# 🔧 配置区域 - 测试参数
# ==========================================
env:
# ===== 测试环境配置 =====
# 测试工作目录
WORKSPACE_DIR: "/home/workspace"
TEST_WORKSPACE: "/home/workspace/playbook-test"
jobs:
# ==========================================
# Job: 全量测试
# ==========================================
test:
name: 🧪 全量测试
runs-on: ubuntu-22.04
steps:
- name: 📥 准备仓库
run: |
echo "========================================"
echo "📥 准备仓库到 WORKSPACE_DIR"
echo "========================================"
REPO_NAME="${{ github.event.repository.name }}"
REPO_DIR="${{ env.WORKSPACE_DIR }}/$REPO_NAME"
TOKEN="${{ secrets.WORKFLOW }}"
if [ -n "$TOKEN" ]; then
REPO_URL="https://oauth2:${TOKEN}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git"
else
REPO_URL="${GITHUB_SERVER_URL}/${{ github.repository }}.git"
fi
if [ -d "$REPO_DIR" ]; then
if [ -d "$REPO_DIR/.git" ]; then
cd "$REPO_DIR"
git clean -fdx
git reset --hard
git fetch --all --tags --force --prune --prune-tags
else
rm -rf "$REPO_DIR"
fi
fi
if [ ! -d "$REPO_DIR/.git" ]; then
mkdir -p "${{ env.WORKSPACE_DIR }}"
git clone "$REPO_URL" "$REPO_DIR"
cd "$REPO_DIR"
fi
TARGET_SHA="${{ github.sha }}"
TARGET_REF="${{ github.ref }}"
if git cat-file -e "$TARGET_SHA^{commit}" 2>/dev/null; then
git checkout -f "$TARGET_SHA"
else
if [ -n "$TARGET_REF" ]; then
git fetch origin "$TARGET_REF"
git checkout -f FETCH_HEAD
else
git checkout -f "${{ github.ref_name }}"
fi
fi
git config --global --add safe.directory "$REPO_DIR"
echo "REPO_DIR=$REPO_DIR" >> $GITHUB_ENV
- name: 🔧 安装测试依赖
run: |
echo "========================================"
echo "🔧 安装测试依赖"
echo "========================================"
apt-get update
apt-get install -y bats cmake clang-format python3-pip
python3 -m pip install --upgrade pip
python3 -m pip install toml tomli jsonschema yamllint
echo ""
echo "✓ bats 版本: $(bats --version)"
echo "✓ Python 版本: $(python3 --version)"
echo "========================================"
- name: 🧪 运行全量测试并生成报告
shell: bash
run: |
set +e
set -o pipefail
overall_fail=0
scripts_status="success"
templates_status="success"
integration_status="success"
docs_status="success"
echo "========================================"
echo "🐚 Shell 脚本测试"
echo "========================================"
cd "$REPO_DIR/tests/scripts"
run_bats() {
local name="$1"
local file="$2"
local output="${name}_test_results.tap"
if [ ! -f "$file" ]; then
echo "⚠️ 未找到测试文件: $file"
scripts_status="failure"
overall_fail=1
return
fi
bats --formatter tap "$file" | tee "$output"
if [ $? -ne 0 ]; then
echo "❌ $name 测试失败"
scripts_status="failure"
overall_fail=1
else
echo "✅ $name 测试通过"
fi
}
run_bats "sync_standards" "test_sync_standards.bats"
run_bats "vendor_playbook" "test_vendor_playbook.bats"
run_bats "install_codex_skills" "test_install_codex_skills.bats"
echo "========================================"
echo "📄 模板验证测试"
echo "========================================"
cd "$REPO_DIR/tests/templates"
run_validator() {
local name="$1"
local script="$2"
if [ ! -f "$script" ]; then
echo "⚠️ 未找到验证脚本: $script"
templates_status="failure"
overall_fail=1
return
fi
chmod +x "$script"
"./$script"
if [ $? -ne 0 ]; then
echo "❌ $name 模板验证失败"
templates_status="failure"
overall_fail=1
else
echo "✅ $name 模板验证通过"
fi
}
run_validator "python" "validate_python_templates.sh"
run_validator "cpp" "validate_cpp_templates.sh"
run_validator "ci" "validate_ci_templates.sh"
echo "========================================"
echo "🔗 集成测试"
echo "========================================"
mkdir -p "${TEST_WORKSPACE}"
cd "${TEST_WORKSPACE}"
# 创建测试项目目录
mkdir -p test-project-tsl
mkdir -p test-project-cpp
mkdir -p test-project-multi
echo "========================================"
echo "🧪 测试场景1: TSL 项目标准同步"
echo "========================================"
cd "${TEST_WORKSPACE}/test-project-tsl"
# 初始化 git 仓库
git init
git config user.name "Test User"
git config user.email "test@example.com"
# 模拟 subtree add(包含 .agents 等点目录,排除 .git
mkdir -p docs/standards/playbook
tar -C "$REPO_DIR" --exclude .git -cf - . | tar -C docs/standards/playbook -xf -
# 运行同步脚本
echo "▶ 运行 sync_standards.sh tsl"
sh docs/standards/playbook/scripts/sync_standards.sh tsl
# 验证结果
if [ -d ".agents/tsl" ] && [ -f ".agents/tsl/index.md" ]; then
echo "✅ TSL 规则集同步成功"
else
echo "❌ TSL 规则集同步失败"
integration_status="failure"
overall_fail=1
fi
if grep -q "# BEGIN playbook .gitattributes" .gitattributes 2>/dev/null \
|| grep -q "# Added from playbook .gitattributes" .gitattributes 2>/dev/null \
|| grep -q "^\\* text=auto eol=lf" .gitattributes 2>/dev/null; then
echo "✅ .gitattributes 更新成功"
else
echo "❌ .gitattributes 更新失败"
integration_status="failure"
overall_fail=1
fi
echo "========================================"
echo "🧪 测试场景2: C++ 项目标准同步"
echo "========================================"
cd "${TEST_WORKSPACE}/test-project-cpp"
git init
git config user.name "Test User"
git config user.email "test@example.com"
mkdir -p docs/standards/playbook
tar -C "$REPO_DIR" --exclude .git -cf - . | tar -C docs/standards/playbook -xf -
echo "▶ 运行 sync_standards.sh cpp"
sh docs/standards/playbook/scripts/sync_standards.sh cpp
if [ -d ".agents/cpp" ] && [ -f ".agents/cpp/index.md" ]; then
echo "✅ C++ 规则集同步成功"
else
echo "❌ C++ 规则集同步失败"
integration_status="failure"
overall_fail=1
fi
echo "========================================"
echo "🧪 测试场景3: 多语言项目标准同步"
echo "========================================"
cd "${TEST_WORKSPACE}/test-project-multi"
git init
git config user.name "Test User"
git config user.email "test@example.com"
mkdir -p docs/standards/playbook
tar -C "$REPO_DIR" --exclude .git -cf - . | tar -C docs/standards/playbook -xf -
echo "▶ 运行 sync_standards.sh tsl cpp"
sh docs/standards/playbook/scripts/sync_standards.sh tsl cpp
if [ -d ".agents/tsl" ] && [ -d ".agents/cpp" ] && [ -f ".agents/index.md" ]; then
echo "✅ 多语言规则集同步成功"
else
echo "❌ 多语言规则集同步失败"
integration_status="failure"
overall_fail=1
fi
echo "========================================"
echo "🧪 测试场景4: vendor_playbook 脚本"
echo "========================================"
cd "${TEST_WORKSPACE}"
mkdir -p test-project-vendor
cd test-project-vendor
git init
git config user.name "Test User"
git config user.email "test@example.com"
echo "▶ 运行 vendor_playbook.sh"
sh "$REPO_DIR/scripts/vendor_playbook.sh" . tsl
if [ -d "docs/standards/playbook" ] && [ -d ".agents/tsl" ]; then
echo "✅ vendor_playbook 脚本执行成功"
else
echo "❌ vendor_playbook 脚本执行失败"
integration_status="failure"
overall_fail=1
fi
echo "========================================"
echo "🧹 清理测试环境..."
chmod -R u+w "${TEST_WORKSPACE}" 2>/dev/null || true
rm -rf "${TEST_WORKSPACE}"
echo "✓ 清理完成"
echo "========================================"
echo "📚 文档一致性检查"
echo "========================================"
cd "$REPO_DIR/tests/integration"
if [ -f "check_doc_links.sh" ]; then
chmod +x check_doc_links.sh
./check_doc_links.sh
if [ $? -eq 0 ]; then
echo "✅ 文档链接检查通过"
else
echo "❌ 发现无效链接"
docs_status="failure"
overall_fail=1
fi
else
echo "⚠️ 未找到链接检查脚本,跳过"
fi
echo "========================================"
echo "🔍 检查代理规则一致性"
echo "========================================"
cd "$REPO_DIR"
# 检查 .agents/ 和 docs/ 中的规则是否一致
python3 << 'EOF'
import sys
from pathlib import Path
errors = []
# 检查各语言的 .agents/ 目录
agents_base = Path(".agents")
for lang_dir in ["tsl", "cpp", "python"]:
agents_lang = agents_base / lang_dir
if not agents_lang.exists():
continue
# 检查必须存在的文件
required_files = ["index.md", "auth.md", "code_quality.md"]
for req_file in required_files:
file_path = agents_lang / req_file
if not file_path.exists():
errors.append(f"❌ 缺少文件: {file_path}")
elif file_path.stat().st_size == 0:
errors.append(f"❌ 文件为空: {file_path}")
if errors:
print("\n".join(errors))
sys.exit(1)
else:
print("✅ 代理规则一致性检查通过")
EOF
if [ $? -ne 0 ]; then
docs_status="failure"
overall_fail=1
fi
echo "========================================"
echo "📊 生成测试综合报告"
echo "========================================"
format_status() {
case "$1" in
success)
echo "✅ 通过"
;;
failure)
echo "❌ 失败"
;;
*)
echo "❔ 未知"
;;
esac
}
cat >> $GITHUB_STEP_SUMMARY << EOFSUMMARY
# 🧪 Playbook 测试报告
## 📋 测试执行摘要
| 测试类型 | 状态 |
|---------|------|
| 🐚 Shell 脚本测试 | $(format_status "$scripts_status") |
| 📄 模板验证测试 | $(format_status "$templates_status") |
| 🔗 集成测试 | $(format_status "$integration_status") |
| 📚 文档一致性检查 | $(format_status "$docs_status") |
---
## 🔗 相关链接
- 📝 [测试文档](tests/README.md)
- 🐛 [问题反馈](../../issues)
- 📖 [开发指南](docs/index.md)
---
<div align="center">
*🤖 由 [Gitea Actions](../../actions) 自动生成*
EOFSUMMARY
echo "*📅 生成时间: $(date -u '+%Y-%m-%d %H:%M:%S UTC')*" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "</div>" >> $GITHUB_STEP_SUMMARY
echo "========================================"
if [ "$overall_fail" -ne 0 ]; then
echo "❌ 测试失败"
exit 1
fi
echo "✅ 全量测试通过"