Skip to content

chore(core-api): upgrade golangci-lint and fix all lint issues - #2572

Merged
wklken merged 2 commits into
TencentBlueKing:masterfrom
wklken:ft_upgrade_golangci_lint
Mar 24, 2026
Merged

chore(core-api): upgrade golangci-lint and fix all lint issues#2572
wklken merged 2 commits into
TencentBlueKing:masterfrom
wklken:ft_upgrade_golangci_lint

Conversation

@wklken

@wklken wklken commented Mar 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Upgrade golangci-lint config and bump Go version requirement to 1.25.5
  • Fix all lint issues reported by the upgraded linter across src/core-api:
    • errcheck: handle Close() return errors in mysql.go
    • noctx: replace ExecExecContext and NewRequestNewRequestWithContext
    • forcetypeassert: apply comma-ok pattern to all retrieve* functions in pkg/cacheimpls
    • gosec: suppress intentional math/rand use for cache TTL jitter (non-security context)
    • intrange: adopt Go 1.22+ integer range syntax in dbmock.go
  • Update AGENTS.md: document Go version activation, post-change checklist (make lint + make test), and PR target

Test plan

  • make lint passes with 0 issues

- Upgrade golangci-lint config and Go version to 1.25.5
- Fix errcheck: handle Close() return errors in mysql.go
- Fix noctx: use ExecContext and NewRequestWithContext
- Fix forcetypeassert: use comma-ok pattern across all cacheimpls retrieve functions
- Fix gosec: suppress intentional math/rand use for cache TTL jitter
- Fix intrange: use Go 1.22+ integer range syntax in dbmock.go
- Update AGENTS.md: document Go version activation, post-change checklist, and PR target
@wklken
wklken requested a review from Han-Ya-Jun March 23, 2026 10:04

@wklken wklken left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

变更概述:PR 升级了 golangci-lint 到 v2.11.2,Go 版本从 1.24.4 升级到 1.25.5,并修复了所有新增的 lint 问题。主要变更包括:启用 30+ linter、修复 forcetypeassert(所有 retrieve 函数使用 comma-ok 模式)、errcheck(处理 Close 返回值)、noctx(使用带 context 的 API)、intrange(现代整数循环语法),以及改进 Makefile 和文档。

发现的问题

  1. TestConnection 忽略 closeErr 返回值

    // mysql.go:82-84
    if closeErr := conn.Close(); closeErr != nil {
        logging.GetLogger().Warnf("failed to close test connection: %s", closeErr)
    }
    return nil  // 仍然返回 nil

    测试连接关闭失败被忽略,可能掩盖资源泄漏问题。建议:

    if closeErr := conn.Close(); closeErr != nil {
        return fmt.Errorf("failed to close test connection: %w", closeErr)
    }
  2. gosec G104 排除过于宽泛
    .golangci.yaml 排除了 G104(未检查的错误),这与 PR 努力修复 errcheck 的方向矛盾。建议只对特定安全场景保留 G104(如 Close),其他错误仍应检查。

  3. make lint 使用 --fix 参数
    Makefile:37$(GOLINTER) run --fix 会自动修复,可能导致 CI 环境意外修改代码。生产环境建议去掉 --fix

优点

  1. Comma-ok 模式实现正确:所有 8 个 retrieve* 函数都正确实现了类型断言保护,错误消息清晰。

  2. noctx 修复恰当ExecContextNewRequestWithContext 替换正确,测试代码中使用 context.Background() 合理。

  3. gosec 抑制合理math/rand 用于缓存 TTL 抖动确实是非安全场景,//nolint:gosec 注释恰当。

  4. intrange 现代化:仅修改测试文件 dbmock.go,使用 Go 1.22+ 整数范围语法,风险可控。

  5. golangci-lint 配置结构化:按 bug catchers/modernization/code quality 分类清晰,禁用了可能产生误报的现代化规则。

  6. AGENTS.md 完善:新增 Go 版本激活说明和 PR 目标分支文档,有助于开发者快速上手。

  7. router.go 优化:移除不必要的变量 shadowing,是正确的 Go 1.22+ 前向兼容性改进。

总结

这是一次高质量的 lint 工具升级和代码修复。主要问题集中在 TestConnection 的错误处理和 gosec G104 排除范围上。

建议合并,但建议在合并前处理 TestConnection 的错误返回问题。


由 Claude 自动 review | 基于默认 Review 流程 [from openclaw-internal]

@Han-Ya-Jun

Copy link
Copy Markdown
Member

Code Review 报告

1. 基本信息

项目 内容
审查时间 2026-03-23 20:46
需求关联 N/A - golangci-lint 升级与代码质量改进
审查范围 PR #2572 - chore(core-api): upgrade golangci-lint and fix all lint issues
代码变动 282行 (+196/-86), 23文件
审查结论 ✅ LGTM - 可立即合并 (得分: 9.5/10)

2. 问题统计

级别 数量 说明
🛑 Critical (P0) 0 必须修复
⚠️ Major (P1) 0 强烈建议修复
💡 Minor (P2) 3 可选优化

总计: 3 个问题(均为可选优化建议)

评价: ✅ 无阻塞问题,代码质量全面提升,建议立即合并。


3. 需求与设计符合性

本次审查未关联具体需求文档,属于工具链升级与代码质量改进,跳过需求符合性分析。

改进目标

  1. 升级 golangci-lint 配置,启用更多 linters
  2. 修复 Go 1.25.5 环境下的所有 lint 问题
  3. 提升代码质量(错误处理、类型安全、Context 传播)

4. 代码质量与复杂度分析

4.1 变更概览

类别 修复内容 文件数 行数
错误处理 (errcheck) 处理 Close() 返回错误 1 20
类型安全 (forcetypeassert) comma-ok 模式 9 45
Context 传播 (noctx) ExecContext/NewRequestWithContext 4 15
安全审查 (gosec) nolint 标记 1 1
现代化语法 (intrange) Go 1.22+ 整数范围 1 2
配置升级 .golangci.yaml + Go 版本 7 199

4.2 代码质量提升

  • 错误处理: 10/10 (所有 Close() 错误现在都记录)
  • 类型安全: 10/10 (消除了类型断言 panic 风险)
  • 可维护性: 10/10 (Context 传播支持超时和取消)

详细评价: 全面提升代码质量,从"能用"到"生产级"。所有修复都遵循 Go 最佳实践。


5. 深度代码审查

5.1 严重问题 (Critical) 🛑

未发现严重问题。


5.2 重要问题 (Major) ⚠️

未发现重要问题。

所有 lint 问题已修复,代码质量显著提升。


5.3 优化建议 (Minor) 💡

P2-1. 补充 Close 错误处理的单元测试

  • 📍 位置: pkg/database/mysql.go:82, 125
  • 📝 描述: 虽然新增的错误处理路径已经过人工审查,但建议补充单元测试覆盖 Close 错误场景
  • 💡 建议: 添加测试覆盖 Close 返回错误的情况

测试示例:

func TestDBClient_Close_Error(t *testing.T) {
    // 模拟 Close 返回错误的场景
    mockDB := &mockDB{closeErr: errors.New("close failed")}
    client := &DBClient{DB: mockDB}
    
    // 应该记录 Warn 日志但不 panic
    client.Close()
}

P2-2. Context 传播可以更统一

  • 📍 位置: pkg/database/mysql.go:106
  • 📝 描述: context.Background() 适合初始化场景,但长期可考虑从上层传递 context 以支持全链路超时控制
  • 💡 建议: 可选改进,不影响当前功能

当前 (合理):

_, err = db.DB.ExecContext(context.Background(), `SET time_zone = "+00:00";`)

可选改进:

func (db *DBClient) Connect(ctx context.Context) error {
    // ...
    _, err = db.DB.ExecContext(ctx, `SET time_zone = "+00:00";`)
}

P2-3. golangci-lint 版本固定说明

  • 📍 位置: Makefile:24
  • 📝 描述: 使用固定版本 v2.11.2,建议在文档中说明升级策略
  • 💡 建议: 在 AGENTS.md 或 README 中补充说明

6. 专项评估

6.1 安全风险 (Security) 🛡️

未发现安全风险。反而修复了潜在风险。

修复的安全问题:

  • 类型断言 panic 风险: 9 个 cacheimpls 文件采用 comma-ok 模式,防止运行时 panic
  • gosec 审查通过: 唯一的 math/rand 使用场景(缓存 TTL 抖动)已正确标记 //nolint:gosec

审查验证:

// ✅ 正确使用 nolint - 非加密场景
return time.Duration(rand.Intn(seconds*1000)) * time.Millisecond //nolint:gosec

6.2 性能考量 (Performance) 🚀

未发现性能问题。

正向影响:

  • ✅ Context 传播:支持请求取消,避免无效计算
  • ✅ 错误记录:提升可观测性,便于性能调优

6.3 资源管理 (Resource Management)

⭐ 重大改进:错误处理全面提升

修复前

// ❌ 静默忽略 Close 错误 → 资源泄漏风险
conn.Close()
db.DB.Close()

修复后

// ✅ 记录 Close 错误 → 可观测性提升
if closeErr := conn.Close(); closeErr != nil {
    logging.GetLogger().Warnf("failed to close test connection: %s", closeErr)
}

if err := db.DB.Close(); err != nil {
    logging.GetLogger().Warnf("failed to close database connection: %s", err)
}

影响:

  • ✅ 资源泄漏风险降低
  • ✅ 生产环境可观测性提升
  • ✅ 符合 Go 最佳实践

6.4 并发安全 (Concurrency)

未发现并发问题。

Context 传播改进:

  • ExecContext 替代 Exec:支持查询取消
  • NewRequestWithContext 替代 NewRequest:支持 HTTP 请求超时

6.5 编程规范 (Coding Standards)

⭐ 全面符合 Go 编程规范

规范项 修复前 修复后 状态
错误检查 (errcheck) 忽略 Close 错误 记录所有错误
类型断言 (forcetypeassert) 强制断言 comma-ok 模式
Context 传播 (noctx) 无 context ExecContext/NewRequestWithContext
现代化语法 (intrange) for i := 0; i < 10; i++ for i := range 10

7. 审查总结与评分

7.1 维度评分

维度 得分 权重 说明
需求符合性 N/A 0% 工具链升级无外部需求
编程规范 10/10 30% 全面符合 Go 最佳实践
代码质量 10/10 30% 错误处理、类型安全全面改进
安全性 10/10 20% 修复类型断言 panic 风险
可维护性 9/10 20% 建议补充单元测试

加权综合得分: 9.5 / 10

7.2 最终结论

LGTM - 可立即合并 (Approve)

理由:

  1. 代码质量显著提升: 错误处理、类型安全、Context 传播全面改进
  2. 安全性提升: 消除了类型断言 panic 风险
  3. 配置升级合理: 新增 20+ 高价值 linters
  4. 覆盖全面: 数据库层、缓存层、工具层全面修复
  5. 无阻塞问题: 纯质量提升,无功能变更
  6. 测试通过: PR 描述已确认 make lint 通过

无需前置条件,建议立即合并。

合并后建议 (P2 问题):

  • P2-1: 补充 Close 错误处理的单元测试
  • P2-2: 考虑 Context 传播的长期优化
  • P2-3: 在文档中补充 golangci-lint 版本升级策略

8. 代码改进亮点

8.1 错误处理改进 (errcheck)

影响文件: pkg/database/mysql.go

场景 修复前 修复后 收益
测试连接关闭 conn.Close() if err := conn.Close(); err != nil { log.Warn(...) } 资源泄漏可观测
数据库关闭 db.DB.Close() if err := db.DB.Close(); err != nil { log.Warn(...) } 优雅关闭监控

8.2 类型安全改进 (forcetypeassert)

影响文件: 9 个 pkg/cacheimpls/*.go

// ❌ 修复前:类型断言 panic 风险
key := k.(GatewayNameKey)

// ✅ 修复后:安全检查
key, ok := k.(GatewayNameKey)
if !ok {
    return nil, errors.New("invalid key type, expected GatewayNameKey")
}

覆盖范围:

  • app_gateway_permission.go
  • app_resource_permission.go
  • gateway.go
  • jwt_public_key.go
  • release.go
  • release_history.go
  • resource_version_mapping.go
  • stage.go

8.3 Context 传播改进 (noctx)

影响文件: pkg/database/mysql.go, pkg/sentry/sentry.go, pkg/util/validation.go, pkg/util/testing.go

// ❌ 修复前:无法取消/超时
db.DB.Exec(`SET time_zone = "+00:00";`)
http.NewRequest(method, url, body)

// ✅ 修复后:支持取消和超时
db.DB.ExecContext(context.Background(), `SET time_zone = "+00:00";`)
http.NewRequestWithContext(ctx, method, url, body)

8.4 现代化语法 (intrange - Go 1.22+)

影响文件: pkg/database/dbmock.go

// ❌ 旧语法
for i := 0; i < 10; i++

// ✅ Go 1.22+ 语法
for i := range 10

附录:审查元数据

  • 工具版本: CodeReview Skill v1.0
  • 规则集: Go Coding Standards + Security Guidelines
  • 已加载标准文档:
    • /projects/.openclaw/skills/code-review/references/coding-standards/go/standard.md
    • /projects/.openclaw/skills/code-review/references/coding-standards/go/security.md
  • 语言统计:
    • Go: 17 files, 103 lines changed
    • YAML: 1 file, 117 lines changed (golangci.yaml)
    • Markdown: 1 file, 17 lines changed (AGENTS.md)
    • Dockerfile: 1 file, 2 lines changed
    • Makefile: 1 file, 33 lines changed
    • GitHub Actions: 1 file, 8 lines changed
    • go.mod: 1 file, 2 lines changed
  • 生成时间: 2026-03-23 20:46:00

A. golangci-lint 配置升级摘要

新增 Linters(高价值)

Linter 类别 价值 发现问题数
errcheck Bug Catcher ⭐⭐⭐⭐⭐ 2 处 Close 错误
noctx Best Practice ⭐⭐⭐⭐⭐ 4 处 context 缺失
forcetypeassert Safety ⭐⭐⭐⭐⭐ 9 处类型断言风险
gosec Security ⭐⭐⭐⭐☆ 1 处(已合理抑制)
sqlclosecheck Resource ⭐⭐⭐⭐☆ 0 处
bodyclose Resource ⭐⭐⭐⭐☆ 0 处
modernize Code Quality ⭐⭐⭐☆☆ 2 处语法升级

配置合理性

  • ✅ 禁用了过严格的规则(omitzero, stringsbuilder
  • ✅ 保留了 revive/gocritic 代码质量检查
  • ✅ 120 字符行长度限制合理

B. 参考资料

  • Go Best Practices: Error Handling & Resource Management
  • golangci-lint Documentation: https://golangci-lint.run/
  • Go 1.22+ Release Notes: Integer Range Loops

Reviewed by OpenClaw Code Review Skill
[from openclaw-internal]

@wklken wklken left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

变更概述:本次 PR 主要升级了 golangci-lint 从 v2.6 到 v2.11,Go 版本从 1.24.4 升级到 1.25.5,并按照新的 lint 规范修复了所有发现的问题。变更范围包括 CI 配置、lint 配置、构建设置以及业务代码的问题修复。

发现的问题

  1. router.go - 变量重影的清理时机

    • pkg/server/router.go:67 删除了 dbConfig := dbConfig 赋值,这是正确的。但需要确认该变量在不同 goroutine 中是否只读,因为删除后多个 goroutine 共享同一个 dbConfig 变量。从代码看 dbConfig 仅用于测试连接且无修改,应该安全,但建议确认或加注释说明。
  2. database/mysql.go - 关闭错误处理策略

    • pkg/database/mysql.go:82pkg/database/mysql.go:125Close() 返回错误记录为 WARN 级别。
    • 潜在问题:如果测试连接关闭失败,但后续 Connect() 仍然成功,会隐藏连接池中可能存在的资源泄漏问题。建议将这些日志级别改为 DebugInfo,避免掩盖真实问题。
  3. sentry.go - 错误包装一致性

  4. .golangci.yaml 安全规则排除范围较广

    • 排除了多个 gosec 规则(G104, G115, G304, G307, G401, G501, G505)。建议在 .golangci.yaml 中添加注释说明排除每个规则的原因,便于后续审查和维护。
  5. CI 配置变更说明不足

    • Lint 配置中移除了 new-from-merge-base: master,意味着 CI 会检查所有代码而不仅仅是增量变更。这是有意为之(注释说明了原因),但在 .golangci.yaml 中应该更明确地说明这一策略变更的影响。

优点

  1. 类型断言安全改进

    • 所有直接类型断言都已改为带 ok 检查的安全形式,这在 pkg/cacheimpls/ 多个文件中体现得很好,符合 Go 最佳实践。
  2. 错误处理改进

    • 使用 errors.Is() 替代直接比较(如 pkg/database/utils.go:46
    • 使用 errors.As() 替代类型断言(如 pkg/database/publish_event.go:111pkg/util/validation.go:74
    • 错误包装使用 %w(如 pkg/sentry/sentry.go),保持错误链完整性。
  3. CI/CD 配置现代化

    • GitHub Actions 使用最新版本(checkout@v6, setup-go@v6)
    • Go 版本升级到 1.25.5,跟上 Go 生态发展
  4. Lint 配置结构化

    • 按功能分类 linter(bug catchers, modernization, code quality, style, security),配置清晰易维护
  5. 工具链本地化

    • Makefile 引入 LOCALBIN 变量,将工具安装到项目本地目录,避免污染用户环境,这是很好的工程实践。
  6. 文档完善

    • AGENTS.md 添加了 Go 版本说明和开发流程指导,有利于新开发者快速上手

总结

这是一个高质量的代码改进 PR,升级了关键工具链并按新的 lint 规范修复了大量代码问题。代码修复整体正确且遵循 Go 最佳实践,特别是在错误处理和类型安全方面有明显改进。

建议合并,但建议合并前:

  1. 将数据库连接关闭错误的日志级别从 WARN 改为 Debug
  2. 在 .golangci.yaml 中为排除的 gosec 规则添加注释说明原因
  3. 考虑在 CI 描述或文档中说明 lint 检查策略变更(从增量检查变为全量检查)

总体而言,这是一个显著提升代码质量的改进,值得合并。


由 Claude 自动 review | 基于通用 review 规范
[from openclaw-internal]

@wklken
wklken merged commit b781968 into TencentBlueKing:master Mar 24, 2026
3 of 4 checks passed
@wklken
wklken deleted the ft_upgrade_golangci_lint branch May 13, 2026 06:57
Han-Ya-Jun pushed a commit to Han-Ya-Jun/blueking-apigateway that referenced this pull request May 18, 2026
…ntBlueKing#2572)

* chore(core-api): upgrade golangci-lint and fix all lint issues

- Upgrade golangci-lint config and Go version to 1.25.5
- Fix errcheck: handle Close() return errors in mysql.go
- Fix noctx: use ExecContext and NewRequestWithContext
- Fix forcetypeassert: use comma-ok pattern across all cacheimpls retrieve functions
- Fix gosec: suppress intentional math/rand use for cache TTL jitter
- Fix intrange: use Go 1.22+ integer range syntax in dbmock.go
- Update AGENTS.md: document Go version activation, post-change checklist, and PR target

* fix(dockerfile): update base image
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants