Regenerate local artifacts and invalidate stale receipts

This commit is contained in:
2026-10-06 00:56:44 +00:00
parent b744346210
commit b4d348dd1f
9 changed files with 90 additions and 40 deletions

View File

@@ -266,3 +266,15 @@ func validSHA256(value string) bool {
}
return true
}
// RemoveBuildReceipt invalidates prior CLI coordination data after a rebuild.
func RemoveBuildReceipt(outputDir string) error {
err := os.Remove(filepath.Join(outputDir, BuildReceiptName))
if errors.Is(err, os.ErrNotExist) {
return nil
}
if err != nil {
return fmt.Errorf("invalidate prior build receipt: %w", err)
}
return nil
}

View File

@@ -100,6 +100,12 @@ func run(ctx context.Context, args []string, stdout, stderr io.Writer) int {
OutputDir: invocation.OutputDir,
Output: stderr,
})
if result.OutputDir != "" && len(result.Targets) != 0 {
if receiptErr := cli.RemoveBuildReceipt(result.OutputDir); receiptErr != nil {
fmt.Fprintf(stderr, "%v\n", receiptErr)
return 1
}
}
if err != nil {
fmt.Fprintf(stderr, "build failed at %s: %v\n", result.CandidateCommit, err)
for _, artifact := range result.Artifacts {

View File

@@ -737,3 +737,28 @@ func TestUnreadableAssetsDoNotClaimAnUnknownWrite(t *testing.T) {
})
}
}
func TestFailedRebuildInvalidatesPreviousReceipt(t *testing.T) {
const source = `package main
import("fmt";"gitea.maximumdirect.net/eric/ReleaseKit/buildinfo")
func main(){fmt.Println("fixture",buildinfo.Version())}
`
repository := newCLIBuildRepository(t, source)
var stdout, stderr bytes.Buffer
args := []string{"build", "--repo", repository, "v1.2.3"}
for attempt := 0; attempt < 2; attempt++ {
if status := run(context.Background(), args, &stdout, &stderr); status != 0 {
t.Fatalf("build %d: status=%d %s", attempt, status, stderr.String())
}
}
path := filepath.Join(repository, "cmd/app/main.go")
if err := os.WriteFile(path, []byte("package main\nfunc main(){}\n"), 0600); err != nil {
t.Fatal(err)
}
if status := run(context.Background(), args, &stdout, &stderr); status != 1 {
t.Fatalf("failed rebuild status=%d", status)
}
if _, err := os.Stat(filepath.Join(repository, "dist", cli.BuildReceiptName)); !os.IsNotExist(err) {
t.Fatalf("stale receipt remains: %v", err)
}
}