@@ -23,6 +23,7 @@ var outlineTests = integration.TestFuncs(
23
23
testOutlineArgs ,
24
24
testOutlineSecrets ,
25
25
testOutlineDescribeDefinition ,
26
+ testOutlineRecursiveArgs ,
26
27
)
27
28
28
29
func testOutlineArgs (t * testing.T , sb integration.Sandbox ) {
@@ -268,6 +269,86 @@ FROM second
268
269
require .True (t , called )
269
270
}
270
271
272
+ func testOutlineRecursiveArgs (t * testing.T , sb integration.Sandbox ) {
273
+ integration .SkipOnPlatform (t , "windows" )
274
+ workers .CheckFeatureCompat (t , sb , workers .FeatureFrontendOutline )
275
+ f := getFrontend (t , sb )
276
+ if _ , ok := f .(* clientFrontend ); ! ok {
277
+ t .Skip ("only test with client frontend" )
278
+ }
279
+
280
+ dockerfile := []byte (`
281
+ ARG FOO=123
282
+ ARG ABC=abc
283
+ ARG DEF=def
284
+ ARG FOO=${FOO}${ABC}
285
+ ARG BAR=${FOO}456
286
+ ARG FOO=${FOO}456${BAR}
287
+ FROM scratch
288
+ ARG FOO
289
+ ARG INFOO=123
290
+ ARG INBAR=${INFOO}456
291
+ ARG INFOO=${INFOO}456${INBAR}
292
+ ` )
293
+
294
+ dir := integration .Tmpdir (
295
+ t ,
296
+ fstest .CreateFile ("Dockerfile" , []byte (dockerfile ), 0600 ),
297
+ )
298
+
299
+ c , err := client .New (sb .Context (), sb .Address ())
300
+ require .NoError (t , err )
301
+ defer c .Close ()
302
+
303
+ destDir , err := os .MkdirTemp ("" , "buildkit" )
304
+ require .NoError (t , err )
305
+ defer os .RemoveAll (destDir )
306
+
307
+ called := false
308
+ frontend := func (ctx context.Context , c gateway.Client ) (* gateway.Result , error ) {
309
+ res , err := c .Solve (ctx , gateway.SolveRequest {
310
+ FrontendOpt : map [string ]string {
311
+ "frontend.caps" : "moby.buildkit.frontend.subrequests" ,
312
+ "requestid" : "frontend.outline" ,
313
+ },
314
+ Frontend : "dockerfile.v0" ,
315
+ })
316
+ require .NoError (t , err )
317
+
318
+ outline , err := unmarshalOutline (res )
319
+ require .NoError (t , err )
320
+
321
+ require .Len (t , outline .Args , 5 )
322
+
323
+ require .Equal (t , "ABC" , outline .Args [0 ].Name )
324
+ require .Equal (t , "abc" , outline .Args [0 ].Value )
325
+
326
+ require .Equal (t , "BAR" , outline .Args [1 ].Name )
327
+ require .Equal (t , "123abc456" , outline .Args [1 ].Value )
328
+
329
+ require .Equal (t , "FOO" , outline .Args [2 ].Name )
330
+ require .Equal (t , "123abc456123abc456" , outline .Args [2 ].Value )
331
+
332
+ require .Equal (t , "INBAR" , outline .Args [3 ].Name )
333
+ require .Equal (t , "123456" , outline .Args [3 ].Value )
334
+
335
+ require .Equal (t , "INFOO" , outline .Args [4 ].Name )
336
+ require .Equal (t , "123456123456" , outline .Args [4 ].Value )
337
+
338
+ called = true
339
+ return nil , nil
340
+ }
341
+
342
+ _ , err = c .Build (sb .Context (), client.SolveOpt {
343
+ LocalMounts : map [string ]fsutil.FS {
344
+ dockerui .DefaultLocalNameDockerfile : dir ,
345
+ },
346
+ }, "" , frontend , nil )
347
+ require .NoError (t , err )
348
+
349
+ require .True (t , called )
350
+ }
351
+
271
352
func testOutlineDescribeDefinition (t * testing.T , sb integration.Sandbox ) {
272
353
workers .CheckFeatureCompat (t , sb , workers .FeatureFrontendOutline )
273
354
f := getFrontend (t , sb )
0 commit comments