github.com/buildpack/pack@v0.5.0/rebase.go (about)

     1  package pack
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/buildpack/lifecycle"
     7  	"github.com/buildpack/lifecycle/metadata"
     8  	"github.com/pkg/errors"
     9  
    10  	"github.com/buildpack/pack/builder"
    11  	"github.com/buildpack/pack/style"
    12  )
    13  
    14  type RebaseOptions struct {
    15  	RepoName          string
    16  	Publish           bool
    17  	SkipPull          bool
    18  	RunImage          string
    19  	AdditionalMirrors map[string][]string
    20  }
    21  
    22  func (c *Client) Rebase(ctx context.Context, opts RebaseOptions) error {
    23  	imageRef, err := c.parseTagReference(opts.RepoName)
    24  	if err != nil {
    25  		return errors.Wrapf(err, "invalid image name '%s'", opts.RepoName)
    26  	}
    27  
    28  	appImage, err := c.imageFetcher.Fetch(ctx, opts.RepoName, !opts.Publish, !opts.SkipPull)
    29  	if err != nil {
    30  		return err
    31  	}
    32  
    33  	md, err := metadata.GetLayersMetadata(appImage)
    34  	if err != nil {
    35  		return err
    36  	}
    37  
    38  	runImageName := c.resolveRunImage(
    39  		opts.RunImage,
    40  		imageRef.Context().RegistryStr(),
    41  		builder.StackMetadata{
    42  			RunImage: builder.RunImageMetadata{
    43  				Image:   md.Stack.RunImage.Image,
    44  				Mirrors: md.Stack.RunImage.Mirrors,
    45  			},
    46  		},
    47  		opts.AdditionalMirrors)
    48  
    49  	if runImageName == "" {
    50  		return errors.New("run image must be specified")
    51  	}
    52  
    53  	baseImage, err := c.imageFetcher.Fetch(ctx, runImageName, !opts.Publish, !opts.SkipPull)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	c.logger.Infof("Rebasing %s on run image %s", style.Symbol(appImage.Name()), style.Symbol(baseImage.Name()))
    59  	rebaser := &lifecycle.Rebaser{Logger: c.logger}
    60  	err = rebaser.Rebase(appImage, baseImage, nil)
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	appImageIdentifier, err := appImage.Identifier()
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	c.logger.Infof("Rebased Image: %s", style.Symbol(appImageIdentifier.String()))
    71  	return nil
    72  }