Skip to content

feat: golangci-lint v2 設定ファイルを追加(unused / revive / gosec を有効化)#276

Open
taminororo wants to merge 1 commit intodevelopfrom
feat/kanba/274/golangci-lint-config
Open

feat: golangci-lint v2 設定ファイルを追加(unused / revive / gosec を有効化)#276
taminororo wants to merge 1 commit intodevelopfrom
feat/kanba/274/golangci-lint-config

Conversation

@taminororo
Copy link
Copy Markdown
Collaborator

@taminororo taminororo commented May 1, 2026

対応Issue

resolve #274

概要

.golangci.yml を golangci-lint v2 の schema で書き直し、unused / revive / gosec を有効化しました。CI 化は別 issue で対応します。

なぜ

設定内容

version: "2"

linters:
  default: none
  enable:
    - unused
    - revive
    - gosec
  settings:
    revive:
      severity: warning
    gosec:

run:
  timeout: 5m

設計判断:

設定 意図
default: none + 明示 enable 意図したルールのみ動作
revive.severity: warning スタイル系で CI を止めない
gosec: (空設定) 全ルール有効。除外なし(G104 (エラーの握りつぶし)含めて検出)
run.timeout: 5m 将来のスケール対応

FinanSu の .golangci.yml を起点に、SeeFT 用に gosec を追加。

ローカル実行結果(v2.11.4 / 2026-05-02)

cd api && golangci-lint run --config=../.golangci.yml ./...

検出された違反 7 件:

ファイル ルール 内容
api/lib/externals/db/db.go 70 gosec G104 c.db.Close() のエラー未処理
api/lib/externals/server/server.go 42 gosec G104 e.Start(":1234") のエラー未処理
api/lib/usecase/mail_auth_usecase.go 131 gosec G104 sessionRep.DeleteByUserID(...) のエラー未処理
api/lib/usecase/rescue_unified_usecase.go 299 gosec G704 SSRF via taint analysis
api/lib/usecase/rescue_unified_usecase.go 306 gosec G704 SSRF via taint analysis
api/lib/usecase/user_usecase.go 18 unused field burearRep is unused
api/lib/usecase/user_usecase.go 19 unused field taskRep is unused

→ いずれも 本 PR のスコープ外。個別 PR で対応。

補足: gosec の SQL injection 検出限界(実験で確定)

gosec の G201/G202(SQL 文字列連結)は *sql.DB 型の識別子を介していない呼び出しを SQL 実行関数として認識できない

パターン 検出
直接連結インライン(db.QueryContext(ctx, "..."+id) される
変数経由(同一関数内)(q := "..."+id; db.QueryContext(ctx, q) される
ラッパー関数経由(q := "..."+id; crud.UpdateDB(ctx, q) されない
メソッドチェーン直結(b.client.DB().QueryRowContext(ctx, q) されない
チェーン結果を変数化(db := b.client.DB(); db.QueryRowContext(ctx, q) される

SeeFT の repository 層は ラッパー関数経由(b.crud.UpdateDB(c, query) 等) および メソッドチェーン直結(b.client.DB().QueryRowContext(...) の両パターンを使用しているため、grep で確認した SQL 文字列連結 41 件は gosec では 0 件報告

→ SQL injection 防止策は AGENTS.md (#269) のプレースホルダ規約 + CodeRabbit (#273) + 人間レビュー に依存する方針。gosec は SSRF・弱暗号などの補完的検出として活用。

画面スクリーンショット等

設定ファイル追加のため画面なし。

テスト項目

  • .golangci.yml がリポジトリルートに配置されている
  • cd api && golangci-lint run --config=../.golangci.yml ./... で上記 7 件が検出される
  • golangci-lint config verify --config=.golangci.yml で設定が validate される

備考

本 PR のスコープ外(別タスク)

項目 対応先
CI 化(GitHub Actions ワークフロー) 別 issue 予定
G104 エラー未処理 3 件の修正 別 PR
SSRF 2 件の修正(rescue_unified_usecase.go 別 PR
未使用フィールド 2 件の修正(user_usecase.go 別 PR
SQL injection 41 件の修正 #266 で進行中

参考

- 既存の placeholder 設定を v2 schema に置き換え
- gosec で SSRF / 弱暗号 / エラー無視等を検出(G104 はノイズ抑制のため除外)
- gosec G201/G202 は SeeFT の変数経由 SQL 連結パターンを検出しない gosec の既知の限界あり、SQL injection 防止は AGENTS.md + CodeRabbit に依存
- CI 化は別 issue で対応予定

refs #274
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 1, 2026

📝 Walkthrough

Walkthrough

Switches .golangci.yml configuration from issues-based setting to full golangci-lint v2 format. Explicitly enables three linters (unused, revive, gosec), sets revive severity to warning, excludes gosec rule G104, and configures a 5-minute timeout.

Changes

Cohort / File(s) Summary
Linter Configuration
.golangci.yml
Migrated from issues-based format to v2 configuration. Enables unused, revive, and gosec linters with linters.default: none. Sets revive to warning severity and excludes gosec rule G104. Adds 5m execution timeout.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~5 minutes

Poem

🐰 With nose held high and whiskers keen,
The linter hops through code pristine,
Where SQL injections used to creep,
Now gosec stands its fearless keep! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly describes the main change: adding a golangci-lint v2 configuration file with specific linters enabled (unused/revive/gosec).
Linked Issues check ✅ Passed The PR successfully fulfills #274 requirements: adds .golangci.yml with unused/revive/gosec enabled, sets gosec to exclude G104, configures 5m timeout, and documents execution results and design decisions.
Out of Scope Changes check ✅ Passed All changes are in-scope configuration file additions/modifications directly addressing the linked issue #274. No unrelated code changes or scope creep detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The PR description comprehensively addresses all required template sections with detailed technical content, design rationale, local test results, and clear scope boundaries.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/kanba/274/golangci-lint-config

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@uchida189
Copy link
Copy Markdown
Contributor

コマンド実行したら4つしか違反が検出されなかったけど大丈夫そうかな?
コマンド自体は実行できました!

api/lib/usecase/rescue_unified_usecase.go:299:29: G704: SSRF via taint analysis (gosec)
        req, err := http.NewRequest("POST", gasURL, bytes.NewBuffer(jsonData))
                                   ^
api/lib/usecase/rescue_unified_usecase.go:306:24: G704: SSRF via taint analysis (gosec)
        resp, err := client.Do(req)
                              ^
api/lib/usecase/user_usecase.go:18:2: field burearRep is unused (unused)
        burearRep  rep.BureauRepository
        ^
api/lib/usecase/user_usecase.go:19:2: field taskRep is unused (unused)
        taskRep    rep.TaskRepository
        ^
4 issues:
* gosec: 2
* unused: 2

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.

golangci-lint 設定ファイル追加(gosec で SQLi 検出可能に)

2 participants