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, "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() | ||||
| 	if diags.HasErrors() { | ||||
| 		for _, d := range diags { | ||||
| 			if d.Detail != "Blocks are not allowed here." { | ||||
| 				return diags | ||||
| 			} | ||||
| 		if d := removeAttributesDiags(diags, reserved); len(d) > 0 { | ||||
| 			return d | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -514,3 +512,27 @@ func setLabel(v reflect.Value, lbl string) int { | ||||
| 	} | ||||
| 	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