Skip to content

Commit

Permalink
Merge branch 'main' into 1799-pack-inspect
Browse files Browse the repository at this point in the history
  • Loading branch information
natalieparellano authored Aug 4, 2023
2 parents fe499fb + a90f6fb commit e53da8e
Show file tree
Hide file tree
Showing 12 changed files with 248 additions and 0 deletions.
37 changes: 37 additions & 0 deletions acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1453,6 +1453,43 @@ func testAcceptance(
})
})

when("the argument is meta-buildpack directory", func() {
var tmpDir string

it.Before(func() {
var err error
tmpDir, err = os.MkdirTemp("", "folder-buildpack-tests-")
assert.Nil(err)
})

it.After(func() {
_ = os.RemoveAll(tmpDir)
})

it("adds the buildpacks to the builder and runs it", func() {
h.SkipIf(t, runtime.GOOS == "windows", "buildpack directories not supported on windows")
// This only works if pack is new, therefore skip if pack is old
h.SkipIf(t, !pack.SupportsFeature(invoke.MetaBuildpackFolder), "")

buildpackManager.PrepareBuildModules(tmpDir, buildpacks.MetaBpFolder)
buildpackManager.PrepareBuildModules(tmpDir, buildpacks.MetaBpDependency)

output := pack.RunSuccessfully(
"build", repoName,
"-p", filepath.Join("testdata", "mock_app"),
"--buildpack", buildpacks.MetaBpFolder.FullPathIn(tmpDir),
)

assertOutput := assertions.NewOutputAssertionManager(t, output)
assertOutput.ReportsAddingBuildpack("local/meta-bp", "local-meta-bp-version")
assertOutput.ReportsAddingBuildpack("local/meta-bp-dep", "local-meta-bp-version")
assertOutput.ReportsSuccessfulImageBuild(repoName)

assertBuildpackOutput := assertions.NewTestBuildpackOutputAssertionManager(t, output)
assertBuildpackOutput.ReportsBuildStep("Local Meta-Buildpack Dependency")
})
})

when("the argument is a buildpackage image", func() {
var (
tmpDir string
Expand Down
2 changes: 2 additions & 0 deletions acceptance/buildpacks/folder_buildpack.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,6 @@ var (
BpFolderSimpleLayersParent = folderBuildModule{name: "simple-layers-parent-buildpack"}
BpFolderSimpleLayers = folderBuildModule{name: "simple-layers-buildpack"}
ExtFolderSimpleLayers = folderBuildModule{name: "simple-layers-extension"}
MetaBpFolder = folderBuildModule{name: "meta-buildpack"}
MetaBpDependency = folderBuildModule{name: "meta-buildpack-dependency"}
)
4 changes: 4 additions & 0 deletions acceptance/invoke/pack.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ const (
StackValidation
ForceRebase
BuildpackFlatten
MetaBuildpackFolder
)

var featureTests = map[Feature]func(i *PackInvoker) bool{
Expand All @@ -258,6 +259,9 @@ var featureTests = map[Feature]func(i *PackInvoker) bool{
BuildpackFlatten: func(i *PackInvoker) bool {
return i.atLeast("v0.30.0")
},
MetaBuildpackFolder: func(i *PackInvoker) bool {
return i.atLeast("v0.30.0")
},
}

func (i *PackInvoker) SupportsFeature(f Feature) bool {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env bash

echo "---> Build: Local Meta-Buildpack Dependency"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@echo off

echo ---- Build: Local Meta-Buildpack Dependency
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env bash

## always detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
:: always detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
api = "0.2"

[buildpack]
id = "local/meta-bp-dep"
version = "local-meta-bp-version"
name = "Local Meta-Buildpack Dependency"

[[stacks]]
id = "pack.test.stack"
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
api = "0.2"

[buildpack]
id = "local/meta-bp"
version = "local-meta-bp-version"
name = "Local Meta-Buildpack"

[[order]]
[[order.group]]
id = "local/meta-bp-dep"
version = "local-meta-bp-version"
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[buildpack]
uri = "."

[[dependencies]]
uri = "../meta-buildpack-dependency"
37 changes: 37 additions & 0 deletions pkg/client/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"strings"
"time"

"github.com/buildpacks/pack/buildpackage"

"github.com/Masterminds/semver"
"github.com/buildpacks/imgutil"
"github.com/buildpacks/imgutil/layout"
Expand Down Expand Up @@ -1042,10 +1044,45 @@ func (c *Client) fetchBuildpack(ctx context.Context, bp string, relativeBaseDir
fetchedBPs = append(append(fetchedBPs, mainBP), depBPs...)
mainBPInfo := mainBP.Descriptor().Info()
moduleInfo = &mainBPInfo

packageCfgPath := filepath.Join(bp, "package.toml")
_, err = os.Stat(packageCfgPath)
if err == nil {
fetchedDeps, err := c.fetchBuildpackDependencies(ctx, bp, packageCfgPath, downloadOptions)
if err != nil {
return nil, nil, errors.Wrapf(err, "fetching package.toml dependencies (path=%s)", style.Symbol(packageCfgPath))
}
fetchedBPs = append(fetchedBPs, fetchedDeps...)
}
}
return fetchedBPs, moduleInfo, nil
}

func (c *Client) fetchBuildpackDependencies(ctx context.Context, bp string, packageCfgPath string, downloadOptions buildpack.DownloadOptions) ([]buildpack.BuildModule, error) {
packageReader := buildpackage.NewConfigReader()
packageCfg, err := packageReader.Read(packageCfgPath)
if err == nil {
fetchedBPs := []buildpack.BuildModule{}
for _, dep := range packageCfg.Dependencies {
mainBP, deps, err := c.buildpackDownloader.Download(ctx, dep.URI, buildpack.DownloadOptions{
RegistryName: downloadOptions.RegistryName,
ImageOS: downloadOptions.ImageOS,
Daemon: downloadOptions.Daemon,
PullPolicy: downloadOptions.PullPolicy,
RelativeBaseDir: filepath.Join(bp, packageCfg.Buildpack.URI),
})

if err != nil {
return nil, errors.Wrapf(err, "fetching dependencies (uri=%s,image=%s)", style.Symbol(dep.URI), style.Symbol(dep.ImageName))
}

fetchedBPs = append(append(fetchedBPs, mainBP), deps...)
}
return fetchedBPs, nil
}
return nil, err
}

func getBuildpackLocator(bp projectTypes.Buildpack, stackID string) (string, error) {
switch {
case bp.ID != "" && bp.Script.Inline != "" && bp.URI == "":
Expand Down
132 changes: 132 additions & 0 deletions pkg/client/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -988,6 +988,138 @@ func testBuild(t *testing.T, when spec.G, it spec.S) {
})
})

when("meta-buildpack folder is used", func() {
it("resolves buildpack", func() {
metaBuildpackFolder := filepath.Join(tmpDir, "meta-buildpack")
err := os.Mkdir(metaBuildpackFolder, os.ModePerm)
h.AssertNil(t, err)

err = os.WriteFile(filepath.Join(metaBuildpackFolder, "buildpack.toml"), []byte(`
api = "0.2"
[buildpack]
id = "local/meta-bp"
version = "local-meta-bp-version"
name = "Local Meta-Buildpack"
[[order]]
[[order.group]]
id = "local/meta-bp-dep"
version = "local-meta-bp-version"
`), 0644)
h.AssertNil(t, err)

err = os.WriteFile(filepath.Join(metaBuildpackFolder, "package.toml"), []byte(`
[buildpack]
uri = "."
[[dependencies]]
uri = "../meta-buildpack-dependency"
`), 0644)
h.AssertNil(t, err)

metaBuildpackDependencyFolder := filepath.Join(tmpDir, "meta-buildpack-dependency")
err = os.Mkdir(metaBuildpackDependencyFolder, os.ModePerm)
h.AssertNil(t, err)

err = os.WriteFile(filepath.Join(metaBuildpackDependencyFolder, "buildpack.toml"), []byte(`
api = "0.2"
[buildpack]
id = "local/meta-bp-dep"
version = "local-meta-bp-version"
name = "Local Meta-Buildpack Dependency"
[[stacks]]
id = "*"
`), 0644)
h.AssertNil(t, err)

err = subject.Build(context.TODO(), BuildOptions{
Image: "some/app",
Builder: defaultBuilderName,
ClearCache: true,
Buildpacks: []string{metaBuildpackFolder},
})

h.AssertNil(t, err)
h.AssertEq(t, fakeLifecycle.Opts.Builder.Name(), defaultBuilderImage.Name())

bldr, err := builder.FromImage(defaultBuilderImage)
h.AssertNil(t, err)

buildpack1Info := dist.ModuleInfo{ID: "buildpack.1.id", Version: "buildpack.1.version"}
buildpack2Info := dist.ModuleInfo{ID: "buildpack.2.id", Version: "buildpack.2.version"}
metaBuildpackInfo := dist.ModuleInfo{ID: "local/meta-bp", Version: "local-meta-bp-version", Name: "Local Meta-Buildpack"}
metaBuildpackDependencyInfo := dist.ModuleInfo{ID: "local/meta-bp-dep", Version: "local-meta-bp-version", Name: "Local Meta-Buildpack Dependency"}
h.AssertEq(t, bldr.Buildpacks(), []dist.ModuleInfo{
buildpack1Info,
buildpack2Info,
metaBuildpackInfo,
metaBuildpackDependencyInfo,
})
})

it("fails if buildpack dependency could not be fetched", func() {
metaBuildpackFolder := filepath.Join(tmpDir, "meta-buildpack")
err := os.Mkdir(metaBuildpackFolder, os.ModePerm)
h.AssertNil(t, err)

err = os.WriteFile(filepath.Join(metaBuildpackFolder, "buildpack.toml"), []byte(`
api = "0.2"
[buildpack]
id = "local/meta-bp"
version = "local-meta-bp-version"
name = "Local Meta-Buildpack"
[[order]]
[[order.group]]
id = "local/meta-bp-dep"
version = "local-meta-bp-version"
`), 0644)
h.AssertNil(t, err)

err = os.WriteFile(filepath.Join(metaBuildpackFolder, "package.toml"), []byte(`
[buildpack]
uri = "."
[[dependencies]]
uri = "../meta-buildpack-dependency"
[[dependencies]]
uri = "../not-a-valid-dependency"
`), 0644)
h.AssertNil(t, err)

metaBuildpackDependencyFolder := filepath.Join(tmpDir, "meta-buildpack-dependency")
err = os.Mkdir(metaBuildpackDependencyFolder, os.ModePerm)
h.AssertNil(t, err)

err = os.WriteFile(filepath.Join(metaBuildpackDependencyFolder, "buildpack.toml"), []byte(`
api = "0.2"
[buildpack]
id = "local/meta-bp-dep"
version = "local-meta-bp-version"
name = "Local Meta-Buildpack Dependency"
[[stacks]]
id = "*"
`), 0644)
h.AssertNil(t, err)

err = subject.Build(context.TODO(), BuildOptions{
Image: "some/app",
Builder: defaultBuilderName,
ClearCache: true,
Buildpacks: []string{metaBuildpackFolder},
})
h.AssertError(t, err, fmt.Sprintf("fetching package.toml dependencies (path='%s')", filepath.Join(metaBuildpackFolder, "package.toml")))
h.AssertError(t, err, "fetching dependencies (uri='../not-a-valid-dependency',image='')")
})
})

when("buildpackage image is used", func() {
var fakePackage *fakes.Image

Expand Down

0 comments on commit e53da8e

Please sign in to comment.