2026年11月18日に GitHub Actions のランナーのイメージから Go 1.24 が消える:既定の go は 1.26 になり、golangci-lint v1.64.8 はメモリを使い切る
ランナーのイメージの担当者が runner-images #15253 で告知しました。早くても2026年11月18日から、ツールキャッシュの Go 1.24 が外れて Go 1.27 が入り、Ubuntu 22.04・Ubuntu 24.04・すべての Windows のイメージで PATH の go が 1.24 から 1.26 に変わります。始まりは数日ずれることがあり、始まってからすべてのリージョンに届くまで2〜3日かかります。Ubuntu 26.04 の既定はもう Go 1.26 で、macOS のイメージには既定の Go が無いので、変わるのはツールキャッシュだけです。Azure Pipelines の Microsoft ホストのエージェントも同じイメージです。
変わるジョブ
ubuntu-22.04・ubuntu-24.04・Windows のランナーで、actions/setup-goを使わずにgoを動かすジョブは、1.24 でなく Go 1.26 でビルドとテストをします。actions/setup-goはあってもgo-versionもgo-version-fileも無いジョブも同じです。setup-go は「go-version input was not specified. The action will try to use pre-installed version.」(go-version が指定されていないので、入っている版を使う)と出し、PATHの go を使います。- 1.24 を頼むジョブ(
go-version: '1.24'、go-version-fileで読むgo.modがgo 1.24.x、Azure Pipelines の GoTool@0 のタスク)は 1.24 のままですが、ツールキャッシュからでなく実行のたびにダウンロードします。セットアップのステップが遅くなり、ネットワークが要ります。 GOROOT_1_24_X64・GOROOT_1_24_ARM64・GOROOT_1_24_AARCH64を読むステップは、その変数が見つからなくなります。- Go 1.25・1.26・1.27 をもう決めているジョブは変わりません。
いまジョブが何を使っているかは、ステップで出せば分かります:
- run: |
which go
go version
go env GOROOT GOTOOLCHAIN
golangci-lint v1.64.8 とランナーの停止
いちばん強く落ちるのは lint のジョブです。golangci-lint v1.64.8 は Go 1.24.1 で作られていて、PATH に Go 1.26 がある状態で動かすとメモリが際限なく増えます。担当者は既定がもう 1.26 の Ubuntu 26.04 で再現しました(runner-images #15179):Go 1.26 では約70秒で15 GB に達して3 GB のスワップも埋まり、ランナーが失われました。Go 1.24 なら最大2.5 GB・約4分で通りました。ジョブは「The runner has received a shutdown signal」で終わり、メモリ不足のメッセージも golangci-lint の終了コードも残りません。11月18日からは、イメージにある go のまま golangci-lint v1.64.8 を動かす lint のジョブで、Ubuntu 22.04・Ubuntu 24.04・Windows でも同じことが起きます。
golangci-lint がどの Go で作られたかは golangci-lint version で分かります。行に「built with go1.24.1」のように出ます。
- golangci-lint v2 に上げる。同じリポジトリ・Go 1.26 で、v2.15.0 は最大3 GB・3分かからずに終わりました。設定ファイルは v1 と v2 で形が変わり、
golangci-lint migrateで変換できます。golangci-lint-action は v7 から v2 しか動かしません:- uses: actions/setup-go@v6 with: go-version-file: go.mod - uses: golangci/golangci-lint-action@v9 with: version: v2.15.0 - lint のジョブの Go を 1.24 に決める(
go-version: '1.24')のは、担当者が出したその場しのぎです。11月18日からはその Go を毎回ダウンロードすることになり、Go のチームはもう 1.24 を保守していないので、v2 への移行を予定に入れます。
go.mod が 1.24 のままでも Go 1.25 と 1.26 で変わること
Go の振る舞いの変化の多くは、ツールチェーンでなく go.mod の go の行で決まります。go.mod が go 1.24 のモジュールを Go 1.26 がビルドすると、GODEBUG の既定は 1.24 に合わせて戻されます(Go の GODEBUG の説明)。そのため次の変化は、行を上げるまで 1.24 の振る舞いのままです:
net/url.Parseが、http://localhost:80:80/のように余計なコロンのあるホストを受け付けなくなる(1.26・urlstrictcolons)。- crypto の関数が、渡した乱数のリーダーを無視する。決まった鍵を前提にしたテストが落ちます(1.26・
cryptocustomrand)。 - コンテナーの中で GOMAXPROCS が cgroup の CPU の上限に従う(1.25・
containermaxprocsとupdatemaxprocs)。 - TLS 1.2 のハンドシェイクで SHA-1 の署名を断る(1.25・
tlssha1)。
ほかの変化は、go.mod が何であれ、ツールチェーンが 1.26 になった時点で効きます(Go 1.25 のリリースノート・Go 1.26 のリリースノート):
- Go 1.21〜1.24 のコンパイラーには、nil ポインターの確認を遅らせることがある不具合がありました。失敗した
os.Openの結果でf.Name()を呼ぶように、エラーを確かめる前に結果を使うコードは、これまで動いていたのが nil ポインターの参照で panic するようになります。1.24 で通っていたテストがこれで落ちることがあり、直し方は先にエラーを確かめることです。 go vetに新しいアナライザーが2つ入りました。waitgroupは間違った位置でのsync.WaitGroup.Addを、hostportはnet.Dialに渡すfmt.Sprintf("%s:%d", host, port)(IPv6 では動かない・net.JoinHostPortを使う)を出します。go vet ./...のステップが新しい指摘を出すことがあります。go tool docは無くなりました。go docが同じフラグと引数を受け付けます。go fixは作り直され、古い修正の機能は外されました。- バイナリのデバッグ情報が DWARF 5 になります。それを読むツールが落ちるなら、当面は
GOEXPERIMENT=nodwarf5でビルドします。 - Green Tea のガベージコレクターが既定になります。メモリの使い方やベンチマークの数字が変わって古いコレクターが要るときは
GOEXPERIMENT=nogreenteagcでビルドします。リリースノートでは、この設定は 1.27 で無くなる見込みです。 testing.AllocsPerRunは、並列のテストが動いていると panic します。
直し方
- 使う Go を書く。
go-version-file: go.modなら、setup-go v6 以降はtoolchainの行があればそれを、無ければgoの行を使います。setup-go はGOTOOLCHAIN=localも設定するので、go コマンドはちょうどその版を使い、別の版に切り替えません。 - イメージが変わる前に Go 1.26 で試す:ジョブを1回
go-version: '1.26'で動かすか、既定がもう 1.26 のruns-on: ubuntu-26.04で動かします。 GOROOT_1_24_X64などの 1.24 の変数は、setup-go のあとのgo env GOROOTに置き換えます。go.modがまだgo 1.24なら、1.24 に決めておけば当面はビルドできますが、毎回のダウンロードと保守の終わった Go です。行を 1.25 か 1.26 に上げると上の GODEBUG の変化も効き始めるので、上げたらテストを流します。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べるので、ランナーの停止で終わった lint のジョブがすぐ分かり、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標、Go は Google LLC の商標、Ubuntu は Canonical Ltd. の商標、Windows と Azure は Microsoft Corporation の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:The runner has received a shutdown signal · ubuntu-latest と Ubuntu 26.04 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English