package builder import ( "os" "path/filepath" "strings" "testing" ) // **A Go bundle does not vary with the commit it was built at** (novox/hq ADR 0267 rule 6, issue 363). A // module built from its repository's root — the controller — is compiled with the clone's `.git` in what // the toolchain sees, and Go stamps the commit, its time and whether the tree was modified into every // binary built there unless told not to. Two builds of one program at commits that differ only in a // README then made two binaries, so an unchanged build source was a new digest. // // The toolchain's own compile line is run here, as the build seat runs it inside the toolchain image: in // two clones at two paths, of two commits that differ outside the program. One digest is wanted. // The toolchain says so itself, so a reader of the compile line sees it without running a build. func TestTheGoToolchainStampsNoVersionControl(t *testing.T) { chain, err := ToolchainFor("go") if err != nil { t.Fatal(err) } if joined := strings.Join(chain.Compile, " "); !strings.Contains(joined, "-buildvcs=false") { t.Fatalf("the go toolchain stamps the commit into what it compiles: %q", joined) } } // **And so does every recipe in this repository that compiles Go** (review of issue 363's fix): the // controller's genesis image copies the whole clone, `.git` with it, and the reference images beside it // are built the same way by the Makefile. func TestEveryGoRecipeInThisRepositoryStampsNoVersionControl(t *testing.T) { root := filepath.Join("..", "..") var recipes []string err := filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error { if err != nil { return err } if d.IsDir() && (d.Name() == "vendor" || d.Name() == "testdata" || d.Name() == ".git") { return filepath.SkipDir } if !d.IsDir() && d.Name() == "Dockerfile" { recipes = append(recipes, path) } return nil }) if err != nil { t.Fatal(err) } if len(recipes) == 0 { t.Fatal("no recipe found in this repository") } for _, path := range recipes { body, err := os.ReadFile(path) if err != nil { t.Fatal(err) } for _, line := range strings.Split(string(body), "\n") { if strings.Contains(line, "go build") && !strings.Contains(line, "-buildvcs=false") { t.Errorf("%s compiles Go and stamps the commit into it: %s", path, strings.TrimSpace(line)) } } } }