ef1bb5ac16
cibuild.On() returns true for any CI environment that sets CI=true, including Alpine Linux's package build CI. TestTsgoRevInCacheKey was guarded by cibuild.On() (or use of tsgo), so it ran under Alpine's CI with stock Go, where go.toolchain.rev isn't blended into build cache keys, and unsurprisingly failed. Add cibuild.OnTailscaleCI, which keys off GITHUB_REPOSITORY_OWNER to distinguish tailscale/tailscale's own GitHub Actions CI from arbitrary downstream CI, and use it in TestTsgoRevInCacheKey. Fixes #19754 Change-Id: Id31cfe71903a235f1460dca1e2fdf334e3ba1ee5 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
// Copyright (c) Tailscale Inc & contributors
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package tailscaleroot
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
|
|
"tailscale.com/util/cibuild"
|
|
)
|
|
|
|
// TestTsgoRevInCacheKey verifies that the Tailscale Go toolchain's git
|
|
// revision (from go.toolchain.rev) is blended into Go build cache keys.
|
|
// Without this, bumping the toolchain to a new commit that doesn't change
|
|
// the Go version number would silently reuse stale cached build artifacts.
|
|
//
|
|
// See https://github.com/tailscale/tailscale/issues/36589.
|
|
func TestTsgoRevInCacheKey(t *testing.T) {
|
|
goRoot := goEnv(t, "GOROOT")
|
|
isTsgo := strings.Contains(goRoot, "/.cache/tsgo/")
|
|
if !cibuild.OnTailscaleCI() && !isTsgo {
|
|
t.Skip("skipping; not in Tailscale CI and not using the Tailscale Go toolchain")
|
|
}
|
|
|
|
rev := strings.TrimSpace(GoToolchainRev)
|
|
if rev == "" {
|
|
t.Fatal("go.toolchain.rev is empty")
|
|
}
|
|
|
|
// Build the small stdlib "errors" package with GODEBUG=gocachehash=1,
|
|
// which causes cmd/go to log its cache key computations to stderr.
|
|
cmd := exec.Command("go", "build", "errors")
|
|
cmd.Env = append(os.Environ(), "GODEBUG=gocachehash=1")
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
t.Fatalf("go build errors failed: %v\n%s", err, out)
|
|
}
|
|
|
|
// The cache key output should contain the toolchain rev alongside the
|
|
// Go version, e.g.:
|
|
// HASH[moduleIndex]: "go1.26.2 dfe2a5fd8ee2e68b08ce5ff259269f50ecadf2f4"
|
|
if !strings.Contains(string(out), rev) {
|
|
t.Errorf("go.toolchain.rev %q not found in GODEBUG=gocachehash=1 output:\n%s", rev, out)
|
|
}
|
|
}
|
|
|
|
func goEnv(t *testing.T, key string) string {
|
|
t.Helper()
|
|
out, err := exec.Command("go", "env", key).Output()
|
|
if err != nil {
|
|
t.Fatalf("go env %s: %v", key, err)
|
|
}
|
|
return strings.TrimSpace(string(out))
|
|
}
|