mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-10-30 23:53:48 +08:00 
			
		
		
		
	bake: merge targets from multiple JSON files
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
		| @@ -620,3 +620,79 @@ func TestHCLBuiltinVars(t *testing.T) { | |||||||
| 	require.Equal(t, "foo", *c.Targets[0].Context) | 	require.Equal(t, "foo", *c.Targets[0].Context) | ||||||
| 	require.Equal(t, "test", *c.Targets[0].Dockerfile) | 	require.Equal(t, "test", *c.Targets[0].Dockerfile) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestCombineHCLAndJSON(t *testing.T) { | ||||||
|  | 	c, err := ParseFiles([]File{ | ||||||
|  | 		{ | ||||||
|  | 			Name: "docker-bake.hcl", | ||||||
|  | 			Data: []byte(` | ||||||
|  | group "default" { | ||||||
|  |   targets = ["a"] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | target "metadata-a" {} | ||||||
|  | target "metadata-b" {} | ||||||
|  |  | ||||||
|  | target "a" { | ||||||
|  |   inherits = ["metadata-a"] | ||||||
|  |   context = "." | ||||||
|  |   target = "a" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | target "b" { | ||||||
|  |   inherits = ["metadata-b"] | ||||||
|  |   context = "." | ||||||
|  |   target = "b" | ||||||
|  | }`), | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Name: "metadata-a.json", | ||||||
|  | 			Data: []byte(` | ||||||
|  | { | ||||||
|  |   "target": [{ | ||||||
|  |     "metadata-a": [{ | ||||||
|  |       "tags": [ | ||||||
|  |         "app/a:1.0.0", | ||||||
|  |         "app/a:latest" | ||||||
|  |       ] | ||||||
|  |     }] | ||||||
|  |   }] | ||||||
|  | }`), | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Name: "metadata-b.json", | ||||||
|  | 			Data: []byte(` | ||||||
|  | { | ||||||
|  |   "target": [{ | ||||||
|  |     "metadata-b": [{ | ||||||
|  |       "tags": [ | ||||||
|  |         "app/b:1.0.0", | ||||||
|  |         "app/b:latest" | ||||||
|  |       ] | ||||||
|  |     }] | ||||||
|  |   }] | ||||||
|  | }`), | ||||||
|  | 		}, | ||||||
|  | 	}, nil) | ||||||
|  | 	require.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	require.Equal(t, 1, len(c.Groups)) | ||||||
|  | 	require.Equal(t, "default", c.Groups[0].Name) | ||||||
|  | 	require.Equal(t, []string{"a"}, c.Groups[0].Targets) | ||||||
|  |  | ||||||
|  | 	require.Equal(t, 4, len(c.Targets)) | ||||||
|  |  | ||||||
|  | 	require.Equal(t, c.Targets[0].Name, "metadata-a") | ||||||
|  | 	require.Equal(t, []string{"app/a:1.0.0", "app/a:latest"}, c.Targets[0].Tags) | ||||||
|  |  | ||||||
|  | 	require.Equal(t, c.Targets[1].Name, "metadata-b") | ||||||
|  | 	require.Equal(t, []string{"app/b:1.0.0", "app/b:latest"}, c.Targets[1].Tags) | ||||||
|  |  | ||||||
|  | 	require.Equal(t, c.Targets[2].Name, "a") | ||||||
|  | 	require.Equal(t, ".", *c.Targets[2].Context) | ||||||
|  | 	require.Equal(t, "a", *c.Targets[2].Target) | ||||||
|  |  | ||||||
|  | 	require.Equal(t, c.Targets[3].Name, "b") | ||||||
|  | 	require.Equal(t, ".", *c.Targets[3].Context) | ||||||
|  | 	require.Equal(t, "b", *c.Targets[3].Target) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -302,10 +302,8 @@ func Parse(b hcl.Body, opt Opt, val interface{}) hcl.Diagnostics { | |||||||
|  |  | ||||||
| 	attrs, diags := b.JustAttributes() | 	attrs, diags := b.JustAttributes() | ||||||
| 	if diags.HasErrors() { | 	if diags.HasErrors() { | ||||||
| 		for _, d := range diags { | 		if d := removeAttributesDiags(diags, reserved); len(d) > 0 { | ||||||
| 			if d.Detail != "Blocks are not allowed here." { | 			return d | ||||||
| 				return diags |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -514,3 +512,27 @@ func setLabel(v reflect.Value, lbl string) int { | |||||||
| 	} | 	} | ||||||
| 	return -1 | 	return -1 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func removeAttributesDiags(diags hcl.Diagnostics, reserved map[string]struct{}) hcl.Diagnostics { | ||||||
|  | 	var fdiags hcl.Diagnostics | ||||||
|  | 	for _, d := range diags { | ||||||
|  | 		if fout := func(d *hcl.Diagnostic) bool { | ||||||
|  | 			// https://github.com/docker/buildx/pull/541 | ||||||
|  | 			if d.Detail == "Blocks are not allowed here." { | ||||||
|  | 				return true | ||||||
|  | 			} | ||||||
|  | 			for r := range reserved { | ||||||
|  | 				// JSON body objects don't handle repeated blocks like HCL but | ||||||
|  | 				// reserved name attributes should be allowed when multi bodies are merged. | ||||||
|  | 				// https://github.com/hashicorp/hcl/blob/main/json/spec.md#blocks | ||||||
|  | 				if strings.HasPrefix(d.Detail, fmt.Sprintf(`Argument "%s" was already set at `, r)) { | ||||||
|  | 					return true | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return false | ||||||
|  | 		}(d); !fout { | ||||||
|  | 			fdiags = append(fdiags, d) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return fdiags | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 CrazyMax
					CrazyMax