From 5c169dd87864eb0d7db5c387cfeffe2cd8082523 Mon Sep 17 00:00:00 2001 From: Arran Walker Date: Thu, 19 Dec 2024 23:57:42 +0000 Subject: [PATCH] bake: fix context from target platform matching Signed-off-by: Arran Walker --- bake/bake.go | 16 +++++----------- bake/bake_test.go | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/bake/bake.go b/bake/bake.go index f7b232868a5..31383cf9020 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -9,7 +9,6 @@ import ( "path/filepath" "regexp" "slices" - "sort" "strconv" "strings" "time" @@ -515,8 +514,8 @@ func (c Config) loadLinks(name string, t *Target, m map[string]*Target, o map[st } if len(t.Platforms) > 1 && len(t2.Platforms) > 1 { - if !sliceEqual(t.Platforms, t2.Platforms) { - return errors.Errorf("target %s can't be used by %s because it is defined for different platforms %v and %v", target, name, t2.Platforms, t.Platforms) + if !isSubset(t.Platforms, t2.Platforms) { + return errors.Errorf("target %s can't be used by %s because its platforms %v are not a subset of %v", target, name, t.Platforms, t2.Platforms) } } } @@ -1516,14 +1515,9 @@ func sanitizeTargetName(target string) string { return strings.ReplaceAll(target, ".", "_") } -func sliceEqual(s1, s2 []string) bool { - if len(s1) != len(s2) { - return false - } - sort.Strings(s1) - sort.Strings(s2) - for i := range s1 { - if s1[i] != s2[i] { +func isSubset(s1, s2 []string) bool { + for _, item := range s1 { + if !slices.Contains(s2, item) { return false } } diff --git a/bake/bake_test.go b/bake/bake_test.go index 64e0b85dbe3..114a6932d28 100644 --- a/bake/bake_test.go +++ b/bake/bake_test.go @@ -910,7 +910,28 @@ func TestReadContextFromTargetInvalidPlatforms(t *testing.T) { } _, _, err := ReadTargets(ctx, []File{fp}, []string{"app"}, []string{}, nil, &EntitlementConf{}) require.Error(t, err) - require.Contains(t, err.Error(), "defined for different platforms") + require.Contains(t, err.Error(), "are not a subset of") +} + +func TestReadContextFromTargetSubsetPlatforms(t *testing.T) { + ctx := context.TODO() + fp := File{ + Name: "docker-bake.hcl", + Data: []byte(` + target "mid" { + output = ["foo"] + platforms = ["linux/amd64", "linux/riscv64", "linux/arm64"] + } + target "app" { + contexts = { + bar: "target:mid" + } + platforms = ["linux/amd64", "linux/arm64"] + } + `), + } + _, _, err := ReadTargets(ctx, []File{fp}, []string{"app"}, []string{}, nil, &EntitlementConf{}) + require.NoError(t, err) } func TestReadTargetsDefault(t *testing.T) {