O hirunewani blog

Q. CircleCI上で特定のmoduleをインストールさせたらrequires go >= 1.22で落ちた

Created at

CircleCI上で特定のmoduleをインストールさせたらrequires go >= 1.22で落ちたと質問を受けた際の対応についてまとめた。

調査

次のようなログが出ていた。

go: github.com/.../...@v0.4.0 requires go >= 1.22; switching to go1.22.2
go: downloading go1.22.2 (linux/amd64)
go: download go1.22.2: golang.org/toolchain@v0.0.1-go1.22.2.linux-amd64: verifying module: checksum database disabled by GOSUMDB=off

依存しているモジュールがGo v1.22を要求しているが、サービスの利用しているgolangのバージョンがv1.21であるため、Go v1.21で追加されたtoolchain機能を利用して解決しようとしている。しかしGOSUMDB=offであるため、ツールチェーンのダウンロードが検証不足で失敗していることが分かる。

GOSUMDB=offの場合、ツールチェインを利用しようとするとエラーが出るのは仕様。

Because the specific toolchain used depends on the system’s own default toolchain as well as the local operating system and architecture (GOOS and GOARCH), it is not practical to write toolchain module checksums to go.sum. Instead, toolchain downloads fail for lack of verification if GOSUMDB=off.

Go Toolchains - The Go Programming Language

CircleCIのGOSUMDBのデフォルト値はoffではないが、前段の処理で go env -w GOSUBDB=off が実行されていた。

回答

次の対応策を提案した。

  1. v1.22を要求しないバージョンを利用する。しかし、そのバージョンには問題があるのでおすすめはしなかった。
  2. go.modに含めておき、circle ci上で引いてくるのをやめる。これならtoolchainが有効になるのでいける。そのままだとgo mod tidyで消えるが、公式https://go.dev/wiki/Modules で書かれているようにtools.goを配置すれば良い。
  3. gosumdbを無効化する前に、そのモジュールのインストールを実行する。
    1. これは解決しない。Toolchainを利用している状態で、GOSUMDBをoffにした時点でgoがエラーを吐くようになるため。
  4. サービスのGolangのバージョンを上げる
  5. (Best)GOSUMDB=offの代わりに、GOPRIVATEを利用する。
    1. GOSUMDB=offになっている理由を辿ると、Private repositoryを引くために利用していた。
    2. Golang v1.13以前はGOPRIVATEがなかったため、GOSUMDB=offなどを行う必要があった。その記述が残ってしまっていたと思われる。
    3. go env -w GOSUMDB=offgo env -w GOPRIVATE=github.com/org_nameに置き換える。
    4. Goは通常ソースに関係なくダウンロードしたモジュールを sum.golang.orgの公開Goチェックサム データベースと照合して検証するが、これは非公開のリポジトリで上手く機能しない。GOPRIVATEは、どのモジュールをプライベートとみなすかを決定し、プロキシやチェックサムデータベースを使用しないかを制御する。

余談:tools.go

https://go.dev/wiki/Modules

次のようにしておくことで、go mod tidyで消されなくなる。


package tools

import (
	_ "github.com/golang/hoge/mock"
	_ "github.com/golang/hoge/codegen"
	_ "github.com/golang/hoge/test"
)