Skip to content

Commit 66a4f32

Browse files
authored
Merge pull request #1225 from YousefHaggyHeroku/main
Expose functionality to download buildpacks
2 parents 4c340df + 1d9b1b8 commit 66a4f32

13 files changed

+669
-500
lines changed

build.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -737,15 +737,15 @@ func (c *Client) processBuildpacks(ctx context.Context, builderImage imgutil.Ima
737737
order = appendBuildpackToOrder(order, mainBP.Descriptor().Info)
738738
case buildpack.PackageLocator:
739739
imageName := buildpack.ParsePackageLocator(bp)
740-
mainBP, depBPs, err := extractPackagedBuildpacks(ctx, imageName, c.imageFetcher, publish, pullPolicy)
740+
mainBP, depBPs, err := extractPackagedBuildpacks(ctx, imageName, c.imageFetcher, image.FetchOptions{Daemon: !publish, PullPolicy: pullPolicy})
741741
if err != nil {
742742
return fetchedBPs, order, errors.Wrapf(err, "creating from buildpackage %s", style.Symbol(bp))
743743
}
744744

745745
fetchedBPs = append(append(fetchedBPs, mainBP), depBPs...)
746746
order = appendBuildpackToOrder(order, mainBP.Descriptor().Info)
747747
case buildpack.RegistryLocator:
748-
registryCache, err := c.getRegistry(c.logger, registry)
748+
registryCache, err := getRegistry(c.logger, registry)
749749
if err != nil {
750750
return fetchedBPs, order, errors.Wrapf(err, "invalid registry '%s'", registry)
751751
}
@@ -755,7 +755,7 @@ func (c *Client) processBuildpacks(ctx context.Context, builderImage imgutil.Ima
755755
return fetchedBPs, order, errors.Wrapf(err, "locating in registry %s", style.Symbol(bp))
756756
}
757757

758-
mainBP, depBPs, err := extractPackagedBuildpacks(ctx, registryBp.Address, c.imageFetcher, publish, pullPolicy)
758+
mainBP, depBPs, err := extractPackagedBuildpacks(ctx, registryBp.Address, c.imageFetcher, image.FetchOptions{Daemon: !publish, PullPolicy: pullPolicy})
759759
if err != nil {
760760
return fetchedBPs, order, errors.Wrapf(err, "extracting from registry %s", style.Symbol(bp))
761761
}

buildpack_downloader.go

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package pack
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/pkg/errors"
8+
9+
"github.com/buildpacks/pack/config"
10+
"github.com/buildpacks/pack/internal/buildpack"
11+
"github.com/buildpacks/pack/internal/dist"
12+
"github.com/buildpacks/pack/internal/image"
13+
"github.com/buildpacks/pack/internal/paths"
14+
"github.com/buildpacks/pack/internal/style"
15+
"github.com/buildpacks/pack/logging"
16+
)
17+
18+
type buildpackDownloader struct {
19+
logger logging.Logger
20+
imageFetcher ImageFetcher
21+
downloader Downloader
22+
}
23+
24+
func NewBuildpackDownloader(logger logging.Logger, imageFetcher ImageFetcher, downloader Downloader) *buildpackDownloader { //nolint:golint,gosimple
25+
return &buildpackDownloader{
26+
logger: logger,
27+
imageFetcher: imageFetcher,
28+
downloader: downloader,
29+
}
30+
}
31+
32+
type BuildpackDownloadOptions struct {
33+
// Buildpack registry name. Defines where all registry buildpacks will be pulled from.
34+
RegistryName string
35+
36+
// The base directory to use to resolve relative assets
37+
RelativeBaseDir string
38+
39+
// The OS of the builder image
40+
ImageOS string
41+
42+
// Deprecated, the older alternative to buildpack URI
43+
ImageName string
44+
45+
Daemon bool
46+
47+
PullPolicy config.PullPolicy
48+
}
49+
50+
func (c *buildpackDownloader) Download(ctx context.Context, buildpackURI string, opts BuildpackDownloadOptions) (dist.Buildpack, []dist.Buildpack, error) {
51+
var err error
52+
var locatorType buildpack.LocatorType
53+
if buildpackURI == "" && opts.ImageName != "" {
54+
c.logger.Warn("The 'image' key is deprecated. Use 'uri=\"docker://...\"' instead.")
55+
buildpackURI = opts.ImageName
56+
locatorType = buildpack.PackageLocator
57+
} else {
58+
locatorType, err = buildpack.GetLocatorType(buildpackURI, opts.RelativeBaseDir, []dist.BuildpackInfo{})
59+
if err != nil {
60+
return nil, nil, err
61+
}
62+
}
63+
64+
var mainBP dist.Buildpack
65+
var depBPs []dist.Buildpack
66+
switch locatorType {
67+
case buildpack.PackageLocator:
68+
imageName := buildpack.ParsePackageLocator(buildpackURI)
69+
c.logger.Debugf("Downloading buildpack from image: %s", style.Symbol(imageName))
70+
mainBP, depBPs, err = extractPackagedBuildpacks(ctx, imageName, c.imageFetcher, image.FetchOptions{Daemon: opts.Daemon, PullPolicy: opts.PullPolicy})
71+
if err != nil {
72+
return nil, nil, errors.Wrapf(err, "extracting from registry %s", style.Symbol(buildpackURI))
73+
}
74+
case buildpack.RegistryLocator:
75+
c.logger.Debugf("Downloading buildpack from registry: %s", style.Symbol(buildpackURI))
76+
registryCache, err := getRegistry(c.logger, opts.RegistryName)
77+
if err != nil {
78+
return nil, nil, errors.Wrapf(err, "invalid registry '%s'", opts.RegistryName)
79+
}
80+
81+
registryBp, err := registryCache.LocateBuildpack(buildpackURI)
82+
if err != nil {
83+
return nil, nil, errors.Wrapf(err, "locating in registry %s", style.Symbol(buildpackURI))
84+
}
85+
86+
mainBP, depBPs, err = extractPackagedBuildpacks(ctx, registryBp.Address, c.imageFetcher, image.FetchOptions{Daemon: opts.Daemon, PullPolicy: opts.PullPolicy})
87+
if err != nil {
88+
return nil, nil, errors.Wrapf(err, "extracting from registry %s", style.Symbol(buildpackURI))
89+
}
90+
case buildpack.URILocator:
91+
buildpackURI, err = paths.FilePathToURI(buildpackURI, opts.RelativeBaseDir)
92+
if err != nil {
93+
return nil, nil, errors.Wrapf(err, "making absolute: %s", style.Symbol(buildpackURI))
94+
}
95+
96+
c.logger.Debugf("Downloading buildpack from URI: %s", style.Symbol(buildpackURI))
97+
98+
blob, err := c.downloader.Download(ctx, buildpackURI)
99+
if err != nil {
100+
return nil, nil, errors.Wrapf(err, "downloading buildpack from %s", style.Symbol(buildpackURI))
101+
}
102+
103+
mainBP, depBPs, err = decomposeBuildpack(blob, opts.ImageOS)
104+
if err != nil {
105+
return nil, nil, errors.Wrapf(err, "extracting from %s", style.Symbol(buildpackURI))
106+
}
107+
default:
108+
return nil, nil, fmt.Errorf("error reading %s: invalid locator: %s", buildpackURI, locatorType)
109+
}
110+
return mainBP, depBPs, nil
111+
}

0 commit comments

Comments
 (0)