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:
parent
3a6fd83bd0
commit
49e641132e
|
|
@ -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")
|
||||
})
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -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/ /
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ import (
|
|||
|
||||
type Platform interface {
|
||||
API() string
|
||||
SupportsAssetPackages() bool
|
||||
}
|
||||
|
||||
type Analyzer struct {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@ const (
|
|||
type Platform interface {
|
||||
API() string
|
||||
CodeFor(errType LifecycleExitError) int
|
||||
SupportsAssetPackages() bool
|
||||
}
|
||||
|
||||
type ErrorFail struct {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
@ -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))
|
||||
}
|
||||
|
|
@ -7,5 +7,4 @@ import (
|
|||
type Platform interface {
|
||||
API() string
|
||||
CodeFor(errType cmd.LifecycleExitError) int
|
||||
SupportsAssetPackages() bool
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue