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

Commit

Permalink
Merge pull request #949 from ibuildthecloud/main
Browse files Browse the repository at this point in the history
Only use nested indexes for multi-arch builds
  • Loading branch information
cjellick authored Nov 30, 2022
2 parents 4ba5612 + 863db11 commit 8dc1d9e
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 19 deletions.
86 changes: 67 additions & 19 deletions pkg/build/assemble.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/google/go-containerregistry/pkg/v1/empty"
"github.com/google/go-containerregistry/pkg/v1/mutate"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/types"
)

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

func images(data map[string]v1.ImageData, opts []remote.Option) (result []ggcrv1.ImageIndex, _ error) {
for _, entry := range typed.Sorted(data) {
d, err := name.NewDigest(entry.Value.Image)
if err != nil {
return nil, err
}
func digestToIndexAddendum(ref string, opts []remote.Option) (*mutate.IndexAddendum, error) {
d, err := name.NewDigest(ref)
if err != nil {
return nil, err
}
descriptor, err := remote.Head(d, opts...)
if err != nil {
return nil, err
}

if descriptor.MediaType.IsIndex() {
img, err := remote.Index(d, opts...)
if err != nil {
return nil, err
}
result = append(result, img)
return &mutate.IndexAddendum{
Add: img,
}, nil
}
return

img, err := remote.Image(d, opts...)
if err != nil {
return nil, err
}

platform, err := imagePlatform(img)
if err != nil {
return nil, err
}

return &mutate.IndexAddendum{
Add: img,
Descriptor: ggcrv1.Descriptor{
Platform: platform,
},
}, nil
}

func containerImages(data map[string]v1.ContainerData, opts []remote.Option) (result []ggcrv1.ImageIndex, _ error) {
func images(data map[string]v1.ImageData, opts []remote.Option) (result []mutate.IndexAddendum, _ error) {
for _, entry := range typed.Sorted(data) {
d, err := name.NewDigest(entry.Value.Image)
add, err := digestToIndexAddendum(entry.Value.Image, opts)
if err != nil {
return nil, err
}
img, err := remote.Index(d, opts...)
result = append(result, *add)
}
return
}

func containerImages(data map[string]v1.ContainerData, opts []remote.Option) (result []mutate.IndexAddendum, _ error) {
for _, entry := range typed.Sorted(data) {
add, err := digestToIndexAddendum(entry.Value.Image, opts)
if err != nil {
return nil, err
}
result = append(result, img)
result = append(result, *add)

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

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

func imagePlatform(img ggcrv1.Image) (*ggcrv1.Platform, error) {
config, err := img.ConfigFile()
if err != nil {
return nil, err
}
return &ggcrv1.Platform{
Architecture: config.Architecture,
OS: config.OS,
OSVersion: config.OSVersion,
Variant: config.Variant,
}, nil
}

func createAppManifest(ctx context.Context, c client.Client, ref string, data v1.ImagesData, fullDigest bool) (string, error) {
d, err := name.NewDigest(ref)
if err != nil {
Expand All @@ -146,20 +190,24 @@ func createAppManifest(ctx context.Context, c client.Client, ref string, data v1
return "", err
}

index := mutate.AppendManifests(empty.Index, mutate.IndexAddendum{
platform, err := imagePlatform(appImage)
if err != nil {
return "", err
}

index := mutate.AppendManifests(mutate.IndexMediaType(empty.Index, types.DockerManifestList), mutate.IndexAddendum{
Add: appImage,
Descriptor: ggcrv1.Descriptor{
Platform: platform,
},
})

images, err := allImages(data, opts)
if err != nil {
return "", err
}

for _, image := range images {
index = mutate.AppendManifests(index, mutate.IndexAddendum{
Add: image,
})
}
index = mutate.AppendManifests(index, images...)

h, err := index.Digest()
if err != nil {
Expand Down
4 changes: 4 additions & 0 deletions pkg/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,10 @@ func buildImageAndManifest(ctx context.Context, c client.Client, cwd string, pla
return "", err
}

if len(ids) == 1 {
return ids[0], nil
}

return createManifest(ctx, c, ids, platforms)
}

Expand Down

0 comments on commit 8dc1d9e

Please sign in to comment.