@@ -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 TestBuildIgnoreVarRun (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,10 @@ 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
+ }} )
189
214
require .NoError (t , err )
190
215
191
216
cli , err := client .NewClientWithOpts (client .FromEnv , client .WithAPIVersionNegotiation ())
@@ -212,9 +237,9 @@ func TestCloneFailsFallback(t *testing.T) {
212
237
t .Parallel ()
213
238
t .Run ("BadRepo" , func (t * testing.T ) {
214
239
t .Parallel ()
215
- _ , err := runEnvbuilder (t , []string {
240
+ _ , err := runEnvbuilder (t , options { env : []string {
216
241
"GIT_URL=bad-value" ,
217
- })
242
+ }} )
218
243
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
219
244
})
220
245
}
@@ -229,10 +254,10 @@ func TestBuildFailsFallback(t *testing.T) {
229
254
"Dockerfile" : "bad syntax" ,
230
255
},
231
256
})
232
- _ , err := runEnvbuilder (t , []string {
257
+ _ , err := runEnvbuilder (t , options { env : []string {
233
258
"GIT_URL=" + url ,
234
259
"DOCKERFILE_PATH=Dockerfile" ,
235
- })
260
+ }} )
236
261
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
237
262
require .ErrorContains (t , err , "dockerfile parse error" )
238
263
})
@@ -245,10 +270,10 @@ func TestBuildFailsFallback(t *testing.T) {
245
270
RUN exit 1` ,
246
271
},
247
272
})
248
- _ , err := runEnvbuilder (t , []string {
273
+ _ , err := runEnvbuilder (t , options { env : []string {
249
274
"GIT_URL=" + url ,
250
275
"DOCKERFILE_PATH=Dockerfile" ,
251
- })
276
+ }} )
252
277
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
253
278
})
254
279
t .Run ("BadDevcontainer" , func (t * testing.T ) {
@@ -259,9 +284,9 @@ RUN exit 1`,
259
284
".devcontainer/devcontainer.json" : "not json" ,
260
285
},
261
286
})
262
- _ , err := runEnvbuilder (t , []string {
287
+ _ , err := runEnvbuilder (t , options { env : []string {
263
288
"GIT_URL=" + url ,
264
- })
289
+ }} )
265
290
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
266
291
})
267
292
t .Run ("NoImageOrDockerfile" , func (t * testing.T ) {
@@ -271,10 +296,10 @@ RUN exit 1`,
271
296
".devcontainer/devcontainer.json" : "{}" ,
272
297
},
273
298
})
274
- ctr , err := runEnvbuilder (t , []string {
299
+ ctr , err := runEnvbuilder (t , options { env : []string {
275
300
"GIT_URL=" + url ,
276
301
"FALLBACK_IMAGE=alpine:latest" ,
277
- })
302
+ }} )
278
303
require .NoError (t , err )
279
304
280
305
output := execContainer (t , ctr , "echo hello" )
@@ -297,10 +322,10 @@ func TestPrivateRegistry(t *testing.T) {
297
322
"Dockerfile" : "FROM " + image ,
298
323
},
299
324
})
300
- _ , err := runEnvbuilder (t , []string {
325
+ _ , err := runEnvbuilder (t , options { env : []string {
301
326
"GIT_URL=" + url ,
302
327
"DOCKERFILE_PATH=Dockerfile" ,
303
- })
328
+ }} )
304
329
require .ErrorContains (t , err , "Unauthorized" )
305
330
})
306
331
t .Run ("Auth" , func (t * testing.T ) {
@@ -326,11 +351,11 @@ func TestPrivateRegistry(t *testing.T) {
326
351
})
327
352
require .NoError (t , err )
328
353
329
- _ , err = runEnvbuilder (t , []string {
354
+ _ , err = runEnvbuilder (t , options { env : []string {
330
355
"GIT_URL=" + url ,
331
356
"DOCKERFILE_PATH=Dockerfile" ,
332
357
"DOCKER_CONFIG_BASE64=" + base64 .StdEncoding .EncodeToString (config ),
333
- })
358
+ }} )
334
359
require .NoError (t , err )
335
360
})
336
361
t .Run ("InvalidAuth" , func (t * testing.T ) {
@@ -356,11 +381,11 @@ func TestPrivateRegistry(t *testing.T) {
356
381
})
357
382
require .NoError (t , err )
358
383
359
- _ , err = runEnvbuilder (t , []string {
384
+ _ , err = runEnvbuilder (t , options { env : []string {
360
385
"GIT_URL=" + url ,
361
386
"DOCKERFILE_PATH=Dockerfile" ,
362
387
"DOCKER_CONFIG_BASE64=" + base64 .StdEncoding .EncodeToString (config ),
363
- })
388
+ }} )
364
389
require .ErrorContains (t , err , "Unauthorized" )
365
390
})
366
391
}
@@ -409,7 +434,7 @@ func setupPassthroughRegistry(t *testing.T, image string, auth *registryAuth) st
409
434
}
410
435
411
436
func TestNoMethodFails (t * testing.T ) {
412
- _ , err := runEnvbuilder (t , []string {})
437
+ _ , err := runEnvbuilder (t , options { env : []string {} })
413
438
require .ErrorContains (t , err , envbuilder .ErrNoFallbackImage .Error ())
414
439
}
415
440
@@ -509,9 +534,14 @@ func cleanOldEnvbuilders() {
509
534
}
510
535
}
511
536
537
+ type options struct {
538
+ binds []string
539
+ env []string
540
+ }
541
+
512
542
// runEnvbuilder starts the envbuilder container with the given environment
513
543
// variables and returns the container ID.
514
- func runEnvbuilder (t * testing.T , env [] string ) (string , error ) {
544
+ func runEnvbuilder (t * testing.T , options options ) (string , error ) {
515
545
t .Helper ()
516
546
ctx := context .Background ()
517
547
cli , err := client .NewClientWithOpts (client .FromEnv , client .WithAPIVersionNegotiation ())
@@ -521,12 +551,13 @@ func runEnvbuilder(t *testing.T, env []string) (string, error) {
521
551
})
522
552
ctr , err := cli .ContainerCreate (ctx , & container.Config {
523
553
Image : "envbuilder:latest" ,
524
- Env : env ,
554
+ Env : options . env ,
525
555
Labels : map [string ]string {
526
556
testContainerLabel : "true" ,
527
557
},
528
558
}, & container.HostConfig {
529
559
NetworkMode : container .NetworkMode ("host" ),
560
+ Binds : options .binds ,
530
561
}, nil , nil , "" )
531
562
require .NoError (t , err )
532
563
t .Cleanup (func () {
0 commit comments