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  }