Build a change once: the check builds what its merge moves, the walk takes it by key
mesh/merge-gate out of date: judged against trunk bff5b7f0e4f8, the trunk is now 372faebf2824; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk bff5b7f0e4f8, the trunk is now 372faebf2824; judged again on a recheck or when it is merged
mesh/delivery-group group feat/350-one-build-per-change checking: composed check out of date: novox/mesh-controller@cd49b50c4075 was judged against trunk bff5b…
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate out of date: judged against trunk bff5b7f0e4f8, the trunk is now 372faebf2824; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk bff5b7f0e4f8, the trunk is now 372faebf2824; judged again on a recheck or when it is merged
mesh/delivery-group group feat/350-one-build-per-change checking: composed check out of date: novox/mesh-controller@cd49b50c4075 was judged against trunk bff5b…
mesh/delivery superseded: a newer head of the same pull request
A merge built every moved module a second time although its check had judged the same tree (issue 649). The check now builds into the scratch namespace under a reuse key (source fingerprint plus the builder's own digest), and the walk of the trunk commit copies a build of the same key by digest instead of building, saying per module why when it cannot (novox/hq ADR 0350).
This commit is contained in:
@@ -92,6 +92,24 @@ type BuildRequest struct {
|
||||
// facts snapshot, raises the throwaway stores the check needs, runs the repository's own
|
||||
// merge-check.sh and answers its verdict. Nothing is built, published or registered.
|
||||
Check *CheckRequest `json:"check,omitempty"`
|
||||
// Reuse makes this ask a walk's build of a trunk commit (novox/hq ADR 0350 §2): the builder takes the reuse key
|
||||
// of the commit's tree and, where a check build holds the same key, copies it by digest into the module's
|
||||
// namespace instead of building. Pulls are the pull requests the walk answers, whose checks name the part of a
|
||||
// differing key. Nil for every other ask — a check, a dry run, `build --ref`, `rebuild`, `replay` — which never
|
||||
// takes a check's build. A builder from before it ignores it and builds.
|
||||
Reuse *ReuseAsk `json:"reuse,omitempty"`
|
||||
}
|
||||
|
||||
// ReuseAsk is a walk's leave to take a check's build (novox/hq ADR 0350 §2).
|
||||
type ReuseAsk struct {
|
||||
Pulls []PullRef `json:"pulls,omitempty"`
|
||||
}
|
||||
|
||||
// PullRef names a pull request.
|
||||
type PullRef struct {
|
||||
Owner string `json:"owner"`
|
||||
Repo string `json:"repo"`
|
||||
Number int `json:"number"`
|
||||
}
|
||||
|
||||
// CheckRequest is what a merge check needs beyond the repository and its head.
|
||||
@@ -128,6 +146,34 @@ type CheckRequest struct {
|
||||
// repository's own check is not run for a group: each member's pull request runs its own.
|
||||
Group string `json:"group,omitempty"`
|
||||
Members []GroupMember `json:"members,omitempty"`
|
||||
// Builds are the modules the delivery plan moves, in the walk's order (novox/hq ADR 0350 §1): the check builds
|
||||
// each, from the merge it judged, into the scratch namespace once it has judged and not failed, for the walk to
|
||||
// take. A build seat from before it builds nothing, and the walk builds as before.
|
||||
Builds []CheckBuild `json:"builds,omitempty"`
|
||||
}
|
||||
|
||||
// CheckBuild is one module a check builds for its merge: from the merge it made when Merged — a module built from
|
||||
// the repository checked, at the branch merged into — else from Repository at Ref, as the walk would.
|
||||
type CheckBuild struct {
|
||||
Module string `json:"module"`
|
||||
Repository string `json:"repository,omitempty"`
|
||||
Path string `json:"path,omitempty"`
|
||||
Ref string `json:"ref,omitempty"`
|
||||
Merged bool `json:"merged,omitempty"`
|
||||
Tier int `json:"tier"`
|
||||
// Skip says why the check cannot build it as the walk would — a module that reads the repository checked
|
||||
// through a context, which a check cannot hand the merge — and nothing after it is built either.
|
||||
Skip string `json:"skip,omitempty"`
|
||||
}
|
||||
|
||||
// CheckBuilt is one build a check made for its merge, as its verdict lists it (novox/hq ADR 0350 §1): the reuse key
|
||||
// and the artifacts, in the scratch namespace — or why it was not built.
|
||||
type CheckBuilt struct {
|
||||
Module string `json:"module"`
|
||||
Key string `json:"key,omitempty"`
|
||||
Made []MadeArtifact `json:"made,omitempty"`
|
||||
NotBuilt string `json:"not-built,omitempty"`
|
||||
Took string `json:"took,omitempty"`
|
||||
}
|
||||
|
||||
// GroupMember is one other head of a delivery group's composed check.
|
||||
@@ -175,6 +221,8 @@ type CheckOutcome struct {
|
||||
Trunk string `json:"trunk,omitempty"`
|
||||
Beside map[string]string `json:"beside,omitempty"`
|
||||
Members []CheckedMember `json:"members,omitempty"`
|
||||
// Built are the builds it made for its merge (novox/hq ADR 0350 §1).
|
||||
Built []CheckBuilt `json:"built,omitempty"`
|
||||
}
|
||||
|
||||
// SourceOnSeat names a repository by the seat whose holder serves it and its path there.
|
||||
@@ -264,6 +312,14 @@ type BuildResult struct {
|
||||
// Failed is why, when it did.
|
||||
Failed string `json:"failed,omitempty"`
|
||||
|
||||
// ReuseKey is the build's reuse key (novox/hq ADR 0350 §1). Reused, on a walk's build that took a check's build
|
||||
// instead of building, is "reused from <check build>" with its digests, and ReusedFrom which; BuiltWhy, on one
|
||||
// that built, why it took none (§3, §4). Both empty from a builder that predates it.
|
||||
ReuseKey string `json:"reuse-key,omitempty"`
|
||||
Reused string `json:"reused,omitempty"`
|
||||
ReusedFrom *ReusedFrom `json:"reused-from,omitempty"`
|
||||
BuiltWhy string `json:"built-why,omitempty"`
|
||||
|
||||
// Source is the request's, echoed: the seat form of the repository, for whoever registers.
|
||||
Source *SourceOnSeat `json:"source,omitempty"`
|
||||
|
||||
@@ -300,3 +356,25 @@ type MadeArtifact struct {
|
||||
Kind string `json:"kind"`
|
||||
Reference string `json:"reference"`
|
||||
}
|
||||
|
||||
// ReusedFrom is the check build a walk's build took (novox/hq ADR 0350 §4): its pull request, the head and the trunk
|
||||
// commit the check merged it into, the check's ask, and its key.
|
||||
type ReusedFrom struct {
|
||||
Pull PullRef `json:"pull"`
|
||||
Head string `json:"head,omitempty"`
|
||||
Trunk string `json:"trunk,omitempty"`
|
||||
Check string `json:"check,omitempty"`
|
||||
Key string `json:"key"`
|
||||
}
|
||||
|
||||
// MadeWords is what a walk says a module's build did (novox/hq ADR 0350 §4): "reused from <check build>", or "built:
|
||||
// <why>". A build seat from before it says neither, and that is said.
|
||||
func (r BuildResult) MadeWords() string {
|
||||
switch {
|
||||
case r.Reused != "":
|
||||
return r.Reused
|
||||
case r.BuiltWhy != "":
|
||||
return "built: " + r.BuiltWhy
|
||||
}
|
||||
return "built: the build seat did not say whether a check's build could be taken (it predates ADR 0350)"
|
||||
}
|
||||
|
||||
@@ -290,6 +290,9 @@ type Checked struct {
|
||||
Trunk string `json:"trunk,omitempty"`
|
||||
Beside map[string]string `json:"beside,omitempty"`
|
||||
Took string `json:"took,omitempty"`
|
||||
// Built are the builds the check made for its merge, each with its reuse key and digests, or why not
|
||||
// (novox/hq ADR 0350 §1): what the walk of the merge takes instead of building.
|
||||
Built []CheckBuilt `json:"built,omitempty"`
|
||||
}
|
||||
|
||||
// CheckedMember is one head a group's composed check judged, and the trunk commit it was merged into (novox/hq
|
||||
|
||||
Reference in New Issue
Block a user