@@ -3,6 +3,7 @@ package main
33import (
44 "encoding/json"
55 "errors"
6+ "fmt"
67 "net/url"
78 "path"
89 "strings"
@@ -22,6 +23,7 @@ type Plugin struct {
2223 Watch []WatchConfig
2324 RawEnv interface {} `json:"env"`
2425 Env map [string ]string
26+ Metadata map [string ]string `json:"meta_data"`
2527 RawNotify []map [string ]interface {} `json:"notify" yaml:",omitempty"`
2628 Notify []PluginNotify `yaml:"notify,omitempty"`
2729}
@@ -98,11 +100,12 @@ type Agent map[string]string
98100
99101// Build is buildkite build definition
100102type Build struct {
101- Message string `yaml:"message,omitempty"`
102- Branch string `yaml:"branch,omitempty"`
103- Commit string `yaml:"commit,omitempty"`
104- RawEnv interface {} `json:"env" yaml:",omitempty"`
105- Env map [string ]string `yaml:"env,omitempty"`
103+ Message string `yaml:"message,omitempty"`
104+ Branch string `yaml:"branch,omitempty"`
105+ Commit string `yaml:"commit,omitempty"`
106+ RawEnv interface {} `json:"env" yaml:",omitempty"`
107+ Env map [string ]string `yaml:"env,omitempty"`
108+ Metadata map [string ]string `json:"meta_data" yaml:"meta_data,omitempty"`
106109 // Notify []Notify `yaml:"notify,omitempty"`
107110}
108111
@@ -129,6 +132,13 @@ func (plugin *Plugin) UnmarshalJSON(data []byte) error {
129132 plugin .Env = parseResult
130133 plugin .RawEnv = nil
131134
135+ metaDataParseResult , err := parseMetadata (plugin .Metadata )
136+ if err != nil {
137+ return errors .New ("failed to parse metadata configuration" )
138+ }
139+
140+ plugin .Metadata = metaDataParseResult
141+
132142 setPluginNotify (& plugin .Notify , & plugin .RawNotify )
133143
134144 for i , p := range plugin .Watch {
@@ -189,6 +199,14 @@ func (plugin *Plugin) UnmarshalJSON(data []byte) error {
189199
190200 appendEnv (& plugin .Watch [i ], plugin .Env )
191201
202+ // Attempt to parse the metadata after the env's
203+ parsedMetadata , err := parseMetadata (plugin .Metadata )
204+ if err != nil {
205+ return errors .New ("failed to parse metadata configuration" )
206+ }
207+
208+ appendMetadata (& plugin .Watch [i ], parsedMetadata )
209+
192210 p .RawPath = nil
193211 p .RawSkipPath = nil
194212 }
@@ -357,6 +375,22 @@ func appendEnv(watch *WatchConfig, env map[string]string) {
357375 watch .RawSkipPath = nil
358376}
359377
378+ // appends build metadata
379+ func appendMetadata (watch * WatchConfig , metadata map [string ]string ) {
380+ if len (metadata ) == 0 {
381+ return
382+ }
383+ // Only apply metadata to trigger steps, not command steps
384+ if watch .Step .Trigger != "" {
385+ if watch .Step .Build .Metadata == nil {
386+ watch .Step .Build .Metadata = make (map [string ]string )
387+ }
388+ for k , v := range metadata {
389+ watch .Step .Build .Metadata [k ] = v
390+ }
391+ }
392+ }
393+
360394// parse env in format from env=env-value to map[env] = env-value
361395func parseEnv (raw interface {}) (map [string ]string , error ) {
362396 if raw == nil {
@@ -385,6 +419,44 @@ func parseEnv(raw interface{}) (map[string]string, error) {
385419 return result , nil
386420}
387421
422+ // parse metadata in format from key:value to map[key] = value
423+ func parseMetadata (raw interface {}) (map [string ]string , error ) {
424+ if raw == nil {
425+ return nil , nil
426+ }
427+
428+ switch v := raw .(type ) {
429+ case map [string ]string :
430+ return v , nil
431+ case map [string ]interface {}:
432+ result := make (map [string ]string )
433+ for k , val := range v {
434+ result [k ] = fmt .Sprintf ("%v" , val )
435+ }
436+ return result , nil
437+ case []interface {}:
438+ result := make (map [string ]string )
439+ for _ , item := range v {
440+ str , ok := item .(string )
441+ if ! ok {
442+ continue
443+ }
444+ split := strings .SplitN (str , ":" , 2 )
445+ key := strings .TrimSpace (split [0 ])
446+ value := ""
447+ if len (split ) > 1 {
448+ value = strings .TrimSpace (split [1 ])
449+ }
450+ if key != "" {
451+ result [key ] = value
452+ }
453+ }
454+ return result , nil
455+ default :
456+ return nil , errors .New ("failed to parse metadata configuration: unknown type" )
457+ }
458+ }
459+
388460func getPluginName (s string ) string {
389461 ref := s
390462 if strings .HasPrefix (ref , "github.com/" ) && ! strings .Contains (ref , "://" ) {
0 commit comments