# CI 检查脚本规范 ## 概述 本变更新增了自动化代码规范检查脚本,用于在 CI/CD 流程中检测规范违规。 ## 检查脚本列表 ### 1. Service 层错误处理检查 **文件**:`scripts/check-service-errors.sh` **用途**:检查 Service 层是否使用 `fmt.Errorf` 对外返回错误 **检查范围**: - 目录:`internal/service/**/*.go` - 排除:测试文件(`*_test.go`) - 排除:带有 `// whitelist:` 注释的行 **检查逻辑**: ```bash FILES=$(find internal/service -name "*.go" -type f) VIOLATIONS=$(grep -n "fmt\.Errorf" $FILES | grep -v "// whitelist:") if [ -n "$VIOLATIONS" ]; then echo "❌ 发现 Service 层使用 fmt.Errorf" exit 1 fi ``` **退出码**: - `0`:检查通过 - `1`:检查失败(发现违规) **白名单机制**: 如果某处确实需要使用 `fmt.Errorf`(如内部调试),添加注释: ```go // 特殊场景:内部日志调试 debugErr := fmt.Errorf("debug info: %v", data) // whitelist: logger.Debug("调试信息", zap.Error(debugErr)) ``` ### 2. 注释路径一致性检查 **文件**:`scripts/check-comment-paths.sh` **用途**:检查 Handler 层注释中是否残留已弃用的 `/api/v1` 路径 **检查范围**: - 目录:`internal/handler/**/*.go` - 排除:测试文件(`*_test.go`) **检查逻辑**: ```bash VIOLATIONS=$(grep -rn "/api/v1" internal/handler/ | grep -v "_test.go") if [ -n "$VIOLATIONS" ]; then echo "❌ 发现残留的 /api/v1 路径注释" exit 1 fi ``` **退出码**: - `0`:检查通过 - `1`:检查失败(发现残留路径) **正确路径**: - `/api/admin/*`:后台管理接口 - `/api/h5/*`:H5 端接口 - `/api/c/v1/*`:个人客户接口 ### 3. 统一检查脚本 **文件**:`scripts/check-all.sh` **用途**:运行所有代码规范检查 **检查流程**: ```bash set -e # 任何检查失败立即退出 bash scripts/check-service-errors.sh bash scripts/check-comment-paths.sh # 未来可添加更多检查... echo "✅ 所有检查通过" ``` **使用场景**: - 本地开发:提交代码前运行 - CI/CD:自动化检查流程 - Pre-commit hook:提交前自动检查(可选) ## 脚本规范 ### 输出格式 所有检查脚本应遵循统一的输出格式: ```bash # 1. 开始提示 echo "🔍 检查 [检查项名称]..." # 2. 检查逻辑 VIOLATIONS=$(检查命令) # 3. 结果输出 if [ -n "$VIOLATIONS" ]; then echo "" echo "❌ 发现违规:" echo "$VIOLATIONS" echo "" echo "修复建议:" echo " - 建议1" echo " - 建议2" exit 1 fi echo "✅ [检查项名称]检查通过" ``` ### 错误消息规范 错误消息应包含: 1. **问题描述**:明确说明发现了什么问题 2. **违规位置**:文件路径和行号 3. **修复建议**:如何修复这些问题 4. **白名单机制**:如何豁免特殊场景(如适用) **示例**: ``` ❌ 发现 Service 层使用 fmt.Errorf: internal/service/shop.go:45: return fmt.Errorf("店铺不存在") internal/service/account.go:78: return fmt.Errorf("创建失败: %w", err) 请使用以下方式替代: - 业务错误:errors.New(code, msg) - 系统错误:errors.Wrap(code, err, msg) 如果某处确实需要使用 fmt.Errorf(如内部调试),请添加注释:// whitelist: ``` ### 脚本权限 所有脚本应添加执行权限: ```bash chmod +x scripts/check-service-errors.sh chmod +x scripts/check-comment-paths.sh chmod +x scripts/check-all.sh ``` ### Shell 兼容性 脚本应使用 Bash 标准语法,兼容 Linux 和 macOS: - 使用 `#!/bin/bash` 作为 shebang - 避免使用非标准工具(仅依赖 grep、find、bash 等) - 使用 `set -e` 确保错误自动退出 ## CI 集成(可选) ### GitHub Actions 配置 **文件**:`.github/workflows/lint.yml` ```yaml name: Code Quality Check on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v4 with: go-version: '1.25' - name: Run Code Quality Checks run: bash scripts/check-all.sh ``` ### 本地使用 开发者可以在本地运行检查: ```bash # 运行所有检查 bash scripts/check-all.sh # 运行单项检查 bash scripts/check-service-errors.sh bash scripts/check-comment-paths.sh ``` ### Pre-commit Hook(可选) 可以配置 Git pre-commit hook 在提交前自动检查: **文件**:`.git/hooks/pre-commit` ```bash #!/bin/bash echo "运行代码规范检查..." bash scripts/check-all.sh if [ $? -ne 0 ]; then echo "" echo "代码规范检查失败,提交已取消" echo "请修复上述问题后重新提交" exit 1 fi echo "代码规范检查通过,继续提交..." ``` ## 扩展性设计 ### 添加新的检查规则 添加新的检查规则的步骤: 1. **创建检查脚本**:`scripts/check-{name}.sh` ```bash #!/bin/bash echo "🔍 检查 [检查项名称]..." # 检查逻辑 VIOLATIONS=$(检查命令) if [ -n "$VIOLATIONS" ]; then echo "❌ 发现违规" echo "$VIOLATIONS" exit 1 fi echo "✅ 检查通过" ``` 2. **添加执行权限**: ```bash chmod +x scripts/check-{name}.sh ``` 3. **集成到统一脚本**: 在 `scripts/check-all.sh` 中添加: ```bash bash scripts/check-{name}.sh ``` 4. **测试脚本**: ```bash # 测试通过场景 bash scripts/check-{name}.sh # 应返回退出码 0 # 测试失败场景(制造违规) # 验证能检测到违规并返回退出码 1 ``` 5. **更新文档**: 在 `README.md` 和本规范文档中添加新检查的说明 ### 检查规则示例 以下是一些可能添加的检查规则: | 检查项 | 脚本名称 | 检查内容 | |-------|---------|---------| | 常量硬编码 | `check-constants.sh` | 检查代码中是否有硬编码的 magic numbers 和字符串 | | 日志规范 | `check-logging.sh` | 检查日志是否使用结构化字段(zap.String、zap.Int 等) | | TODO 标记 | `check-todos.sh` | 统计代码中的 TODO 数量,超过阈值时警告 | | 导入路径 | `check-imports.sh` | 检查是否使用了禁止的包(如 `fmt.Println`) | | 测试覆盖率 | `check-coverage.sh` | 检查测试覆盖率是否达标 | ## 性能考虑 ### 检查耗时 所有检查脚本应在合理时间内完成: - 单项检查:< 10 秒 - 统一检查:< 30 秒 ### 优化建议 1. **并行执行**:多个独立检查可以并行运行 2. **缓存结果**:避免重复扫描相同文件 3. **增量检查**:仅检查变更的文件(CI 场景) ### 并行执行示例 ```bash #!/bin/bash # scripts/check-all-parallel.sh # 在后台运行检查 bash scripts/check-service-errors.sh & PID1=$! bash scripts/check-comment-paths.sh & PID2=$! # 等待所有检查完成 wait $PID1 RESULT1=$? wait $PID2 RESULT2=$? # 检查结果 if [ $RESULT1 -ne 0 ] || [ $RESULT2 -ne 0 ]; then echo "❌ 至少有一项检查失败" exit 1 fi echo "✅ 所有检查通过" ``` ## 测试策略 ### 脚本测试清单 每个检查脚本应测试以下场景: 1. **通过场景**:无违规时返回 0 2. **失败场景**:有违规时返回 1 并输出错误 3. **白名单机制**:白名单注释生效(如适用) 4. **边界情况**:空目录、特殊字符等 ### 测试示例 ```bash # 测试 Service 层错误检查 # 1. 通过场景 bash scripts/check-service-errors.sh echo "退出码: $?" # 应为 0 # 2. 失败场景 echo 'return fmt.Errorf("test")' >> internal/service/test_violation.go bash scripts/check-service-errors.sh echo "退出码: $?" # 应为 1 rm internal/service/test_violation.go # 3. 白名单机制 echo 'return fmt.Errorf("debug") // whitelist:' >> internal/service/test_whitelist.go bash scripts/check-service-errors.sh echo "退出码: $?" # 应为 0 rm internal/service/test_whitelist.go ``` ## 维护指南 ### 定期维护 - **每月审查**:检查是否有新的规范需要自动化检查 - **每季度更新**:根据团队反馈优化错误消息和修复建议 - **每半年评估**:评估检查脚本的性能和有效性 ### 处理误报 如果检查脚本产生误报: 1. **评估规则**:检查规则是否过于严格 2. **白名单机制**:考虑添加白名单支持 3. **改进检测**:优化正则表达式或检查逻辑 4. **文档说明**:在规范文档中说明特殊场景 ### 版本控制 检查脚本应纳入版本控制: - 脚本修改需要通过 Code Review - 重大变更需要更新文档 - 保持脚本向后兼容(或提供迁移指南) ## 总结 本 CI 检查规范定义了: 1. **检查脚本列表**:Service 层错误检查、注释路径检查、统一检查 2. **脚本规范**:输出格式、错误消息、Shell 兼容性 3. **CI 集成**:GitHub Actions、本地使用、Pre-commit Hook 4. **扩展性设计**:添加新规则的步骤和示例 5. **性能优化**:并行执行、增量检查 6. **测试策略**:通过/失败/白名单/边界情况 7. **维护指南**:定期审查、处理误报、版本控制 这些脚本确保代码质量和规范一致性,支持自动化检查和团队协作。