Skip to content

Commit

Permalink
add base labels
Browse files Browse the repository at this point in the history
  • Loading branch information
dskiff committed Apr 27, 2024
1 parent a0068a3 commit 5ce6f1b
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 11 deletions.
32 changes: 27 additions & 5 deletions pkg/build/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,44 @@ import (
"github.com/google/go-containerregistry/pkg/v1/remote"
)

func getBaseImage(ctx BuildContext, baseRef string, platform Platform, keychain authn.Keychain) (v1.Image, error) {
type BaseImageMetadata struct {
name string
imageDigest string
}

func getBaseImage(ctx BuildContext, baseRef string, platform Platform, keychain authn.Keychain) (v1.Image, BaseImageMetadata, error) {
if baseRef == "scratch" {
return empty.Image, nil
return empty.Image, BaseImageMetadata{
name: "scratch",
}, nil
}

ref, index, err := fetchImageIndex(ctx, baseRef, keychain)
if err != nil {
return nil, fmt.Errorf("failed to retrieve base image index: %w", err)
return nil, BaseImageMetadata{}, fmt.Errorf("failed to retrieve base image index: %w", err)
}
baseDigest, err := index.Digest()
if err != nil {
return nil, fmt.Errorf("failed to retrieve base image digest: %w", err)
return nil, BaseImageMetadata{}, fmt.Errorf("failed to retrieve base image index digest: %w", err)
}
log.Println("Using base image:", ref.Context().Name()+"@"+baseDigest.String())

return getImageForPlatform(index, platform)
img, err := getImageForPlatform(index, platform)
if err != nil {
return nil, BaseImageMetadata{}, fmt.Errorf("failed to retrieve base image for platform: %w", err)
}

imgDigest, err := img.Digest()
if err != nil {
return nil, BaseImageMetadata{}, fmt.Errorf("failed to retrieve base image digest: %w", err)
}

metadata := BaseImageMetadata{
name: ref.Context().Name(),
imageDigest: imgDigest.String(),
}

return img, metadata, nil
}

func fetchImageIndex(ctx BuildContext, src string, keychain authn.Keychain) (name.Reference, v1.ImageIndex, error) {
Expand Down
3 changes: 2 additions & 1 deletion pkg/build/layers.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"github.com/google/go-containerregistry/pkg/v1/tarball"
)

var unixEpoch = time.Unix(0, 0)

func createLayerFromFolder(ctx BuildContext, layer BuildSpecInjectLayer, opts ...tarball.LayerOption) (v1.Layer, error) {
tarPath, err := createTarFromFolder(ctx, layer.SourcePath, layer.DestinationPath)
if err != nil {
Expand All @@ -31,7 +33,6 @@ func createTarFromFolder(ctx BuildContext, srcPath, dstPath string) (string, err
writer := tar.NewWriter(tarFile)
defer writer.Close()

unixEpoch := time.Unix(0, 0)
err = filepath.Walk(srcPath, func(file string, fi os.FileInfo, err error) error {
if err != nil {
return err
Expand Down
14 changes: 9 additions & 5 deletions pkg/build/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import (
"context"
"fmt"
"strings"
"time"

"github.com/google/go-containerregistry/pkg/authn"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/mutate"
"github.com/google/go-containerregistry/pkg/v1/tarball"
"github.com/google/go-containerregistry/pkg/v1/types"
specsv1 "github.com/opencontainers/image-spec/specs-go/v1"
)

type TargetType int
Expand Down Expand Up @@ -59,7 +59,7 @@ type BuildContext struct {
}

func Build(ctx BuildContext, spec BuildSpec) error {
baseImage, err := getBaseImage(ctx, spec.BaseRef, spec.InjectLayer.Platform, ctx.Keychain)
baseImage, baseMetadata, err := getBaseImage(ctx, spec.BaseRef, spec.InjectLayer.Platform, ctx.Keychain)
if err != nil {
return fmt.Errorf("failed to retrieve base image: %w", err)
}
Expand All @@ -74,7 +74,6 @@ func Build(ctx BuildContext, spec BuildSpec) error {
return fmt.Errorf("failed to create layer from source: %w", err)
}

unixEpoch := time.Unix(0, 0)
newImage, err := mutate.Append(baseImage, mutate.Addendum{
Layer: newLayer,
MediaType: mediaType,
Expand All @@ -88,15 +87,15 @@ func Build(ctx BuildContext, spec BuildSpec) error {
return fmt.Errorf("failed to append layer to base image: %w", err)
}

newImage, err = mutateConfig(newImage, spec)
newImage, err = mutateConfig(newImage, spec, baseMetadata)
if err != nil {
return fmt.Errorf("failed to mutate config: %w", err)
}

return publish(ctx, newImage, spec.Target)
}

func mutateConfig(img v1.Image, spec BuildSpec) (v1.Image, error) {
func mutateConfig(img v1.Image, spec BuildSpec, metadata BaseImageMetadata) (v1.Image, error) {
imgCfg, err := img.ConfigFile()
if err != nil {
return nil, err
Expand All @@ -106,8 +105,13 @@ func mutateConfig(img v1.Image, spec BuildSpec) (v1.Image, error) {
imgCfg.Config.WorkingDir = spec.InjectLayer.DestinationPath
imgCfg.Config.Entrypoint = []string{spec.InjectLayer.Entrypoint}
imgCfg.Config.Cmd = nil

imgCfg.Created = v1.Time{Time: unixEpoch}
imgCfg.Author = spec.Author

imgCfg.Config.Labels[specsv1.AnnotationBaseImageName] = metadata.name
imgCfg.Config.Labels[specsv1.AnnotationBaseImageDigest] = metadata.imageDigest

return mutate.ConfigFile(img, imgCfg)
}

Expand Down

0 comments on commit 5ce6f1b

Please sign in to comment.