Skip to content

Commit

Permalink
Change OCI Layout publisher to lazy create layout after build.
Browse files Browse the repository at this point in the history
When using ko with OCI Layout, Git status will always be dirty because the
layout is created before this build. This changes the layout to be created
after the build so that git will be clean. The means that any error creating
the layout won't be seen until after the build.

Signed-off-by: Jeff Mendoza <[email protected]>
  • Loading branch information
jeffmendoza committed Sep 4, 2024
1 parent 0dcace3 commit 3faa7b1
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 28 deletions.
5 changes: 1 addition & 4 deletions pkg/commands/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,10 +213,7 @@ func makePublisher(po *options.PublishOptions) (publish.Interface, error) {

publishers := []publish.Interface{}
if po.OCILayoutPath != "" {
lp, err := publish.NewLayout(po.OCILayoutPath)
if err != nil {
return nil, fmt.Errorf("failed to create LayoutPublisher for %q: %w", po.OCILayoutPath, err)
}
lp := publish.NewLayout(po.OCILayoutPath)
publishers = append(publishers, lp)
}
if po.TarballFile != "" {
Expand Down
40 changes: 24 additions & 16 deletions pkg/publish/layout.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,49 +28,57 @@ import (
)

type LayoutPublisher struct {
p layout.Path
p string
}

// NewLayout returns a new publish.Interface that saves images to an OCI Image Layout.
func NewLayout(path string) (Interface, error) {
p, err := layout.FromPath(path)
func NewLayout(p string) Interface {
return &LayoutPublisher{p}
}

func (l *LayoutPublisher) writeResult(br build.Result) (layout.Path, error) {
p, err := layout.FromPath(l.p)
if err != nil {
p, err = layout.Write(path, empty.Index)
p, err = layout.Write(l.p, empty.Index)
if err != nil {
return nil, err
return "", err
}
}
return &LayoutPublisher{p}, nil
}

func (l *LayoutPublisher) writeResult(br build.Result) error {
mt, err := br.MediaType()
if err != nil {
return err
return "", err
}

switch mt {
case types.OCIImageIndex, types.DockerManifestList:
idx, ok := br.(v1.ImageIndex)
if !ok {
return fmt.Errorf("failed to interpret result as index: %v", br)
return "", fmt.Errorf("failed to interpret result as index: %v", br)
}
return l.p.AppendIndex(idx)
if err := p.AppendIndex(idx); err != nil {
return "", err
}
return p, nil
case types.OCIManifestSchema1, types.DockerManifestSchema2:
img, ok := br.(v1.Image)
if !ok {
return fmt.Errorf("failed to interpret result as image: %v", br)
return "", fmt.Errorf("failed to interpret result as image: %v", br)
}
if err := p.AppendImage(img); err != nil {
return "", err
}
return l.p.AppendImage(img)
return p, nil
default:
return fmt.Errorf("result image media type: %s", mt)
return "", fmt.Errorf("result image media type: %s", mt)
}
}

// Publish implements publish.Interface.
func (l *LayoutPublisher) Publish(_ context.Context, br build.Result, s string) (name.Reference, error) {
log.Printf("Saving %v", s)
if err := l.writeResult(br); err != nil {
p, err := l.writeResult(br)
if err != nil {
return nil, err
}
log.Printf("Saved %v", s)
Expand All @@ -80,7 +88,7 @@ func (l *LayoutPublisher) Publish(_ context.Context, br build.Result, s string)
return nil, err
}

dig, err := name.NewDigest(fmt.Sprintf("%s@%s", l.p, h))
dig, err := name.NewDigest(fmt.Sprintf("%s@%s", p, h))
if err != nil {
return nil, err
}
Expand Down
5 changes: 1 addition & 4 deletions pkg/publish/layout_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,7 @@ func TestLayout(t *testing.T) {
}
defer os.RemoveAll(tmp)

lp, err := NewLayout(tmp)
if err != nil {
t.Errorf("NewLayout() = %v", err)
}
lp := NewLayout(tmp)
if d, err := lp.Publish(context.Background(), img, importpath); err != nil {
t.Errorf("Publish() = %v", err)
} else if !strings.HasPrefix(d.String(), tmp) {
Expand Down
5 changes: 1 addition & 4 deletions pkg/publish/multi_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,7 @@ func TestMulti(t *testing.T) {
}
defer os.RemoveAll(tmp)

lp, err := publish.NewLayout(tmp)
if err != nil {
t.Errorf("NewLayout() = %v", err)
}
lp := publish.NewLayout(tmp)

p := publish.MultiPublisher(lp, tp)
if _, err := p.Publish(context.Background(), img, importpath); err != nil {
Expand Down

0 comments on commit 3faa7b1

Please sign in to comment.