638 文字
3 分
Q. CircleCI上で特定のmoduleをインストールさせたらrequires go >= 1.22で落ちた
調査
次のようなログが出ていた。
go: downloading go1.22.2 (linux/amd64)go: download go1.22.2: golang.org/[email protected]: 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 ifGOSUMDB=off
.
Go Toolchains - The Go Programming Language
CircleCI の GOSUMDB のデフォルト値は off ではないが、前段の処理で go env -w GOSUBDB=off
が実行されていた。
回答
次の対応策を提案した。
- v1.22 を要求しないバージョンを利用する。しかし、そのバージョンには問題があるのでおすすめはしなかった。
- go.mod に含めておき、circle ci 上で引いてくるのをやめる。これなら toolchain が有効になるのでいける。そのままだと go mod tidy で消えるが、公式https://go.dev/wiki/Modules で書かれているように tools.go を配置すれば良い。
gosumdb を無効化する前に、そのモジュールのインストールを実行する。- これは解決しない。Toolchain を利用している状態で、GOSUMDB を off にした時点で go がエラーを吐くようになるため。
- サービスの Golang のバージョンを上げる
- (Best)GOSUMDB=off の代わりに、GOPRIVATE を利用する。
- GOSUMDB=off になっている理由を辿ると、Private repository を引くために利用していた。
- Golang v1.13 以前は GOPRIVATE がなかったため、GOSUMDB=off などを行う必要があった。その記述が残ってしまっていたと思われる。
go env -w GOSUMDB=off
をgo env -w GOPRIVATE=github.com/org_name
に置き換える。- Go は通常ソースに関係なくダウンロードしたモジュールを sum.golang.orgの公開 Go チェックサム データベースと照合して検証するが、これは非公開のリポジトリで上手く機能しない。GOPRIVATE は、どのモジュールをプライベートとみなすかを決定し、プロキシやチェックサムデータベースを使用しないかを制御する。
余談:tools.go
次のようにしておくことで、go mod tidy で消されなくなる。
package tools
import ( _ "github.com/golang/hoge/mock" _ "github.com/golang/hoge/codegen" _ "github.com/golang/hoge/test")
Q. CircleCI上で特定のmoduleをインストールさせたらrequires go >= 1.22で落ちた
https://blog.ohirunewani.com/posts/q-circleci-install-specific-module-requires-go-1-22/