mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 09:17:49 +08:00
bake: merge targets from multiple JSON files
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
parent
adafbe0e65
commit
c317ca1e95
@ -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
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user