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 }