github.com/bshelton229/agent@v3.5.4+incompatible/clicommand/meta_data_set.go (about)

     1  package clicommand
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"time"
     7  
     8  	"github.com/buildkite/agent/agent"
     9  	"github.com/buildkite/agent/api"
    10  	"github.com/buildkite/agent/cliconfig"
    11  	"github.com/buildkite/agent/logger"
    12  	"github.com/buildkite/agent/retry"
    13  	"github.com/urfave/cli"
    14  )
    15  
    16  var MetaDataSetHelpDescription = `Usage:
    17  
    18     buildkite-agent meta-data set <key> [<value>] [arguments...]
    19  
    20  Description:
    21  
    22     Set arbitrary data on a build using a basic key/value store.
    23  
    24     You can supply the value as an argument to the command, or pipe in a file or
    25     script output.
    26  
    27  Example:
    28  
    29     $ buildkite-agent meta-data set "foo" "bar"
    30     $ buildkite-agent meta-data set "foo" < ./tmp/meta-data-value
    31     $ ./script/meta-data-generator | buildkite-agent meta-data set "foo"`
    32  
    33  type MetaDataSetConfig struct {
    34  	Key              string `cli:"arg:0" label:"meta-data key" validate:"required"`
    35  	Value            string `cli:"arg:1" label:"meta-data value"`
    36  	Job              string `cli:"job" validate:"required"`
    37  	AgentAccessToken string `cli:"agent-access-token" validate:"required"`
    38  	Endpoint         string `cli:"endpoint" validate:"required"`
    39  	NoColor          bool   `cli:"no-color"`
    40  	Debug            bool   `cli:"debug"`
    41  	DebugHTTP        bool   `cli:"debug-http"`
    42  }
    43  
    44  var MetaDataSetCommand = cli.Command{
    45  	Name:        "set",
    46  	Usage:       "Set data on a build",
    47  	Description: MetaDataSetHelpDescription,
    48  	Flags: []cli.Flag{
    49  		cli.StringFlag{
    50  			Name:   "job",
    51  			Value:  "",
    52  			Usage:  "Which job should the meta-data be set on",
    53  			EnvVar: "BUILDKITE_JOB_ID",
    54  		},
    55  		AgentAccessTokenFlag,
    56  		EndpointFlag,
    57  		NoColorFlag,
    58  		DebugFlag,
    59  		DebugHTTPFlag,
    60  	},
    61  	Action: func(c *cli.Context) {
    62  		// The configuration will be loaded into this struct
    63  		cfg := MetaDataSetConfig{}
    64  
    65  		// Load the configuration
    66  		if err := cliconfig.Load(c, &cfg); err != nil {
    67  			logger.Fatal("%s", err)
    68  		}
    69  
    70  		// Setup the any global configuration options
    71  		HandleGlobalFlags(cfg)
    72  
    73  		// Read the value from STDIN if argument omitted entirely
    74  		if len(c.Args()) < 2 {
    75  			logger.Info("Reading meta-data value from STDIN")
    76  
    77  			input, err := ioutil.ReadAll(os.Stdin)
    78  			if err != nil {
    79  				logger.Fatal("Failed to read from STDIN: %s", err)
    80  			}
    81  			cfg.Value = string(input)
    82  		}
    83  
    84  		// Create the API client
    85  		client := agent.APIClient{
    86  			Endpoint: cfg.Endpoint,
    87  			Token:    cfg.AgentAccessToken,
    88  		}.Create()
    89  
    90  		// Create the meta data to set
    91  		metaData := &api.MetaData{
    92  			Key:   cfg.Key,
    93  			Value: cfg.Value,
    94  		}
    95  
    96  		// Set the meta data
    97  		err := retry.Do(func(s *retry.Stats) error {
    98  			resp, err := client.MetaData.Set(cfg.Job, metaData)
    99  			if resp != nil && (resp.StatusCode == 401 || resp.StatusCode == 404) {
   100  				s.Break()
   101  			}
   102  			if err != nil {
   103  				logger.Warn("%s (%s)", err, s)
   104  			}
   105  
   106  			return err
   107  		}, &retry.Config{Maximum: 10, Interval: 5 * time.Second})
   108  		if err != nil {
   109  			logger.Fatal("Failed to set meta-data: %s", err)
   110  		}
   111  	},
   112  }