Centralize Go validation and build environments
This commit is contained in:
@@ -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() {}
|
||||
|
||||
Reference in New Issue
Block a user