@@ -14,7 +14,9 @@ import (
14
14
"net/http/httptest"
15
15
"net/http/httputil"
16
16
"net/url"
17
+ "os"
17
18
"os/exec"
19
+ "path/filepath"
18
20
"strings"
19
21
"testing"
20
22
"time"
@@ -52,9 +54,9 @@ func TestFailsGitAuth(t *testing.T) {
52
54
username : "kyle" ,
53
55
password : "testing" ,
54
56
})
55
- _ , err := runEnvbuilder (t , []string {
57
+ _ , err := runEnvbuilder (t , options { env : []string {
56
58
"GIT_URL=" + url ,
57
- })
59
+ }} )
58
60
require .ErrorContains (t , err , "authentication required" )
59
61
}
60
62
@@ -67,12 +69,12 @@ func TestSucceedsGitAuth(t *testing.T) {
67
69
username : "kyle" ,
68
70
password : "testing" ,
69
71
})
70
- _ , err := runEnvbuilder (t , []string {
72
+ _ , err := runEnvbuilder (t , options { env : []string {
71
73
"GIT_URL=" + url ,
72
74
"DOCKERFILE_PATH=Dockerfile" ,
73
75
"GIT_USERNAME=kyle" ,
74
76
"GIT_PASSWORD=testing" ,
75
- })
77
+ }} )
76
78
require .NoError (t , err )
77
79
}
78
80
@@ -111,9 +113,9 @@ func TestBuildFromDevcontainerWithFeatures(t *testing.T) {
111
113
".devcontainer/Dockerfile" : "FROM ubuntu" ,
112
114
},
113
115
})
114
- ctr , err := runEnvbuilder (t , []string {
116
+ ctr , err := runEnvbuilder (t , options { env : []string {
115
117
"GIT_URL=" + url ,
116
- })
118
+ }} )
117
119
require .NoError (t , err )
118
120
119
121
output := execContainer (t , ctr , "cat /test" )
@@ -127,9 +129,32 @@ func TestBuildFromDockerfile(t *testing.T) {
127
129
"Dockerfile" : "FROM alpine:latest" ,
128
130
},
129
131
})
130
- ctr , err := runEnvbuilder (t , []string {
132
+ ctr , err := runEnvbuilder (t , options { env : []string {
131
133
"GIT_URL=" + url ,
132
134
"DOCKERFILE_PATH=Dockerfile" ,
135
+ }})
136
+ require .NoError (t , err )
137
+
138
+ output := execContainer (t , ctr , "echo hello" )
139
+ require .Equal (t , "hello" , strings .TrimSpace (output ))
140
+ }
141
+
142
+ func TestBuildIgnoreVarRunSecrets (t * testing.T ) {
143
+ // Ensures that a Git repository with a Dockerfile is cloned and built.
144
+ url := createGitServer (t , gitServerOptions {
145
+ files : map [string ]string {
146
+ "Dockerfile" : "FROM alpine:latest" ,
147
+ },
148
+ })
149
+ dir := t .TempDir ()
150
+ err := os .WriteFile (filepath .Join (dir , "secret" ), []byte ("test" ), 0644 )
151
+ require .NoError (t , err )
152
+ ctr , err := runEnvbuilder (t , options {
153
+ env : []string {
154
+ "GIT_URL=" + url ,
155
+ "DOCKERFILE_PATH=Dockerfile" ,
156
+ },
157
+ binds : []string {fmt .Sprintf ("%s:/var/run/secrets" , dir )},
133
158
})
134
159
require .NoError (t , err )
135
160
@@ -144,11 +169,11 @@ func TestBuildWithSetupScript(t *testing.T) {
144
169
"Dockerfile" : "FROM alpine:latest" ,
145
170
},
146
171
})
147
- ctr , err := runEnvbuilder (t , []string {
172
+ ctr , err := runEnvbuilder (t , options { env : []string {
148
173
"GIT_URL=" + url ,
149
174
"DOCKERFILE_PATH=Dockerfile" ,
150
175
"SETUP_SCRIPT=echo \" INIT_ARGS=-c 'echo hi > /wow && sleep infinity'\" >> $ENVBUILDER_ENV" ,
151
- })
176
+ }} )
152
177
require .NoError (t , err )
153
178
154
179
output := execContainer (t , ctr , "cat /wow" )
@@ -161,14 +186,14 @@ func TestBuildCustomCertificates(t *testing.T) {
161
186
"Dockerfile" : "FROM alpine:latest" ,
162
187
},
163
188
}))
164
- ctr , err := runEnvbuilder (t , []string {
189
+ ctr , err := runEnvbuilder (t , options { env : []string {
165
190
"GIT_URL=" + srv .URL ,
166
191
"DOCKERFILE_PATH=Dockerfile" ,
167
192
"SSL_CERT_BASE64=" + base64 .StdEncoding .EncodeToString (pem .EncodeToMemory (& pem.Block {
168
193
Type : "CERTIFICATE" ,
169
194
Bytes : srv .TLS .Certificates [0 ].Certificate [0 ],
170
195
})),
171
- })
196
+ }} )
172
197
require .NoError (t , err )
173
198
174
199
output := execContainer (t , ctr , "echo hello" )
@@ -182,10 +207,11 @@ func TestBuildStopStartCached(t *testing.T) {
182
207
"Dockerfile" : "FROM alpine:latest" ,
183
208
},
184
209
})
185
- ctr , err := runEnvbuilder (t , []string {
210
+ ctr , err := runEnvbuilder (t , options { env : []string {
186
211
"GIT_URL=" + url ,
187
212
"DOCKERFILE_PATH=Dockerfile" ,
188
- })
213
+ "SKIP_REBUILD=true" ,
214
+ }})
189
215
require .NoError (t , err )
190
216
191
217
cli , err := client .NewClientWithOpts (client .FromEnv , client .WithAPIVersionNegotiation ())
@@ -212,9 +238,9 @@ func TestCloneFailsFallback(t *testing.T) {
212
238
t .Parallel ()
213
239
t .Run ("BadRepo" , func (t * testing.T ) {
214
240
t .Parallel ()
215
- _ , err := runEnvbuilder (t , []string {
241
+ _ , err := runEnvbuilder (t , options { env : []string {
216
242
"GIT_URL=bad-value" ,
217
- })
243
+ }} )
218
244
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
219
245
})
220
246
}
@@ -229,10 +255,10 @@ func TestBuildFailsFallback(t *testing.T) {
229
255
"Dockerfile" : "bad syntax" ,
230
256
},
231
257
})
232
- _ , err := runEnvbuilder (t , []string {
258
+ _ , err := runEnvbuilder (t , options { env : []string {
233
259
"GIT_URL=" + url ,
234
260
"DOCKERFILE_PATH=Dockerfile" ,
235
- })
261
+ }} )
236
262
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
237
263
require .ErrorContains (t , err , "dockerfile parse error" )
238
264
})
@@ -245,10 +271,10 @@ func TestBuildFailsFallback(t *testing.T) {
245
271
RUN exit 1` ,
246
272
},
247
273
})
248
- _ , err := runEnvbuilder (t , []string {
274
+ _ , err := runEnvbuilder (t , options { env : []string {
249
275
"GIT_URL=" + url ,
250
276
"DOCKERFILE_PATH=Dockerfile" ,
251
- })
277
+ }} )
252
278
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
253
279
})
254
280
t .Run ("BadDevcontainer" , func (t * testing.T ) {
@@ -259,9 +285,9 @@ RUN exit 1`,
259
285
".devcontainer/devcontainer.json" : "not json" ,
260
286
},
261
287
})
262
- _ , err := runEnvbuilder (t , []string {
288
+ _ , err := runEnvbuilder (t , options { env : []string {
263
289
"GIT_URL=" + url ,
264
- })
290
+ }} )
265
291
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
266
292
})
267
293
t .Run ("NoImageOrDockerfile" , func (t * testing.T ) {
@@ -271,10 +297,10 @@ RUN exit 1`,
271
297
".devcontainer/devcontainer.json" : "{}" ,
272
298
},
273
299
})
274
- ctr , err := runEnvbuilder (t , []string {
300
+ ctr , err := runEnvbuilder (t , options { env : []string {
275
301
"GIT_URL=" + url ,
276
302
"FALLBACK_IMAGE=alpine:latest" ,
277
- })
303
+ }} )
278
304
require .NoError (t , err )
279
305
280
306
output := execContainer (t , ctr , "echo hello" )
@@ -297,10 +323,10 @@ func TestPrivateRegistry(t *testing.T) {
297
323
"Dockerfile" : "FROM " + image ,
298
324
},
299
325
})
300
- _ , err := runEnvbuilder (t , []string {
326
+ _ , err := runEnvbuilder (t , options { env : []string {
301
327
"GIT_URL=" + url ,
302
328
"DOCKERFILE_PATH=Dockerfile" ,
303
- })
329
+ }} )
304
330
require .ErrorContains (t , err , "Unauthorized" )
305
331
})
306
332
t .Run ("Auth" , func (t * testing.T ) {
@@ -326,11 +352,11 @@ func TestPrivateRegistry(t *testing.T) {
326
352
})
327
353
require .NoError (t , err )
328
354
329
- _ , err = runEnvbuilder (t , []string {
355
+ _ , err = runEnvbuilder (t , options { env : []string {
330
356
"GIT_URL=" + url ,
331
357
"DOCKERFILE_PATH=Dockerfile" ,
332
358
"DOCKER_CONFIG_BASE64=" + base64 .StdEncoding .EncodeToString (config ),
333
- })
359
+ }} )
334
360
require .NoError (t , err )
335
361
})
336
362
t .Run ("InvalidAuth" , func (t * testing.T ) {
@@ -356,11 +382,11 @@ func TestPrivateRegistry(t *testing.T) {
356
382
})
357
383
require .NoError (t , err )
358
384
359
- _ , err = runEnvbuilder (t , []string {
385
+ _ , err = runEnvbuilder (t , options { env : []string {
360
386
"GIT_URL=" + url ,
361
387
"DOCKERFILE_PATH=Dockerfile" ,
362
388
"DOCKER_CONFIG_BASE64=" + base64 .StdEncoding .EncodeToString (config ),
363
- })
389
+ }} )
364
390
require .ErrorContains (t , err , "Unauthorized" )
365
391
})
366
392
}
@@ -409,7 +435,7 @@ func setupPassthroughRegistry(t *testing.T, image string, auth *registryAuth) st
409
435
}
410
436
411
437
func TestNoMethodFails (t * testing.T ) {
412
- _ , err := runEnvbuilder (t , []string {})
438
+ _ , err := runEnvbuilder (t , options { env : []string {} })
413
439
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
414
440
}
415
441
@@ -509,9 +535,14 @@ func cleanOldEnvbuilders() {
509
535
}
510
536
}
511
537
538
+ type options struct {
539
+ binds []string
540
+ env []string
541
+ }
542
+
512
543
// runEnvbuilder starts the envbuilder container with the given environment
513
544
// variables and returns the container ID.
514
- func runEnvbuilder (t * testing.T , env [] string ) (string , error ) {
545
+ func runEnvbuilder (t * testing.T , options options ) (string , error ) {
515
546
t .Helper ()
516
547
ctx := context .Background ()
517
548
cli , err := client .NewClientWithOpts (client .FromEnv , client .WithAPIVersionNegotiation ())
@@ -521,12 +552,13 @@ func runEnvbuilder(t *testing.T, env []string) (string, error) {
521
552
})
522
553
ctr , err := cli .ContainerCreate (ctx , & container.Config {
523
554
Image : "envbuilder:latest" ,
524
- Env : env ,
555
+ Env : options . env ,
525
556
Labels : map [string ]string {
526
557
testContainerLabel : "true" ,
527
558
},
528
559
}, & container.HostConfig {
529
560
NetworkMode : container .NetworkMode ("host" ),
561
+ Binds : options .binds ,
530
562
}, nil , nil , "" )
531
563
require .NoError (t , err )
532
564
t .Cleanup (func () {
0 commit comments