A build is taken in where its outcome is heard, and the build tool answers at once (issue 176)
The console's `build` tool answered "no build machine answered within 0s", handed a forge path to git as written, and a build heard afterwards was recorded and never registered: recording and registration lived only in the waiting caller, and the tool did not wait. Now one function takes a build's outcome in — records it, parses the manifest, refuses a definition naming an installation, registers the module with its source as the seat and path the request carried — and both the waiting command and the daemon that follows the role's `built` event call it. `build --wait 0` asks and returns with the id; `builds --log <id>` follows it. The seat verb says `--self` for a repository given without a scheme.
This commit is contained in:
@@ -49,6 +49,17 @@ type BuildRequest struct {
|
||||
// which forge holds the seat here. A builder handed no base for a seat a context names refuses
|
||||
// the build and says so.
|
||||
Seats map[string]string `json:"seats,omitempty"`
|
||||
// Source is the repository as the mesh records it when it lives on a seat's holder — the seat
|
||||
// and the path on it, never the URL just composed (novox/hq ADR 0111). Carried with the
|
||||
// asking and echoed in the outcome, so whoever hears the outcome can register the module with
|
||||
// its true source, whether or not they were the one who asked (novox/hq issue 176).
|
||||
Source *SourceOnSeat `json:"source,omitempty"`
|
||||
}
|
||||
|
||||
// SourceOnSeat names a repository by the seat whose holder serves it and its path there.
|
||||
type SourceOnSeat struct {
|
||||
Seat string `json:"seat"`
|
||||
Repository string `json:"repository"`
|
||||
}
|
||||
|
||||
// BuildResult is what a builder says back.
|
||||
@@ -101,6 +112,9 @@ type BuildResult struct {
|
||||
|
||||
// Failed is why, when it did.
|
||||
Failed string `json:"failed,omitempty"`
|
||||
|
||||
// Source is the request's, echoed: the seat form of the repository, for whoever registers.
|
||||
Source *SourceOnSeat `json:"source,omitempty"`
|
||||
}
|
||||
|
||||
// ReadRepository is a repository a build read source from besides the module's own, at the branch,
|
||||
|
||||
@@ -78,6 +78,12 @@ type Builders interface {
|
||||
// need different remedies, which is why the message distinguishes them.
|
||||
Submit(ctx context.Context, request BuildRequest, wait time.Duration) (BuildResult, error)
|
||||
|
||||
// Ask submits one build and does not wait: the outcome is the role's event, heard and taken in
|
||||
// by the controller whether or not anybody waited (novox/hq issue 176). For a caller that
|
||||
// cannot hold a connection for the minutes a build takes — a tool call — and follows the build
|
||||
// by its id instead.
|
||||
Ask(ctx context.Context, request BuildRequest) error
|
||||
|
||||
// Close lets go of whatever was dialled.
|
||||
Close()
|
||||
}
|
||||
|
||||
@@ -43,6 +43,20 @@ func (b *natsBuilds) Close() {
|
||||
}
|
||||
}
|
||||
|
||||
// Ask publishes the work and returns; see Builders.
|
||||
func (b *natsBuilds) Ask(ctx context.Context, request BuildRequest) error {
|
||||
body, err := json.Marshal(request)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
publish, cancel := context.WithTimeout(ctx, 30*time.Second)
|
||||
defer cancel()
|
||||
if _, err := b.js.Context().Publish(BuildWork(), body, nats.Context(publish)); err != nil {
|
||||
return fmt.Errorf("cannot submit a build: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *natsBuilds) Submit(ctx context.Context, request BuildRequest,
|
||||
wait time.Duration) (BuildResult, error) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user