Bind delivered binaries to verified build source

This commit is contained in:
2026-10-06 00:51:56 +00:00
parent 1d6611601c
commit a1ee067b53
11 changed files with 154 additions and 15 deletions

View File

@@ -462,3 +462,54 @@ func buildGit(t *testing.T, directory string, args ...string) string {
}
return strings.TrimSpace(string(output))
}
func TestBuildSourceEligibilitySurvivesLaterCheckoutCleanup(t *testing.T) {
const source = `package main
import("fmt";"os";"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo")
func main(){ if len(os.Args)>1 && os.Args[1]=="version" {fmt.Println("fixture",buildinfo.Version())} }
`
for _, mode := range []string{"clean", "dirty before build", "changed during build"} {
t.Run(mode, func(t *testing.T) {
repository := newBuildConsumer(t, source)
writeBuildFixture(t, repository, "docs/releases/v1.2.3.md", "# Fixture v1.2.3\n")
buildGit(t, repository, "add", "--all")
buildGit(t, repository, "commit", "-m", "release note")
buildGit(t, repository, "tag", "v1.2.3")
mutate := func() { writeBuildFixture(t, repository, "cmd/app/main.go", source+"\n// local change\n") }
if mode == "dirty before build" {
mutate()
}
var writer *sourceChangeWriter
request := releasekit.BuildRequest{RepositoryDir: repository, Version: "v1.2.3", Spec: releasekit.BuildSpec{MainPackage: "./cmd/app", BinaryName: "fixture", Targets: []releasekit.Target{{OS: runtime.GOOS, Arch: runtime.GOARCH}}}, OutputDir: t.TempDir()}
if mode == "changed during build" {
writer = &sourceChangeWriter{change: mutate}
request.Output = writer
}
result, err := releasekit.Build(context.Background(), request)
if err != nil {
t.Fatal(err)
}
if result.SourceVerified != (mode == "clean") {
t.Fatalf("source eligibility=%t for %s", result.SourceVerified, mode)
}
if mode == "clean" {
return
}
buildGit(t, repository, "restore", "cmd/app/main.go")
delivered, err := releasekit.Deliver(context.Background(), releasekit.DeliveryRequest{RepositoryDir: repository, Product: "Fixture", Version: "v1.2.3", Build: &result})
if err == nil || !strings.Contains(err.Error(), "build source") || delivered.State != releasekit.DeliveryNotAttempted {
t.Fatalf("dirty source delivered: %#v %v", delivered, err)
}
})
}
}
type sourceChangeWriter struct{ change func() }
func (w *sourceChangeWriter) Write(p []byte) (int, error) {
if w.change != nil {
w.change()
w.change = nil
}
return len(p), nil
}