Skip to content
This repository was archived by the owner on Mar 16, 2024. It is now read-only.

Commit 8dc1d9e

Browse files
authored
Merge pull request #949 from ibuildthecloud/main
Only use nested indexes for multi-arch builds
2 parents 4ba5612 + 863db11 commit 8dc1d9e

File tree

2 files changed

+71
-19
lines changed

2 files changed

+71
-19
lines changed

pkg/build/assemble.go

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/google/go-containerregistry/pkg/v1/empty"
1414
"github.com/google/go-containerregistry/pkg/v1/mutate"
1515
"github.com/google/go-containerregistry/pkg/v1/remote"
16+
"github.com/google/go-containerregistry/pkg/v1/types"
1617
)
1718

1819
func digestOnlyImages(data map[string]v1.ImageData) (map[string]v1.ImageData, error) {
@@ -55,32 +56,62 @@ func digestOnlyContainers(data map[string]v1.ContainerData) (map[string]v1.Conta
5556
return result, nil
5657
}
5758

58-
func images(data map[string]v1.ImageData, opts []remote.Option) (result []ggcrv1.ImageIndex, _ error) {
59-
for _, entry := range typed.Sorted(data) {
60-
d, err := name.NewDigest(entry.Value.Image)
61-
if err != nil {
62-
return nil, err
63-
}
59+
func digestToIndexAddendum(ref string, opts []remote.Option) (*mutate.IndexAddendum, error) {
60+
d, err := name.NewDigest(ref)
61+
if err != nil {
62+
return nil, err
63+
}
64+
descriptor, err := remote.Head(d, opts...)
65+
if err != nil {
66+
return nil, err
67+
}
68+
69+
if descriptor.MediaType.IsIndex() {
6470
img, err := remote.Index(d, opts...)
6571
if err != nil {
6672
return nil, err
6773
}
68-
result = append(result, img)
74+
return &mutate.IndexAddendum{
75+
Add: img,
76+
}, nil
6977
}
70-
return
78+
79+
img, err := remote.Image(d, opts...)
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
platform, err := imagePlatform(img)
85+
if err != nil {
86+
return nil, err
87+
}
88+
89+
return &mutate.IndexAddendum{
90+
Add: img,
91+
Descriptor: ggcrv1.Descriptor{
92+
Platform: platform,
93+
},
94+
}, nil
7195
}
7296

73-
func containerImages(data map[string]v1.ContainerData, opts []remote.Option) (result []ggcrv1.ImageIndex, _ error) {
97+
func images(data map[string]v1.ImageData, opts []remote.Option) (result []mutate.IndexAddendum, _ error) {
7498
for _, entry := range typed.Sorted(data) {
75-
d, err := name.NewDigest(entry.Value.Image)
99+
add, err := digestToIndexAddendum(entry.Value.Image, opts)
76100
if err != nil {
77101
return nil, err
78102
}
79-
img, err := remote.Index(d, opts...)
103+
result = append(result, *add)
104+
}
105+
return
106+
}
107+
108+
func containerImages(data map[string]v1.ContainerData, opts []remote.Option) (result []mutate.IndexAddendum, _ error) {
109+
for _, entry := range typed.Sorted(data) {
110+
add, err := digestToIndexAddendum(entry.Value.Image, opts)
80111
if err != nil {
81112
return nil, err
82113
}
83-
result = append(result, img)
114+
result = append(result, *add)
84115

85116
sidecarImages, err := images(entry.Value.Sidecars, opts)
86117
if err != nil {
@@ -108,7 +139,7 @@ func digestOnly(imageData v1.ImagesData) (result v1.ImagesData, err error) {
108139
return
109140
}
110141

111-
func allImages(data v1.ImagesData, opts []remote.Option) (result []ggcrv1.ImageIndex, _ error) {
142+
func allImages(data v1.ImagesData, opts []remote.Option) (result []mutate.IndexAddendum, _ error) {
112143
remoteImages, err := containerImages(data.Containers, opts)
113144
if err != nil {
114145
return nil, err
@@ -130,6 +161,19 @@ func allImages(data v1.ImagesData, opts []remote.Option) (result []ggcrv1.ImageI
130161
return
131162
}
132163

164+
func imagePlatform(img ggcrv1.Image) (*ggcrv1.Platform, error) {
165+
config, err := img.ConfigFile()
166+
if err != nil {
167+
return nil, err
168+
}
169+
return &ggcrv1.Platform{
170+
Architecture: config.Architecture,
171+
OS: config.OS,
172+
OSVersion: config.OSVersion,
173+
Variant: config.Variant,
174+
}, nil
175+
}
176+
133177
func createAppManifest(ctx context.Context, c client.Client, ref string, data v1.ImagesData, fullDigest bool) (string, error) {
134178
d, err := name.NewDigest(ref)
135179
if err != nil {
@@ -146,20 +190,24 @@ func createAppManifest(ctx context.Context, c client.Client, ref string, data v1
146190
return "", err
147191
}
148192

149-
index := mutate.AppendManifests(empty.Index, mutate.IndexAddendum{
193+
platform, err := imagePlatform(appImage)
194+
if err != nil {
195+
return "", err
196+
}
197+
198+
index := mutate.AppendManifests(mutate.IndexMediaType(empty.Index, types.DockerManifestList), mutate.IndexAddendum{
150199
Add: appImage,
200+
Descriptor: ggcrv1.Descriptor{
201+
Platform: platform,
202+
},
151203
})
152204

153205
images, err := allImages(data, opts)
154206
if err != nil {
155207
return "", err
156208
}
157209

158-
for _, image := range images {
159-
index = mutate.AppendManifests(index, mutate.IndexAddendum{
160-
Add: image,
161-
})
162-
}
210+
index = mutate.AppendManifests(index, images...)
163211

164212
h, err := index.Digest()
165213
if err != nil {

pkg/build/build.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,10 @@ func buildImageAndManifest(ctx context.Context, c client.Client, cwd string, pla
290290
return "", err
291291
}
292292

293+
if len(ids) == 1 {
294+
return ids[0], nil
295+
}
296+
293297
return createManifest(ctx, c, ids, platforms)
294298
}
295299

0 commit comments

Comments
 (0)