O hirunewani blog

Go 1.24でgolangci-lintがエラーを吐くようになった

Created at

Go 1.24でgolangci-lintを扱うには、Go 1.24でビルドされたgolangci-lint 1.64以上である必要がある

エラーの発生

Renovateが作成したパッケージを更新するPRを見ると、golangci-lintでエラーが出てCIが落ちていた。

何らかの破壊的な変更が入ったのかと思ってエラーを見ると、次のようにGoが推奨する通りメジャーバージョン毎にモジュールパスを更新しているパッケージを利用している箇所、全てでtypecheckエラーが発生していた。

import "github.com/oklog/ulid/v2"

//  Error:  undefined: ulid (typecheck)
_, err := ulid.Parse(string(i))

原因の推測

問題の発生したPRを見ると、パッケージの更新に合わせてGo自体のバージョンがGo 1.24に上げられていた。

Go 1.21でも古いgolangci-lintがtoolchainを理解できずにエラーを吐く問題があったことから、golangci-lintとGoのバージョンの組み合わせによる問題を疑った。

実際、Github Actionsで実行されるgolangci-lintのバージョンはlatestなどを指定せず、以前に発生したGoのバージョンとの組み合わせによる問題から古いバージョンで固定されていた。

- name: golangci-lint
  uses: golangci/golangci-lint-action@v6
  with:
     version: v1.57.2

調査

Golangci-lintのリポジトリで検索すると、いくつか同様の問題を報告しているissueが確認できた。

リリースノートを見ていくと、v1.64.2でgo 1.24をサポートしたという記述を見つけた。

https://github.com/golangci/golangci-lint/releases/tag/v1.64.2

解決

利用するgolangci-lintのバージョンを上げることでエラーは解消した。

- name: golangci-lint
  uses: golangci/golangci-lint-action@v6
  with:
     version: v1.64.2

余談1:ローカルでのgolangci-lintをビルドしたGoバージョンの更新

Github Actionsなどで実行する場合は気にする機会がほぼないが、ローカルではgolangci-lintをビルドしたGoのバージョンを気にする必要がある。

バイナリでインストールしている場合は、次のようにgolangci-lintを入れなおせば解決する。 その他の非推奨な方法でインストールしている場合は、入れ直しても更新できない可能性がある。

curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.64.7

ビルドしたGoのバージョンと、実行環境のGoのバージョンの乖離がある場合、次のようなエラーが出力される。

Error: can't load config: the Go language version (go1.23) used to build golangci-lint is lower than the targeted Go version (1.24.1)
Failed executing command with error: can't load config: the Go language version (go1.23) used to build golangci-lint is lower than the targeted Go version (1.24.1)