Fix bp env bug & remove asset packages (#700)

* Remove asset packages

Signed-off-by: Natalie Arellano <narellano@vmware.com>

* Fix env bug

Buildpacks update the environment for other buildpacks, so the same env should
be passed through to each buildpack.

Signed-off-by: Natalie Arellano <narellano@vmware.com>
This commit is contained in:
Natalie Arellano 2021-09-02 17:42:46 -04:00 committed by GitHub
parent 3a6fd83bd0
commit 49e641132e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 44 additions and 286 deletions

View File

@ -203,7 +203,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
"--env", "CNB_GROUP_PATH=./custom_group.toml",
"--env", "CNB_PLAN_PATH=./custom_plan.toml",
"--env", "CNB_PLATFORM_DIR=/custom_platform",
"--env", "CNB_ASSETS=/some-asset-path",
"--env", "CNB_PLATFORM_API="+latestPlatformAPI,
),
h.WithArgs("-log-level=debug"),
@ -229,9 +228,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
expectedAppDir := "app_dir: /custom_workspace"
h.AssertStringContains(t, logs, expectedPlatformPath)
h.AssertStringContains(t, logs, expectedAppDir)
// check no asset packages
h.AssertStringDoesNotContain(t, logs, "CNB_ASSETS=/some-asset-path")
})
})

View File

@ -5,7 +5,6 @@ ARG cnb_gid=1000
ARG cnb_platform_api
ENV CNB_PLATFORM_API=${cnb_platform_api}
ENV CNB_ASSETS=/some/asset/path
COPY ./container/ /

View File

@ -11,7 +11,6 @@ import (
type Platform interface {
API() string
SupportsAssetPackages() bool
}
type Analyzer struct {

View File

@ -30,7 +30,6 @@ type Buildpack interface {
Build(bpPlan buildpack.Plan, config buildpack.BuildConfig, bpEnv buildpack.BuildEnv) (buildpack.BuildResult, error)
ConfigFile() *buildpack.Descriptor
Detect(config *buildpack.DetectConfig, bpEnv buildpack.BuildEnv) buildpack.DetectRun
SupportsAssetPackages() bool
}
type Builder struct {
@ -60,6 +59,8 @@ func (b *Builder) Build() (*platform.BuildMetadata, error) {
var slices []layers.Slice
var labels []buildpack.Label
bpEnv := env.NewBuildEnv(os.Environ())
for _, bp := range b.Group.Group {
b.Logger.Debugf("Running build for buildpack %s", bp)
@ -72,9 +73,6 @@ func (b *Builder) Build() (*platform.BuildMetadata, error) {
b.Logger.Debug("Finding plan")
bpPlan := plan.Find(bp.ID)
b.Logger.Debug("Getting build environment")
bpEnv := env.NewBuildEnv(os.Environ(), b.Platform, bpTOML)
br, err := bpTOML.Build(bpPlan, config, bpEnv)
if err != nil {
return nil, err

View File

@ -19,6 +19,7 @@ import (
"github.com/buildpacks/lifecycle"
"github.com/buildpacks/lifecycle/api"
"github.com/buildpacks/lifecycle/buildpack"
"github.com/buildpacks/lifecycle/env"
"github.com/buildpacks/lifecycle/launch"
"github.com/buildpacks/lifecycle/layers"
"github.com/buildpacks/lifecycle/platform"
@ -66,7 +67,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
h.Mkdir(t, layersDir, appDir, filepath.Join(platformDir, "env"))
platformInt = testmock.NewMockPlatform(mockCtrl)
platformInt.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
builder = &lifecycle.Builder{
AppDir: appDir,
@ -133,7 +133,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
bpA := testmock.NewMockBuildpack(mockCtrl)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
expectedPlanA := buildpack.Plan{Entries: []buildpack.Require{
{Name: "some-dep", Version: "v1"},
{Name: "some-unmet-dep", Version: "v2"},
@ -146,7 +145,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
{Name: "some-unmet-dep", Version: "v2"},
{Name: "other-dep", Version: "v4"},
}}
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(expectedPlanB, config, gomock.Any())
_, err := builder.Build()
@ -155,6 +153,21 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}
})
it("should provide the correct environment to each buildpack", func() {
bpA := &fakeBp{}
bpB := testmock.NewMockBuildpack(mockCtrl)
expectedEnv := env.NewBuildEnv(append(os.Environ(), "HOME=modified-by-bpA"))
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().Build(gomock.Any(), config, expectedEnv)
_, err := builder.Build()
if err != nil {
t.Fatalf("Unexpected error:\n%s\n", err)
}
})
when("build metadata", func() {
when("bom", func() {
it("should aggregate BOM from each buildpack", func() {
@ -165,7 +178,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
BOM: []buildpack.BOMEntry{
{
@ -179,7 +191,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
BOM: []buildpack.BOMEntry{
{
@ -223,11 +234,9 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should include builder buildpacks", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any())
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any())
metadata, err := builder.Build()
@ -247,7 +256,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should aggregate labels from each buildpack", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Labels: []buildpack.Label{
{Key: "some-bpA-key", Value: "some-bpA-value"},
@ -256,7 +264,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Labels: []buildpack.Label{
{Key: "some-bpB-key", Value: "some-bpB-value"},
@ -283,7 +290,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should override identical processes from earlier buildpacks", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -304,7 +310,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -368,7 +373,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("last default process type wins", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -383,7 +387,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -399,7 +402,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
bpC := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("C", "v3").Return(bpC, nil)
bpC.EXPECT().SupportsAssetPackages().Return(true)
bpC.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -451,7 +453,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should warn and not set any default process", func() {
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -467,7 +468,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -483,7 +483,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
bpC := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("C", "v3").Return(bpC, nil)
bpC.EXPECT().SupportsAssetPackages().Return(true)
bpC.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -536,7 +535,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("shouldn't set it as a default process", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -580,7 +578,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should set it as a default process", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -635,7 +632,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should aggregate slices from each buildpack", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Slices: []layers.Slice{
{Paths: []string{"some-bpA-path", "some-other-bpA-path"}},
@ -645,7 +641,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Slices: []layers.Slice{
{Paths: []string{"some-bpB-path", "some-other-bpB-path"}},
@ -676,7 +671,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should error", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{}, errors.New("some error"))
if _, err := builder.Build(); err == nil {
@ -691,11 +685,9 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should error", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{}, errors.New("some error"))
if _, err := builder.Build(); err == nil {
@ -717,7 +709,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("should convert metadata.version to top level version", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
BOM: []buildpack.BOMEntry{
{
@ -731,7 +722,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
}, nil)
bpB := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v2").Return(bpB, nil)
bpB.EXPECT().SupportsAssetPackages().Return(true)
bpB.EXPECT().Build(gomock.Any(), config, gomock.Any())
metadata, err := builder.Build()
@ -772,7 +762,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("shouldn't set it as a default process", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -817,7 +806,6 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
it("shouldn't set it as a default process", func() {
bpA := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA, nil)
bpA.EXPECT().SupportsAssetPackages().Return(true)
bpA.EXPECT().Build(gomock.Any(), config, gomock.Any()).Return(buildpack.BuildResult{
Processes: []launch.Process{
{
@ -855,3 +843,23 @@ func testBuilder(t *testing.T, when spec.G, it spec.S) {
})
})
}
type fakeBp struct{}
func (b *fakeBp) Build(bpPlan buildpack.Plan, config buildpack.BuildConfig, bpEnv buildpack.BuildEnv) (buildpack.BuildResult, error) {
providedEnv, ok := bpEnv.(*env.Env)
if !ok {
return buildpack.BuildResult{}, errors.New("failed to cast bpEnv")
}
newEnv := env.NewBuildEnv(append(os.Environ(), "HOME=modified-by-bpA"))
*providedEnv = *newEnv
return buildpack.BuildResult{}, nil
}
func (b *fakeBp) ConfigFile() *buildpack.Descriptor {
return nil
}
func (b *fakeBp) Detect(config *buildpack.DetectConfig, bpEnv buildpack.BuildEnv) buildpack.DetectRun {
return buildpack.DetectRun{}
}

View File

@ -104,10 +104,6 @@ func (b *Descriptor) Build(bpPlan Plan, config BuildConfig, bpEnv BuildEnv) (Bui
return b.readOutputFiles(bpLayersDir, bpPlanPath, bpPlan, config.Logger)
}
func (b *Descriptor) SupportsAssetPackages() bool {
return false
}
func renameLayerDirIfNeeded(layerMetadataFile layertypes.LayerMetadataFile, layerDir string) error {
// rename <layers>/<layer> to <layers>/<layer>.ignore if buildpack API >= 0.6 and all of the types flags are set to false
if !layerMetadataFile.Launch && !layerMetadataFile.Cache && !layerMetadataFile.Build {

View File

@ -12,7 +12,6 @@ type Buildpack interface {
Build(bpPlan Plan, config BuildConfig, bpEnv BuildEnv) (BuildResult, error)
ConfigFile() *Descriptor
Detect(config *DetectConfig, bpEnv BuildEnv) DetectRun
SupportsAssetPackages() bool
}
type DirBuildpackStore struct {

View File

@ -38,7 +38,6 @@ const (
type Platform interface {
API() string
CodeFor(errType LifecycleExitError) int
SupportsAssetPackages() bool
}
type ErrorFail struct {

View File

@ -117,7 +117,7 @@ func (d *Detector) detectGroup(group buildpack.Group, done []buildpack.GroupBuil
return d.detectOrder(bpDesc.Order, done, group.Group[i+1:], groupBp.Optional, wg)
}
bpEnv := env.NewBuildEnv(os.Environ(), d.Platform, bp)
bpEnv := env.NewBuildEnv(os.Environ())
done = append(done, groupBp)
wg.Add(1)

View File

@ -50,7 +50,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
detector.Store = buildpackStore
platformInt = testmock.NewMockPlatform(mockCtrl)
platformInt.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
detector.Platform = platformInt
})
@ -73,10 +72,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpD2 := testmock.NewMockBuildpack(mockCtrl)
bpD1 := testmock.NewMockBuildpack(mockCtrl)
for _, bp := range []*testmock.MockBuildpack{bpE1, bpA1, bpF1, bpC1, bpB1, bpG1, bpB2, bpC2, bpD2, bpD1} {
bp.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
}
buildpackStore.EXPECT().Lookup("E", "v1").Return(bpE1, nil)
bpE1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{
API: "0.2",
@ -255,10 +250,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpC2 := testmock.NewMockBuildpack(mockCtrl)
bpD2 := testmock.NewMockBuildpack(mockCtrl)
for _, bp := range []*testmock.MockBuildpack{bpE1, bpA1, bpF1, bpC1, bpB1, bpG1, bpB2, bpC2, bpD2} {
bp.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
}
buildpackStore.EXPECT().Lookup("E", "v1").Return(bpE1, nil)
bpE1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{
API: "0.2",
@ -422,13 +413,11 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpA1 := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA1, nil)
bpA1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{API: "0.3"})
bpA1.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
bpA1.EXPECT().Detect(gomock.Any(), gomock.Any())
bpB1 := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v1").Return(bpB1, nil)
bpB1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{API: "0.2"})
bpB1.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
bpB1.EXPECT().Detect(gomock.Any(), gomock.Any())
group := []buildpack.GroupBuildpack{
@ -496,7 +485,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpA1 := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA1, nil)
bpA1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{API: "0.3"})
bpA1.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
bpA1.EXPECT().Detect(gomock.Any(), gomock.Any()).Return(buildpack.DetectRun{
BuildPlan: buildpack.BuildPlan{
PlanSections: buildpack.PlanSections{
@ -517,7 +505,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpB1 := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("B", "v1").Return(bpB1, nil)
bpB1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{API: "0.2"})
bpB1.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
bpBerror := errors.New("some-error")
bpB1.EXPECT().Detect(gomock.Any(), gomock.Any()).Return(buildpack.DetectRun{
Output: []byte("detect out: B@v1\ndetect err: B@v1"),
@ -579,7 +566,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpA1 := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA1, nil)
bpA1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{API: "0.3"})
bpA1.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
bpA1.EXPECT().Detect(gomock.Any(), gomock.Any())
group := []buildpack.GroupBuildpack{
@ -603,7 +589,6 @@ func testDetector(t *testing.T, when spec.G, it spec.S) {
bpA1 := testmock.NewMockBuildpack(mockCtrl)
buildpackStore.EXPECT().Lookup("A", "v1").Return(bpA1, nil)
bpA1.EXPECT().ConfigFile().Return(&buildpack.Descriptor{API: "0.3"})
bpA1.EXPECT().SupportsAssetPackages().Return(true).AnyTimes()
bpA1.EXPECT().Detect(gomock.Any(), gomock.Any())
group := []buildpack.GroupBuildpack{

26
env/build.go vendored
View File

@ -17,37 +17,13 @@ var BuildEnvIncludelist = []string{
"no_proxy",
}
//go:generate mockgen -package testmock -destination testmock/buildpack.go github.com/buildpacks/lifecycle/env Buildpack
//go:generate mockgen -package testmock -destination testmock/platform.go github.com/buildpacks/lifecycle/env Platform
// Buildpack represents capabilities supported by a buildpack and may be used to alter the env
// to fit supported features.
type Buildpack interface {
SupportsAssetPackages() bool
}
// Platform represents capabilities supported by the platform and may be used to alter the env
// to fit supported features.
type Platform interface {
SupportsAssetPackages() bool
}
// AssetsEnvVars is a list of environment variables to be included in order to support asset packages.
var AssetsEnvVars = []string{
"CNB_ASSETS", // will be included in the build env when platform API >= 0.7
}
var ignoreEnvVarCase = runtime.GOOS == "windows"
// NewBuildEnv returns a build-time Env from the given environment.
//
// Keys in the BuildEnvIncludelist will be added to the Environment.
// If the platform and buildpack support asset packages, keys from AssetsEnvVars will be added to the environment.
func NewBuildEnv(environ []string, platform Platform, buildpack Buildpack) *Env {
func NewBuildEnv(environ []string) *Env {
envFilter := isNotMember(BuildEnvIncludelist, flattenMap(POSIXBuildEnv))
if platform.SupportsAssetPackages() && buildpack.SupportsAssetPackages() {
envFilter = isNotMember(BuildEnvIncludelist, flattenMap(POSIXBuildEnv), AssetsEnvVars)
}
return &Env{
RootDirMap: POSIXBuildEnv,

68
env/build_test.go vendored
View File

@ -11,7 +11,6 @@ import (
"github.com/sclevine/spec/report"
"github.com/buildpacks/lifecycle/env"
"github.com/buildpacks/lifecycle/env/testmock"
h "github.com/buildpacks/lifecycle/testhelpers"
)
@ -22,14 +21,10 @@ func TestBuildEnv(t *testing.T) {
func testBuildEnv(t *testing.T, when spec.G, it spec.S) {
var (
mockController *gomock.Controller
platform *testmock.MockPlatform
buildpack *testmock.MockBuildpack
)
it.Before(func() {
mockController = gomock.NewController(t)
platform = testmock.NewMockPlatform(mockController)
buildpack = testmock.NewMockBuildpack(mockController)
})
it.After(func() {
@ -38,9 +33,6 @@ func testBuildEnv(t *testing.T, when spec.G, it spec.S) {
when("#NewBuildEnv", func() {
it("includes expected vars", func() {
platform.EXPECT().SupportsAssetPackages().Return(true)
buildpack.EXPECT().SupportsAssetPackages().Return(true)
benv := env.NewBuildEnv([]string{
"CNB_STACK_ID=some-stack-id",
"HOSTNAME=some-hostname",
@ -57,7 +49,7 @@ func testBuildEnv(t *testing.T, when spec.G, it spec.S) {
"LIBRARY_PATH=some-library-path",
"CPATH=some-cpath",
"PKG_CONFIG_PATH=some-pkg-config-path",
}, platform, buildpack)
})
out := benv.List()
sort.Strings(out)
expectedVars := []string{
@ -88,12 +80,9 @@ func testBuildEnv(t *testing.T, when spec.G, it spec.S) {
})
it("allows keys with '='", func() {
platform.EXPECT().SupportsAssetPackages().Return(true)
buildpack.EXPECT().SupportsAssetPackages().Return(true)
benv := env.NewBuildEnv([]string{
"CNB_STACK_ID=included=true",
}, platform, buildpack)
})
if s := cmp.Diff(benv.List(), []string{
"CNB_STACK_ID=included=true",
}); s != "" {
@ -102,58 +91,12 @@ func testBuildEnv(t *testing.T, when spec.G, it spec.S) {
})
it("assign the build time root dir map", func() {
platform.EXPECT().SupportsAssetPackages().Return(true)
buildpack.EXPECT().SupportsAssetPackages().Return(true)
benv := env.NewBuildEnv([]string{}, platform, buildpack)
benv := env.NewBuildEnv([]string{})
if s := cmp.Diff(benv.RootDirMap, env.POSIXBuildEnv); s != "" {
t.Fatalf("Unexpected root dir map\n%s\n", s)
}
})
when("asset packages", func() {
when("supported by platform", func() {
it.Before(func() {
platform.EXPECT().SupportsAssetPackages().Return(true)
})
when("supported by buildpack", func() {
it.Before(func() {
buildpack.EXPECT().SupportsAssetPackages().Return(true)
})
it("includes CNB_ASSETS", func() {
foundEnv := env.NewBuildEnv([]string{"CNB_ASSETS=some-assets-path"}, platform, buildpack).List()
h.AssertContains(t, foundEnv, "CNB_ASSETS=some-assets-path")
})
})
when("not supported by buildpack", func() {
it.Before(func() {
buildpack.EXPECT().SupportsAssetPackages().Return(false)
})
it("excludes CNB_ASSETS", func() {
foundEnv := env.NewBuildEnv([]string{"CNB_ASSETS=some-assets-path"}, platform, buildpack).List()
var expectedEnv []string
h.AssertEq(t, foundEnv, expectedEnv)
})
})
})
when("not supported by platform", func() {
it.Before(func() {
platform.EXPECT().SupportsAssetPackages().Return(false)
})
it("excludes CNB_ASSETS", func() {
foundEnv := env.NewBuildEnv([]string{"CNB_ASSETS=some-assets-path"}, platform, buildpack).List()
var expectedEnv []string
h.AssertEq(t, foundEnv, expectedEnv)
})
})
})
when("building in Windows", func() {
it.Before(func() {
if runtime.GOOS != "windows" {
@ -162,12 +105,9 @@ func testBuildEnv(t *testing.T, when spec.G, it spec.S) {
})
it("ignores case when initializing", func() {
platform.EXPECT().SupportsAssetPackages().Return(true)
buildpack.EXPECT().SupportsAssetPackages().Return(true)
benv := env.NewBuildEnv([]string{
"Path=some-path",
}, platform, buildpack)
})
out := benv.List()
h.AssertEq(t, len(out), 1)
h.AssertEq(t, out[0], "PATH=some-path")

View File

@ -1,48 +0,0 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/buildpacks/lifecycle/env (interfaces: Buildpack)
// Package testmock is a generated GoMock package.
package testmock
import (
reflect "reflect"
gomock "github.com/golang/mock/gomock"
)
// MockBuildpack is a mock of Buildpack interface.
type MockBuildpack struct {
ctrl *gomock.Controller
recorder *MockBuildpackMockRecorder
}
// MockBuildpackMockRecorder is the mock recorder for MockBuildpack.
type MockBuildpackMockRecorder struct {
mock *MockBuildpack
}
// NewMockBuildpack creates a new mock instance.
func NewMockBuildpack(ctrl *gomock.Controller) *MockBuildpack {
mock := &MockBuildpack{ctrl: ctrl}
mock.recorder = &MockBuildpackMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockBuildpack) EXPECT() *MockBuildpackMockRecorder {
return m.recorder
}
// SupportsAssetPackages mocks base method.
func (m *MockBuildpack) SupportsAssetPackages() bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SupportsAssetPackages")
ret0, _ := ret[0].(bool)
return ret0
}
// SupportsAssetPackages indicates an expected call of SupportsAssetPackages.
func (mr *MockBuildpackMockRecorder) SupportsAssetPackages() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsAssetPackages", reflect.TypeOf((*MockBuildpack)(nil).SupportsAssetPackages))
}

View File

@ -1,48 +0,0 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/buildpacks/lifecycle/env (interfaces: Platform)
// Package testmock is a generated GoMock package.
package testmock
import (
reflect "reflect"
gomock "github.com/golang/mock/gomock"
)
// MockPlatform is a mock of Platform interface.
type MockPlatform struct {
ctrl *gomock.Controller
recorder *MockPlatformMockRecorder
}
// MockPlatformMockRecorder is the mock recorder for MockPlatform.
type MockPlatformMockRecorder struct {
mock *MockPlatform
}
// NewMockPlatform creates a new mock instance.
func NewMockPlatform(ctrl *gomock.Controller) *MockPlatform {
mock := &MockPlatform{ctrl: ctrl}
mock.recorder = &MockPlatformMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockPlatform) EXPECT() *MockPlatformMockRecorder {
return m.recorder
}
// SupportsAssetPackages mocks base method.
func (m *MockPlatform) SupportsAssetPackages() bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SupportsAssetPackages")
ret0, _ := ret[0].(bool)
return ret0
}
// SupportsAssetPackages indicates an expected call of SupportsAssetPackages.
func (mr *MockPlatformMockRecorder) SupportsAssetPackages() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsAssetPackages", reflect.TypeOf((*MockPlatform)(nil).SupportsAssetPackages))
}

View File

@ -7,5 +7,4 @@ import (
type Platform interface {
API() string
CodeFor(errType cmd.LifecycleExitError) int
SupportsAssetPackages() bool
}

View File

@ -18,7 +18,3 @@ func NewPlatform(apiString string) common.Platform {
func (p *pre06Platform) API() string {
return p.api.String()
}
func (p *pre06Platform) SupportsAssetPackages() bool {
return false
}

View File

@ -20,7 +20,3 @@ func NewPlatform(previousPlatform common.Platform) common.Platform {
func (p *v06Platform) API() string {
return p.api.String()
}
func (p *v06Platform) SupportsAssetPackages() bool {
return false
}

View File

@ -20,7 +20,3 @@ func NewPlatform(previousPlatform common.Platform) common.Platform {
func (p *v07Platform) API() string {
return p.api.String()
}
func (p *v07Platform) SupportsAssetPackages() bool {
return false
}

View File

@ -77,17 +77,3 @@ func (mr *MockBuildpackMockRecorder) Detect(arg0, arg1 interface{}) *gomock.Call
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Detect", reflect.TypeOf((*MockBuildpack)(nil).Detect), arg0, arg1)
}
// SupportsAssetPackages mocks base method.
func (m *MockBuildpack) SupportsAssetPackages() bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SupportsAssetPackages")
ret0, _ := ret[0].(bool)
return ret0
}
// SupportsAssetPackages indicates an expected call of SupportsAssetPackages.
func (mr *MockBuildpackMockRecorder) SupportsAssetPackages() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsAssetPackages", reflect.TypeOf((*MockBuildpack)(nil).SupportsAssetPackages))
}

View File

@ -46,17 +46,3 @@ func (mr *MockPlatformMockRecorder) API() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "API", reflect.TypeOf((*MockPlatform)(nil).API))
}
// SupportsAssetPackages mocks base method.
func (m *MockPlatform) SupportsAssetPackages() bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SupportsAssetPackages")
ret0, _ := ret[0].(bool)
return ret0
}
// SupportsAssetPackages indicates an expected call of SupportsAssetPackages.
func (mr *MockPlatformMockRecorder) SupportsAssetPackages() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SupportsAssetPackages", reflect.TypeOf((*MockPlatform)(nil).SupportsAssetPackages))
}