@@ -11,6 +11,7 @@ import (
1111 "sync/atomic"
1212
1313 "github.com/BurntSushi/toml"
14+ "golang.org/x/sync/errgroup"
1415)
1516
1617var builderWorkers atomic.Int32
@@ -115,13 +116,10 @@ func resolveSecrets(
115116 config any ,
116117 managers []SecretManager ,
117118) error {
118- ctx , cancel := context . WithCancel (ctx )
119- defer cancel ( )
119+ g , ctx := errgroup . WithContext (ctx )
120+ g . SetLimit ( int ( builderWorkers . Load ()) )
120121
121- semaphore := make (chan struct {}, builderWorkers .Load ())
122- var wg sync.WaitGroup
123122 var mu sync.Mutex
124- errGather := []string {}
125123
126124 strConfig , err := configToJSON (config )
127125 if err != nil {
@@ -131,50 +129,38 @@ func resolveSecrets(
131129 subs := findSubstitutions (strConfig )
132130 replacements := make ([]replacement , 0 , len (subs ))
133131 for _ , sub := range subs {
132+ sub := sub
134133 manager , err := getManagerForPrefix (sub .managerPrefix , managers )
135134 if err != nil {
136135 return err
137136 }
138137
139- wg .Add (1 )
140- go func (s substitutions , m SecretManager ) {
141- semaphore <- struct {}{} // make sure we don't flood system
142- defer func () { <- semaphore }() // release worker
143- defer wg .Done ()
144-
138+ g .Go (func () error {
145139 select {
146140 case <- ctx .Done ():
147- return
141+ return nil
148142 default :
149143 }
150144
151- secret , err := m .Secret (ctx , s .managerKey )
145+ secret , err := manager .Secret (ctx , sub .managerKey )
152146 if err != nil {
153- cancel ()
154- mu .Lock ()
155- errGather = append (errGather , err .Error ())
156- mu .Unlock ()
157- return
147+ return err
158148 }
159149
160150 escapedSecret := escape (secret )
161151
162152 mu .Lock ()
163153 replacements = append (
164154 replacements ,
165- replacement {old : s .value , new : escapedSecret },
155+ replacement {old : sub .value , new : escapedSecret },
166156 )
167157 mu .Unlock ()
168- }(sub , manager )
158+ return nil
159+ })
169160 }
170161
171- wg .Wait ()
172-
173- if len (errGather ) > 0 {
174- return fmt .Errorf (
175- "failed to fetch some secrets, %s" ,
176- strings .Join (errGather , ", " ),
177- )
162+ if err := g .Wait (); err != nil {
163+ return err
178164 }
179165
180166 // actually do the replacement
0 commit comments