Go 1.24でgolangci-lintがエラーを吐くようになった
エラーの発生
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)