577 文字
3 分

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

2025-03-12

エラーの発生#

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 を入れなおせば解決する。 その他の非推奨な方法でインストールしている場合は、入れ直しても更新できない可能性がある。

Terminal window
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)
Go 1.24でgolangci-lintがエラーを吐くようになった
https://blog.ohirunewani.com/posts/go-124-golangci-lint-error/
作者
hrdtbs
公開日
2025-03-12
ライセンス
CC BY-NC-SA 4.0