Skip to content

Commit 3f1aaa6

Browse files
tonistiigijsternberg
authored andcommitted
build: fix multiple named contexts pointing to same bake target
Contexts using target: schema are replaced by input: pointing to previous build result before build request is sent. Currently this replacement did not work if multiple contexts pointed to the same target name. Signed-off-by: Tonis Tiigi <[email protected]> (cherry picked from commit f8c6a97)
1 parent f6830f3 commit 3f1aaa6

1 file changed

Lines changed: 37 additions & 34 deletions

File tree

build/build.go

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -784,11 +784,11 @@ func calculateChildTargets(reqs map[string][]*reqForNode, opt map[string]Options
784784
}
785785

786786
func waitContextDeps(ctx context.Context, index int, results *waitmap.Map, so *client.SolveOpt) error {
787-
m := map[string]string{}
787+
m := map[string][]string{}
788788
for k, v := range so.FrontendAttrs {
789789
if strings.HasPrefix(k, "context:") && strings.HasPrefix(v, "target:") {
790790
target := resultKey(index, strings.TrimPrefix(v, "target:"))
791-
m[target] = k
791+
m[target] = append(m[target], k)
792792
}
793793
}
794794
if len(m) == 0 {
@@ -803,7 +803,7 @@ func waitContextDeps(ctx context.Context, index int, results *waitmap.Map, so *c
803803
return err
804804
}
805805

806-
for k, v := range m {
806+
for k, contexts := range m {
807807
r, ok := res[k]
808808
if !ok {
809809
continue
@@ -818,51 +818,54 @@ func waitContextDeps(ctx context.Context, index int, results *waitmap.Map, so *c
818818
if so.FrontendInputs == nil {
819819
so.FrontendInputs = map[string]llb.State{}
820820
}
821-
if len(rr.Refs) > 0 {
822-
for platform, r := range rr.Refs {
823-
st, err := r.ToState()
821+
822+
for _, v := range contexts {
823+
if len(rr.Refs) > 0 {
824+
for platform, r := range rr.Refs {
825+
st, err := r.ToState()
826+
if err != nil {
827+
return err
828+
}
829+
so.FrontendInputs[k+"::"+platform] = st
830+
so.FrontendAttrs[v+"::"+platform] = "input:" + k + "::" + platform
831+
metadata := make(map[string][]byte)
832+
if dt, ok := rr.Metadata[exptypes.ExporterImageConfigKey+"/"+platform]; ok {
833+
metadata[exptypes.ExporterImageConfigKey] = dt
834+
}
835+
if dt, ok := rr.Metadata["containerimage.buildinfo/"+platform]; ok {
836+
metadata["containerimage.buildinfo"] = dt
837+
}
838+
if len(metadata) > 0 {
839+
dt, err := json.Marshal(metadata)
840+
if err != nil {
841+
return err
842+
}
843+
so.FrontendAttrs["input-metadata:"+k+"::"+platform] = string(dt)
844+
}
845+
}
846+
delete(so.FrontendAttrs, v)
847+
}
848+
if rr.Ref != nil {
849+
st, err := rr.Ref.ToState()
824850
if err != nil {
825851
return err
826852
}
827-
so.FrontendInputs[k+"::"+platform] = st
828-
so.FrontendAttrs[v+"::"+platform] = "input:" + k + "::" + platform
853+
so.FrontendInputs[k] = st
854+
so.FrontendAttrs[v] = "input:" + k
829855
metadata := make(map[string][]byte)
830-
if dt, ok := rr.Metadata[exptypes.ExporterImageConfigKey+"/"+platform]; ok {
856+
if dt, ok := rr.Metadata[exptypes.ExporterImageConfigKey]; ok {
831857
metadata[exptypes.ExporterImageConfigKey] = dt
832858
}
833-
if dt, ok := rr.Metadata["containerimage.buildinfo/"+platform]; ok {
859+
if dt, ok := rr.Metadata["containerimage.buildinfo"]; ok {
834860
metadata["containerimage.buildinfo"] = dt
835861
}
836862
if len(metadata) > 0 {
837863
dt, err := json.Marshal(metadata)
838864
if err != nil {
839865
return err
840866
}
841-
so.FrontendAttrs["input-metadata:"+k+"::"+platform] = string(dt)
842-
}
843-
}
844-
delete(so.FrontendAttrs, v)
845-
}
846-
if rr.Ref != nil {
847-
st, err := rr.Ref.ToState()
848-
if err != nil {
849-
return err
850-
}
851-
so.FrontendInputs[k] = st
852-
so.FrontendAttrs[v] = "input:" + k
853-
metadata := make(map[string][]byte)
854-
if dt, ok := rr.Metadata[exptypes.ExporterImageConfigKey]; ok {
855-
metadata[exptypes.ExporterImageConfigKey] = dt
856-
}
857-
if dt, ok := rr.Metadata["containerimage.buildinfo"]; ok {
858-
metadata["containerimage.buildinfo"] = dt
859-
}
860-
if len(metadata) > 0 {
861-
dt, err := json.Marshal(metadata)
862-
if err != nil {
863-
return err
867+
so.FrontendAttrs["input-metadata:"+k] = string(dt)
864868
}
865-
so.FrontendAttrs["input-metadata:"+k] = string(dt)
866869
}
867870
}
868871
}

0 commit comments

Comments
 (0)