go.fuchsia.dev/infra@v0.0.0-20240507153436-9b593402251b/cmd/lkg/cmd_build.go (about) 1 // Copyright 2020 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package main 6 7 import ( 8 "context" 9 "errors" 10 "fmt" 11 12 "github.com/maruel/subcommands" 13 "go.chromium.org/luci/auth" 14 buildbucketpb "go.chromium.org/luci/buildbucket/proto" 15 "google.golang.org/genproto/protobuf/field_mask" 16 ) 17 18 func cmdBuild(authOpts auth.Options) *subcommands.Command { 19 return &subcommands.Command{ 20 UsageLine: "build -builder project1/bucket1/builder1, ... [common options]", 21 ShortDesc: "Get the last known good build IDs for a set of builders.", 22 LongDesc: "Get the last known good build IDs for a set of builders.", 23 CommandRun: func() subcommands.CommandRun { 24 c := &buildRun{} 25 c.Init(authOpts) 26 return c 27 }, 28 } 29 } 30 31 type buildRun struct { 32 commonFlags 33 builders builders 34 } 35 36 func (c *buildRun) Init(defaultAuthOpts auth.Options) { 37 c.commonFlags.Init(defaultAuthOpts) 38 c.Flags.Var(&c.builders, "builder", "Builder ID as project/bucket/builder") 39 } 40 41 func (c *buildRun) checkFlags() error { 42 if err := c.commonFlags.checkFlags(); err != nil { 43 return err 44 } 45 if len(c.builders) != 1 { 46 return errors.New("exactly one -builder may be specified") 47 } 48 return nil 49 } 50 51 func (c *buildRun) main(a subcommands.Application) error { 52 ctx := context.Background() 53 client, err := newBuildbucketClient(ctx, c.parsedAuthOpts, c.buildbucketHost) 54 if err != nil { 55 return fmt.Errorf("failed to initialize client: %w", err) 56 } 57 // Retrieve build ID. 58 mask := &field_mask.FieldMask{ 59 Paths: []string{"builds.*.id"}, 60 } 61 builds, err := client.GetBuilds(ctx, c.builders, mask, c.searchRange) 62 if err != nil { 63 return fmt.Errorf("failed to query builds: %w", err) 64 } 65 bid, err := getLastKnownGood(builds, c.gitilesRef, func(build *buildbucketpb.Build) any { 66 return build.Id 67 }) 68 if err != nil { 69 return fmt.Errorf("failed to get last known good build: %w", err) 70 } 71 fmt.Println(bid) 72 return nil 73 } 74 75 func (c *buildRun) Run(a subcommands.Application, args []string, env subcommands.Env) int { 76 if err := c.checkFlags(); err != nil { 77 fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err) 78 return 1 79 } 80 81 if err := c.main(a); err != nil { 82 fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err) 83 return 1 84 } 85 return 0 86 }