From 8b15b33377445fbc874c7bef9e6c41bc986140c7 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Tue, 18 Jul 2023 15:36:28 -0300 Subject: [PATCH 1/9] Apply package config from meta-buildpack folder in pack build Signed-off-by: Colin Casey --- acceptance/acceptance_test.go | 35 +++++++++++++++++++ acceptance/buildpacks/folder_buildpack.go | 2 ++ .../0.2/meta-buildpack-dependency/bin/build | 3 ++ .../meta-buildpack-dependency/bin/build.bat | 3 ++ .../0.2/meta-buildpack-dependency/bin/detect | 3 ++ .../meta-buildpack-dependency/bin/detect.bat | 2 ++ .../meta-buildpack-dependency/buildpack.toml | 9 +++++ .../0.2/meta-buildpack/buildpack.toml | 11 ++++++ .../0.2/meta-buildpack/package.toml | 5 +++ pkg/client/build.go | 25 +++++++++++++ 10 files changed, 98 insertions(+) create mode 100755 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build create mode 100644 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build.bat create mode 100755 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect create mode 100644 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect.bat create mode 100644 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/buildpack.toml create mode 100644 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/buildpack.toml create mode 100644 acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/package.toml diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go index 837b95036..4bd3e0a97 100644 --- a/acceptance/acceptance_test.go +++ b/acceptance/acceptance_test.go @@ -1452,6 +1452,41 @@ 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") + + 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 diff --git a/acceptance/buildpacks/folder_buildpack.go b/acceptance/buildpacks/folder_buildpack.go index d892ec03e..7da935d84 100644 --- a/acceptance/buildpacks/folder_buildpack.go +++ b/acceptance/buildpacks/folder_buildpack.go @@ -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"} ) diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build new file mode 100755 index 000000000..5cc97b99d --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +echo "---> Build: Local Meta-Buildpack Dependency" diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build.bat b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build.bat new file mode 100644 index 000000000..3d7df6529 --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/build.bat @@ -0,0 +1,3 @@ +@echo off + +echo ---- Build: Local Meta-Buildpack Dependency diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect new file mode 100755 index 000000000..e4cffa69d --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +## always detect diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect.bat b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect.bat new file mode 100644 index 000000000..15823e73f --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/bin/detect.bat @@ -0,0 +1,2 @@ +@echo off +:: always detect diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/buildpack.toml b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/buildpack.toml new file mode 100644 index 000000000..668299eab --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack-dependency/buildpack.toml @@ -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" \ No newline at end of file diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/buildpack.toml b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/buildpack.toml new file mode 100644 index 000000000..799806eeb --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/buildpack.toml @@ -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" \ No newline at end of file diff --git a/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/package.toml b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/package.toml new file mode 100644 index 000000000..ced1549d9 --- /dev/null +++ b/acceptance/testdata/mock_buildpacks/0.2/meta-buildpack/package.toml @@ -0,0 +1,5 @@ +[buildpack] +uri = "." + +[[dependencies]] +uri = "../meta-buildpack-dependency" \ No newline at end of file diff --git a/pkg/client/build.go b/pkg/client/build.go index 9e5c3f295..577af7329 100644 --- a/pkg/client/build.go +++ b/pkg/client/build.go @@ -24,6 +24,7 @@ import ( "github.com/pkg/errors" ignore "github.com/sabhiram/go-gitignore" + "github.com/buildpacks/pack/buildpackage" "github.com/buildpacks/pack/internal/build" "github.com/buildpacks/pack/internal/builder" internalConfig "github.com/buildpacks/pack/internal/config" @@ -1042,6 +1043,30 @@ 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 { + packageReader := buildpackage.NewConfigReader() + packageCfg, err := packageReader.Read(packageCfgPath) + if err == nil { + for _, dep := range packageCfg.Dependencies { + mainBP, deps, err := c.buildpackDownloader.Download(ctx, dep.URI, buildpack.DownloadOptions{ + RegistryName: registry, + ImageOS: imageOS, + RelativeBaseDir: filepath.Join(bp, packageCfg.Buildpack.URI), + Daemon: !publish, + PullPolicy: pullPolicy, + }) + + if err != nil { + return nil, 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, moduleInfo, nil } From 654d20ae4a9223aa52625809ec532a8ff978b4ae Mon Sep 17 00:00:00 2001 From: Aidan Delaney Date: Tue, 11 Jul 2023 08:30:51 +0100 Subject: [PATCH 2/9] Release to Ubuntu Lunar PPA Generate a release for Ubuntu Lunar Lobster Signed-off-by: Aidan Delaney Signed-off-by: Colin Casey --- .github/workflows/delivery-ubuntu.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/delivery-ubuntu.yml b/.github/workflows/delivery-ubuntu.yml index af39a5fda..56258c2fc 100644 --- a/.github/workflows/delivery-ubuntu.yml +++ b/.github/workflows/delivery-ubuntu.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - target: [bionic, focal, jammy] + target: [bionic, focal, jammy, lunar] runs-on: ubuntu-20.04 steps: - name: Checkout code @@ -102,3 +102,15 @@ jobs: GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} PACKAGE_VERSION: ${{ steps.version.outputs.result }} + + - name: Deliver lunar + if: matrix.target == 'lunar' + uses: docker://ubuntu:lunar + with: + entrypoint: .github/workflows/delivery/ubuntu/deliver.sh + env: + DEBIAN_FRONTEND: "noninteractive" + GO_DEP_PACKAGE_NAME: golang + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + PACKAGE_VERSION: ${{ steps.version.outputs.result }} From 4a52694ff2040996073e5ede9dd3a29e9b6d183a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:56:21 +0000 Subject: [PATCH 3/9] build(deps): bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 24.0.2+incompatible to 24.0.5+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v24.0.2...v24.0.5) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: Colin Casey --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a14a30713..44ec922ca 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/buildpacks/imgutil v0.0.0-20230626185301-726f02e4225c github.com/buildpacks/lifecycle v0.17.0-rc.3 github.com/docker/cli v24.0.2+incompatible - github.com/docker/docker v24.0.2+incompatible + github.com/docker/docker v24.0.5+incompatible github.com/docker/go-connections v0.4.0 github.com/dustin/go-humanize v1.0.1 github.com/gdamore/tcell/v2 v2.6.0 diff --git a/go.sum b/go.sum index 4d55f1f13..b4ed77848 100644 --- a/go.sum +++ b/go.sum @@ -123,8 +123,8 @@ github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRX github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.2+incompatible h1:eATx+oLz9WdNVkQrr0qjQ8HvRJ4bOOxfzEo8R+dA3cg= -github.com/docker/docker v24.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= From 6dd09f686c1297121d368c6fba7184da526ffeb6 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Thu, 27 Jul 2023 13:08:48 -0300 Subject: [PATCH 4/9] Added feature flag to acceptance test to skip if pack < 0.30 Signed-off-by: Colin Casey --- acceptance/acceptance_test.go | 2 ++ acceptance/invoke/pack.go | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go index 4bd3e0a97..e103c1e0a 100644 --- a/acceptance/acceptance_test.go +++ b/acceptance/acceptance_test.go @@ -1467,6 +1467,8 @@ func testAcceptance( 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) diff --git a/acceptance/invoke/pack.go b/acceptance/invoke/pack.go index fbb50a260..35bd58f5b 100644 --- a/acceptance/invoke/pack.go +++ b/acceptance/invoke/pack.go @@ -234,6 +234,7 @@ const ( StackValidation ForceRebase BuildpackFlatten + MetaBuildpackFolder ) var featureTests = map[Feature]func(i *PackInvoker) bool{ @@ -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 { From b6440b820cef34b22c0c867e72f63d55535b7182 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Thu, 27 Jul 2023 15:15:53 -0300 Subject: [PATCH 5/9] Added unit test Signed-off-by: Colin Casey --- pkg/client/build_test.go | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/pkg/client/build_test.go b/pkg/client/build_test.go index 0fff061f4..58191836a 100644 --- a/pkg/client/build_test.go +++ b/pkg/client/build_test.go @@ -10,6 +10,7 @@ import ( "io" "net/http" "os" + "path" "path/filepath" "runtime" "strings" @@ -988,6 +989,77 @@ func testBuild(t *testing.T, when spec.G, it spec.S) { }) }) + when("meta-buildpack folder is used", func() { + it.Focus("resolves buildpack", func() { + metaBuildpackFolder := path.Join(tmpDir, "meta-buildpack") + err := os.Mkdir(metaBuildpackFolder, os.ModePerm) + h.AssertNil(t, err) + + err = os.WriteFile(path.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(path.Join(metaBuildpackFolder, "package.toml"), []byte(` +[buildpack] +uri = "." + +[[dependencies]] +uri = "../meta-buildpack-dependency" + `), 0644) + h.AssertNil(t, err) + + metaBuildpackDependencyFolder := path.Join(tmpDir, "meta-buildpack-dependency") + err = os.Mkdir(metaBuildpackDependencyFolder, os.ModePerm) + h.AssertNil(t, err) + + err = os.WriteFile(path.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) + + 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, + }) + }) + }) + when("buildpackage image is used", func() { var fakePackage *fakes.Image From 5e5c9c0adfaf442329280a2b8fb71b4930c09343 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Thu, 27 Jul 2023 15:19:51 -0300 Subject: [PATCH 6/9] Fixed lint Signed-off-by: Colin Casey --- pkg/client/build_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/client/build_test.go b/pkg/client/build_test.go index 58191836a..a191b1722 100644 --- a/pkg/client/build_test.go +++ b/pkg/client/build_test.go @@ -990,7 +990,7 @@ func testBuild(t *testing.T, when spec.G, it spec.S) { }) when("meta-buildpack folder is used", func() { - it.Focus("resolves buildpack", func() { + it("resolves buildpack", func() { metaBuildpackFolder := path.Join(tmpDir, "meta-buildpack") err := os.Mkdir(metaBuildpackFolder, os.ModePerm) h.AssertNil(t, err) @@ -1045,7 +1045,9 @@ api = "0.2" 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"} From 6eeae0b8a5f0a502383adacc3a8e3bbee3fe7f49 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Thu, 3 Aug 2023 16:24:25 -0300 Subject: [PATCH 7/9] Addressing PR review comments - extracted the fetching of buildpacks from package.toml into its own function - added test to cover error scenario Signed-off-by: Colin Casey --- pkg/client/build.go | 50 +++++++++++++++++++++------------- pkg/client/build_test.go | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 19 deletions(-) diff --git a/pkg/client/build.go b/pkg/client/build.go index 577af7329..f470f11f8 100644 --- a/pkg/client/build.go +++ b/pkg/client/build.go @@ -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" @@ -24,7 +26,6 @@ import ( "github.com/pkg/errors" ignore "github.com/sabhiram/go-gitignore" - "github.com/buildpacks/pack/buildpackage" "github.com/buildpacks/pack/internal/build" "github.com/buildpacks/pack/internal/builder" internalConfig "github.com/buildpacks/pack/internal/config" @@ -1047,30 +1048,41 @@ func (c *Client) fetchBuildpack(ctx context.Context, bp string, relativeBaseDir packageCfgPath := filepath.Join(bp, "package.toml") _, err = os.Stat(packageCfgPath) if err == nil { - packageReader := buildpackage.NewConfigReader() - packageCfg, err := packageReader.Read(packageCfgPath) - if err == nil { - for _, dep := range packageCfg.Dependencies { - mainBP, deps, err := c.buildpackDownloader.Download(ctx, dep.URI, buildpack.DownloadOptions{ - RegistryName: registry, - ImageOS: imageOS, - RelativeBaseDir: filepath.Join(bp, packageCfg.Buildpack.URI), - Daemon: !publish, - PullPolicy: pullPolicy, - }) - - if err != nil { - return nil, nil, errors.Wrapf(err, "fetching dependencies (uri=%s,image=%s)", style.Symbol(dep.URI), style.Symbol(dep.ImageName)) - } - - fetchedBPs = append(append(fetchedBPs, mainBP), deps...) - } + 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 == "": diff --git a/pkg/client/build_test.go b/pkg/client/build_test.go index a191b1722..13bcc9113 100644 --- a/pkg/client/build_test.go +++ b/pkg/client/build_test.go @@ -1060,6 +1060,65 @@ api = "0.2" metaBuildpackDependencyInfo, }) }) + + it("fails if buildpack dependency could not be fetched", func() { + metaBuildpackFolder := path.Join(tmpDir, "meta-buildpack") + err := os.Mkdir(metaBuildpackFolder, os.ModePerm) + h.AssertNil(t, err) + + err = os.WriteFile(path.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(path.Join(metaBuildpackFolder, "package.toml"), []byte(` +[buildpack] +uri = "." + +[[dependencies]] +uri = "../meta-buildpack-dependency" + +[[dependencies]] +uri = "../not-a-valid-dependency" + `), 0644) + h.AssertNil(t, err) + + metaBuildpackDependencyFolder := path.Join(tmpDir, "meta-buildpack-dependency") + err = os.Mkdir(metaBuildpackDependencyFolder, os.ModePerm) + h.AssertNil(t, err) + + err = os.WriteFile(path.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')", path.Join(metaBuildpackFolder, "package.toml"))) + h.AssertError(t, err, "fetching dependencies (uri='../not-a-valid-dependency',image='')") + }) }) when("buildpackage image is used", func() { From e739ca6450a9cc68864ef4637679311db20a1157 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Fri, 4 Aug 2023 11:02:37 -0300 Subject: [PATCH 8/9] Use `filepath` instead of `path` in tests Signed-off-by: Colin Casey --- pkg/client/build_test.go | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/pkg/client/build_test.go b/pkg/client/build_test.go index 13bcc9113..31616e6d1 100644 --- a/pkg/client/build_test.go +++ b/pkg/client/build_test.go @@ -10,7 +10,6 @@ import ( "io" "net/http" "os" - "path" "path/filepath" "runtime" "strings" @@ -991,11 +990,11 @@ func testBuild(t *testing.T, when spec.G, it spec.S) { when("meta-buildpack folder is used", func() { it("resolves buildpack", func() { - metaBuildpackFolder := path.Join(tmpDir, "meta-buildpack") + metaBuildpackFolder := filepath.Join(tmpDir, "meta-buildpack") err := os.Mkdir(metaBuildpackFolder, os.ModePerm) h.AssertNil(t, err) - err = os.WriteFile(path.Join(metaBuildpackFolder, "buildpack.toml"), []byte(` + err = os.WriteFile(filepath.Join(metaBuildpackFolder, "buildpack.toml"), []byte(` api = "0.2" [buildpack] @@ -1010,7 +1009,7 @@ version = "local-meta-bp-version" `), 0644) h.AssertNil(t, err) - err = os.WriteFile(path.Join(metaBuildpackFolder, "package.toml"), []byte(` + err = os.WriteFile(filepath.Join(metaBuildpackFolder, "package.toml"), []byte(` [buildpack] uri = "." @@ -1019,11 +1018,11 @@ uri = "../meta-buildpack-dependency" `), 0644) h.AssertNil(t, err) - metaBuildpackDependencyFolder := path.Join(tmpDir, "meta-buildpack-dependency") + metaBuildpackDependencyFolder := filepath.Join(tmpDir, "meta-buildpack-dependency") err = os.Mkdir(metaBuildpackDependencyFolder, os.ModePerm) h.AssertNil(t, err) - err = os.WriteFile(path.Join(metaBuildpackDependencyFolder, "buildpack.toml"), []byte(` + err = os.WriteFile(filepath.Join(metaBuildpackDependencyFolder, "buildpack.toml"), []byte(` api = "0.2" [buildpack] @@ -1062,11 +1061,11 @@ api = "0.2" }) it("fails if buildpack dependency could not be fetched", func() { - metaBuildpackFolder := path.Join(tmpDir, "meta-buildpack") + metaBuildpackFolder := filepath.Join(tmpDir, "meta-buildpack") err := os.Mkdir(metaBuildpackFolder, os.ModePerm) h.AssertNil(t, err) - err = os.WriteFile(path.Join(metaBuildpackFolder, "buildpack.toml"), []byte(` + err = os.WriteFile(filepath.Join(metaBuildpackFolder, "buildpack.toml"), []byte(` api = "0.2" [buildpack] @@ -1081,7 +1080,7 @@ version = "local-meta-bp-version" `), 0644) h.AssertNil(t, err) - err = os.WriteFile(path.Join(metaBuildpackFolder, "package.toml"), []byte(` + err = os.WriteFile(filepath.Join(metaBuildpackFolder, "package.toml"), []byte(` [buildpack] uri = "." @@ -1093,11 +1092,11 @@ uri = "../not-a-valid-dependency" `), 0644) h.AssertNil(t, err) - metaBuildpackDependencyFolder := path.Join(tmpDir, "meta-buildpack-dependency") + metaBuildpackDependencyFolder := filepath.Join(tmpDir, "meta-buildpack-dependency") err = os.Mkdir(metaBuildpackDependencyFolder, os.ModePerm) h.AssertNil(t, err) - err = os.WriteFile(path.Join(metaBuildpackDependencyFolder, "buildpack.toml"), []byte(` + err = os.WriteFile(filepath.Join(metaBuildpackDependencyFolder, "buildpack.toml"), []byte(` api = "0.2" [buildpack] @@ -1116,7 +1115,7 @@ api = "0.2" ClearCache: true, Buildpacks: []string{metaBuildpackFolder}, }) - h.AssertError(t, err, fmt.Sprintf("fetching package.toml dependencies (path='%s')", path.Join(metaBuildpackFolder, "package.toml"))) + 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='')") }) }) From 7c3818f94bc017365969797a923c7198a3cfe199 Mon Sep 17 00:00:00 2001 From: Colin Casey Date: Fri, 4 Aug 2023 11:32:36 -0300 Subject: [PATCH 9/9] Re-run actions Signed-off-by: Colin Casey