66 lines
2.3 KiB
Go
66 lines
2.3 KiB
Go
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))
|
|
}
|
|
}
|
|
}
|
|
}
|