From 0815ecbd83970a5685faf1983ed38a9db1498784 Mon Sep 17 00:00:00 2001 From: Matthew Hughes Date: Thu, 8 Feb 2024 08:53:00 +0000 Subject: [PATCH] Avoid Toolchain download before cache download `go version` is run before downloading the cache, but if this is run with a version of `go` that triggers a Toolchain download[1], e.g. if the installed Go is 1.20.0 but `go.mod` has a toolchain directive `go1.20.1` then a toolchain is downloaded to e.g. `$GOMODCACHE/golang.org/toolchain@v0.0.1-go1.21.1.linux-amd64`, if this file already exists in the cache (e.g. this is the second run of this action we not cache invalidation) then the cache download will try and overwrite these files resulting in noisy errors like: /usr/bin/tar: ../../../go/pkg/mod/golang.org/toolchain@v0.0.1-go1.21.6.linux-amd64/lib/time/mkzip.go: Cannot open: File exists Instead, force `go` to use the local toolchain (i.e. the one the one that shipped with the go command being run) via setting the `GOTOOLCHAIN` environment variable[1]: > When GOTOOLCHAIN is set to local, the go command always runs the bundled Go toolchain. This addresses https://github.com/actions/setup-go/issues/424 [1] https://go.dev/doc/toolchain#select --- src/main.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index d3fb857df..ddd606038 100644 --- a/src/main.ts +++ b/src/main.ts @@ -62,7 +62,10 @@ export async function run() { core.debug(`add bin ${added}`); const goPath = await io.which('go'); - const goVersion = (cp.execSync(`${goPath} version`) || '').toString(); + // run `go version` with the bundled Go toolchain to avoid potentially + // downloading one into the cache + const goVersion = (cp.execSync(`${goPath} version`) || '', + {env: {...process.env, GOTOOLCHAIN: 'local'}}).toString(); if (cache && isCacheFeatureAvailable()) { const packageManager = 'default';