blob: 5f991825b8c70119ea6a0bec9f81952c4c0aac2c [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"context"
"errors"
"fmt"
"github.com/maruel/subcommands"
"go.chromium.org/luci/auth"
buildbucketpb "go.chromium.org/luci/buildbucket/proto"
"google.golang.org/genproto/protobuf/field_mask"
)
func cmdBuild(authOpts auth.Options) *subcommands.Command {
return &subcommands.Command{
UsageLine: "build -builder project1/bucket1/builder1, ... [common options]",
ShortDesc: "Get the last known good build IDs for a set of builders.",
LongDesc: "Get the last known good build IDs for a set of builders.",
CommandRun: func() subcommands.CommandRun {
c := &buildRun{}
c.Init(authOpts)
return c
},
}
}
type buildRun struct {
commonFlags
builders builders
}
func (c *buildRun) Init(defaultAuthOpts auth.Options) {
c.commonFlags.Init(defaultAuthOpts)
c.Flags.Var(&c.builders, "builder", "Builder ID as project/bucket/builder")
}
func (c *buildRun) checkFlags() error {
if err := c.commonFlags.checkFlags(); err != nil {
return err
}
if len(c.builders) != 1 {
return errors.New("exactly one -builder may be specified")
}
return nil
}
func (c *buildRun) main(a subcommands.Application) error {
ctx := context.Background()
client, err := newBuildbucketClient(ctx, c.parsedAuthOpts, c.buildbucketHost)
if err != nil {
return fmt.Errorf("failed to initialize client: %w", err)
}
// Retrieve build ID.
mask := &field_mask.FieldMask{
Paths: []string{"builds.*.id"},
}
builds, err := client.GetBuilds(ctx, c.builders, mask, c.searchRange)
if err != nil {
return fmt.Errorf("failed to query builds: %w", err)
}
bid, err := getLastKnownGood(builds, c.gitilesRef, func(build *buildbucketpb.Build) any {
return build.Id
})
if err != nil {
return fmt.Errorf("failed to get last known good build: %w", err)
}
fmt.Println(bid)
return nil
}
func (c *buildRun) Run(a subcommands.Application, args []string, env subcommands.Env) int {
if err := c.checkFlags(); err != nil {
fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err)
return 1
}
if err := c.main(a); err != nil {
fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err)
return 1
}
return 0
}