Centralize Go validation and build environments

This commit is contained in:
2026-10-06 16:38:15 +00:00
parent 12e866a94a
commit 08093124af
15 changed files with 637 additions and 129 deletions

View File

@@ -131,6 +131,95 @@ func main() {
}
}
func TestBuildIgnoresAmbientAndPersistentArchitectureTuning(t *testing.T) {
repository := newBuildConsumer(t, `package main
import (
"fmt"
"os"
"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo"
)
func main() { if len(os.Args) == 2 && os.Args[1] == "version" { fmt.Printf("fixture %s\n", buildinfo.Version()) } }
`)
for _, source := range []string{"process environment", "Go environment file"} {
t.Run(source, func(t *testing.T) {
unsetBuildEnv(t, "GOAMD64")
unsetBuildEnv(t, "GOEXPERIMENT")
unsetBuildEnv(t, "GOFLAGS")
cache := filepath.Join(t.TempDir(), "configured-cache")
goEnv := filepath.Join(t.TempDir(), "go-env")
if source == "Go environment file" {
contents := fmt.Sprintf("GOAMD64=v2\nGOEXPERIMENT=loopvar\nGOFLAGS=-run=^$\nGOCACHE=%s\n", cache)
if err := os.WriteFile(goEnv, []byte(contents), 0o600); err != nil {
t.Fatal(err)
}
} else {
if err := os.WriteFile(goEnv, nil, 0o600); err != nil {
t.Fatal(err)
}
t.Setenv("GOAMD64", "v2")
t.Setenv("GOEXPERIMENT", "loopvar")
t.Setenv("GOFLAGS", "-run=^$")
}
t.Setenv("GOENV", goEnv)
result, err := releasekit.Build(context.Background(), releasekit.BuildRequest{
RepositoryDir: repository,
Version: "v2.3.4",
Spec: releasekit.BuildSpec{
MainPackage: "./cmd/app",
BinaryName: "fixture",
Targets: []releasekit.Target{{OS: "linux", Arch: "amd64"}},
},
OutputDir: filepath.Join(t.TempDir(), "artifacts"),
})
if err != nil {
t.Fatalf("Build() error = %v; partial result = %#v", err, result)
}
metadata := goBuildMetadata(t, result.Artifacts[0].Path)
if !strings.Contains(metadata, "GOAMD64=v1") || strings.Contains(metadata, "GOAMD64=v2") || strings.Contains(metadata, "GOEXPERIMENT=loopvar") {
t.Fatalf("build metadata includes ambient tuning:\n%s", metadata)
}
if source == "Go environment file" {
entries, err := os.ReadDir(cache)
if err != nil || len(entries) == 0 {
t.Fatalf("configured persistent cache was not used: entries=%d error=%v", len(entries), err)
}
}
})
}
}
func goBuildMetadata(t *testing.T, binary string) string {
t.Helper()
t.Setenv("GOENV", "off")
t.Setenv("GOFLAGS", "")
t.Setenv("GOEXPERIMENT", "")
t.Setenv("GOAMD64", "")
t.Setenv("GOOS", "")
t.Setenv("GOARCH", "")
output, err := exec.Command("go", "version", "-m", binary).CombinedOutput()
if err != nil {
t.Fatalf("go version -m: %v\n%s", err, output)
}
return string(output)
}
func unsetBuildEnv(t *testing.T, key string) {
t.Helper()
value, exists := os.LookupEnv(key)
if err := os.Unsetenv(key); err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
if exists {
_ = os.Setenv(key, value)
} else {
_ = os.Unsetenv(key)
}
})
}
func TestBuildWithNoTargetsDoesNotInvokeCompiler(t *testing.T) {
repository := newBuildConsumer(t, `package main
func main() {}