mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 01:53:42 +08:00 
			
		
		
		
	bake: initial set of composable bake attributes
This allows using either the csv syntax or object syntax to specify certain attributes. This applies to the following fields: - output - cache-from - cache-to - secret - ssh There are still some remaining fields to translate. Specifically ulimits, annotations, and attest. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
This commit is contained in:
		
							
								
								
									
										111
									
								
								bake/hcl_test.go
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								bake/hcl_test.go
									
									
									
									
									
								
							@@ -17,6 +17,7 @@ func TestHCLBasic(t *testing.T) {
 | 
			
		||||
		target "db" {
 | 
			
		||||
			context = "./db"
 | 
			
		||||
			tags = ["docker.io/tonistiigi/db"]
 | 
			
		||||
			output = ["type=image"]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		target "webapp" {
 | 
			
		||||
@@ -25,6 +26,9 @@ func TestHCLBasic(t *testing.T) {
 | 
			
		||||
			args = {
 | 
			
		||||
				buildno = "123"
 | 
			
		||||
			}
 | 
			
		||||
			output = [
 | 
			
		||||
				{ type = "image" }
 | 
			
		||||
			]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		target "cross" {
 | 
			
		||||
@@ -597,6 +601,113 @@ func TestHCLAttrsCustomType(t *testing.T) {
 | 
			
		||||
	require.Equal(t, ptrstr("linux/arm64"), c.Targets[0].Args["v1"])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHCLAttrsCapsuleType(t *testing.T) {
 | 
			
		||||
	dt := []byte(`
 | 
			
		||||
	target "app" {
 | 
			
		||||
		cache-from = [
 | 
			
		||||
			{ type = "registry", ref = "user/app:cache" },
 | 
			
		||||
			{ type = "local", src = "path/to/cache" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		cache-to = [
 | 
			
		||||
			{ type = "local", dest = "path/to/cache" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		output = [
 | 
			
		||||
			{ type = "oci", dest = "../out.tar" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		secret = [
 | 
			
		||||
			{ id = "mysecret", src = "/local/secret" },
 | 
			
		||||
			{ id = "mysecret2", env = "TOKEN" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		ssh = [
 | 
			
		||||
			{ id = "default" },
 | 
			
		||||
			{ id = "key", paths = ["path/to/key"] },
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
	`)
 | 
			
		||||
 | 
			
		||||
	c, err := ParseFile(dt, "docker-bake.hcl")
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	require.Equal(t, 1, len(c.Targets))
 | 
			
		||||
	require.Equal(t, []string{"type=oci,dest=../out.tar"}, stringify(c.Targets[0].Outputs))
 | 
			
		||||
	require.Equal(t, []string{"type=local,src=path/to/cache", "user/app:cache"}, stringify(c.Targets[0].CacheFrom))
 | 
			
		||||
	require.Equal(t, []string{"type=local,dest=path/to/cache"}, stringify(c.Targets[0].CacheTo))
 | 
			
		||||
	require.Equal(t, []string{"id=mysecret,src=/local/secret", "id=mysecret2,env=TOKEN"}, stringify(c.Targets[0].Secrets))
 | 
			
		||||
	require.Equal(t, []string{"default", "key=path/to/key"}, stringify(c.Targets[0].SSH))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHCLAttrsCapsuleTypeVars(t *testing.T) {
 | 
			
		||||
	dt := []byte(`
 | 
			
		||||
	variable "foo" {
 | 
			
		||||
		default = "bar"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	target "app" {
 | 
			
		||||
		cache-from = [
 | 
			
		||||
			{ type = "registry", ref = "user/app:cache" },
 | 
			
		||||
			{ type = "local", src = "path/to/cache" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		cache-to = [ target.app.cache-from[0] ]
 | 
			
		||||
 | 
			
		||||
		output = [
 | 
			
		||||
			{ type = "oci", dest = "../out.tar" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		secret = [
 | 
			
		||||
			{ id = "mysecret", src = "/local/secret" },
 | 
			
		||||
		]
 | 
			
		||||
 | 
			
		||||
		ssh = [
 | 
			
		||||
			{ id = "default" },
 | 
			
		||||
			{ id = "key", paths = ["path/to/${target.app.output[0].type}"] },
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	target "web" {
 | 
			
		||||
		cache-from = target.app.cache-from
 | 
			
		||||
 | 
			
		||||
		output = [ "type=oci,dest=../${foo}.tar" ]
 | 
			
		||||
 | 
			
		||||
		secret = [
 | 
			
		||||
			{ id = target.app.output[0].type, src = "/local/secret" },
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
	`)
 | 
			
		||||
 | 
			
		||||
	c, err := ParseFile(dt, "docker-bake.hcl")
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	require.Equal(t, 2, len(c.Targets))
 | 
			
		||||
 | 
			
		||||
	findTarget := func(t *testing.T, name string) *Target {
 | 
			
		||||
		t.Helper()
 | 
			
		||||
		for _, tgt := range c.Targets {
 | 
			
		||||
			if tgt.Name == name {
 | 
			
		||||
				return tgt
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		t.Fatalf("could not find target %q", name)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	app := findTarget(t, "app")
 | 
			
		||||
	require.Equal(t, []string{"type=oci,dest=../out.tar"}, stringify(app.Outputs))
 | 
			
		||||
	require.Equal(t, []string{"type=local,src=path/to/cache", "user/app:cache"}, stringify(app.CacheFrom))
 | 
			
		||||
	require.Equal(t, []string{"user/app:cache"}, stringify(app.CacheTo))
 | 
			
		||||
	require.Equal(t, []string{"id=mysecret,src=/local/secret"}, stringify(app.Secrets))
 | 
			
		||||
	require.Equal(t, []string{"default", "key=path/to/oci"}, stringify(app.SSH))
 | 
			
		||||
 | 
			
		||||
	web := findTarget(t, "web")
 | 
			
		||||
	require.Equal(t, []string{"type=oci,dest=../bar.tar"}, stringify(web.Outputs))
 | 
			
		||||
	require.Equal(t, []string{"type=local,src=path/to/cache", "user/app:cache"}, stringify(web.CacheFrom))
 | 
			
		||||
	require.Equal(t, []string{"id=oci,src=/local/secret"}, stringify(web.Secrets))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHCLMultiFileAttrs(t *testing.T) {
 | 
			
		||||
	dt := []byte(`
 | 
			
		||||
		variable "FOO" {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user