1
1
package buildflags
2
2
3
3
import (
4
+ "context"
4
5
"encoding/csv"
5
6
"encoding/json"
6
7
"maps"
8
+ "os"
9
+ "strconv"
7
10
"strings"
8
11
12
+ awsconfig "github.com/aws/aws-sdk-go-v2/config"
9
13
"github.com/moby/buildkit/client"
10
14
"github.com/pkg/errors"
11
15
"github.com/zclconf/go-cty/cty"
@@ -183,6 +187,9 @@ func CreateCaches(entries []*CacheOptionsEntry) []client.CacheOptionsEntry {
183
187
return nil
184
188
}
185
189
for _ , entry := range entries {
190
+ addGithubToken (entry )
191
+ addAwsCredentials (entry )
192
+
186
193
out := client.CacheOptionsEntry {
187
194
Type : entry .Type ,
188
195
Attrs : map [string ]string {},
@@ -194,3 +201,67 @@ func CreateCaches(entries []*CacheOptionsEntry) []client.CacheOptionsEntry {
194
201
}
195
202
return outs
196
203
}
204
+
205
+ func addGithubToken (ci * CacheOptionsEntry ) {
206
+ if ci .Type != "gha" {
207
+ return
208
+ }
209
+ version , ok := ci .Attrs ["version" ]
210
+ if ! ok {
211
+ // https://github.com/actions/toolkit/blob/2b08dc18f261b9fdd978b70279b85cbef81af8bc/packages/cache/src/internal/config.ts#L19
212
+ if v , ok := os .LookupEnv ("ACTIONS_CACHE_SERVICE_V2" ); ok {
213
+ if b , err := strconv .ParseBool (v ); err == nil && b {
214
+ version = "2"
215
+ }
216
+ }
217
+ }
218
+ if _ , ok := ci .Attrs ["token" ]; ! ok {
219
+ if v , ok := os .LookupEnv ("ACTIONS_RUNTIME_TOKEN" ); ok {
220
+ ci .Attrs ["token" ] = v
221
+ }
222
+ }
223
+ if _ , ok := ci .Attrs ["url_v2" ]; ! ok && version == "2" {
224
+ // https://github.com/actions/toolkit/blob/2b08dc18f261b9fdd978b70279b85cbef81af8bc/packages/cache/src/internal/config.ts#L34-L35
225
+ if v , ok := os .LookupEnv ("ACTIONS_RESULTS_URL" ); ok {
226
+ ci .Attrs ["url_v2" ] = v
227
+ }
228
+ }
229
+ if _ , ok := ci .Attrs ["url" ]; ! ok {
230
+ // https://github.com/actions/toolkit/blob/2b08dc18f261b9fdd978b70279b85cbef81af8bc/packages/cache/src/internal/config.ts#L28-L33
231
+ if v , ok := os .LookupEnv ("ACTIONS_CACHE_URL" ); ok {
232
+ ci .Attrs ["url" ] = v
233
+ } else if v , ok := os .LookupEnv ("ACTIONS_RESULTS_URL" ); ok {
234
+ ci .Attrs ["url" ] = v
235
+ }
236
+ }
237
+ }
238
+
239
+ func addAwsCredentials (ci * CacheOptionsEntry ) {
240
+ if ci .Type != "s3" {
241
+ return
242
+ }
243
+ _ , okAccessKeyID := ci .Attrs ["access_key_id" ]
244
+ _ , okSecretAccessKey := ci .Attrs ["secret_access_key" ]
245
+ // If the user provides access_key_id, secret_access_key, do not override the session token.
246
+ if okAccessKeyID && okSecretAccessKey {
247
+ return
248
+ }
249
+ ctx := context .TODO ()
250
+ awsConfig , err := awsconfig .LoadDefaultConfig (ctx )
251
+ if err != nil {
252
+ return
253
+ }
254
+ credentials , err := awsConfig .Credentials .Retrieve (ctx )
255
+ if err != nil {
256
+ return
257
+ }
258
+ if ! okAccessKeyID && credentials .AccessKeyID != "" {
259
+ ci .Attrs ["access_key_id" ] = credentials .AccessKeyID
260
+ }
261
+ if ! okSecretAccessKey && credentials .SecretAccessKey != "" {
262
+ ci .Attrs ["secret_access_key" ] = credentials .SecretAccessKey
263
+ }
264
+ if _ , ok := ci .Attrs ["session_token" ]; ! ok && credentials .SessionToken != "" {
265
+ ci .Attrs ["session_token" ] = credentials .SessionToken
266
+ }
267
+ }
0 commit comments