From 39c5fb30333ff7d3161acf9a71e6ec0eb2063c4f Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 15:52:04 -0500 Subject: [PATCH 1/8] Add .idea/ and .DS_Store to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 69b8101..d6b648f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /.bin +.idea/ +.DS_Store \ No newline at end of file From 0531b89020f56404f85077637ba52af7e080be64 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 15:52:39 -0500 Subject: [PATCH 2/8] Rerun go generate --- fakes/dependency_manager.go | 18 +++++++++--------- fakes/entry_resolver.go | 12 ++++++------ fakes/sbom_generator.go | 6 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/fakes/dependency_manager.go b/fakes/dependency_manager.go index 288a33e..2d32ea8 100644 --- a/fakes/dependency_manager.go +++ b/fakes/dependency_manager.go @@ -9,7 +9,7 @@ import ( type DependencyManager struct { DeliverCall struct { - sync.Mutex + mutex sync.Mutex CallCount int Receives struct { Dependency postal.Dependency @@ -23,7 +23,7 @@ type DependencyManager struct { Stub func(postal.Dependency, string, string, string) error } GenerateBillOfMaterialsCall struct { - sync.Mutex + mutex sync.Mutex CallCount int Receives struct { Dependencies []postal.Dependency @@ -34,7 +34,7 @@ type DependencyManager struct { Stub func(...postal.Dependency) []packit.BOMEntry } ResolveCall struct { - sync.Mutex + mutex sync.Mutex CallCount int Receives struct { Path string @@ -51,8 +51,8 @@ type DependencyManager struct { } func (f *DependencyManager) Deliver(param1 postal.Dependency, param2 string, param3 string, param4 string) error { - f.DeliverCall.Lock() - defer f.DeliverCall.Unlock() + f.DeliverCall.mutex.Lock() + defer f.DeliverCall.mutex.Unlock() f.DeliverCall.CallCount++ f.DeliverCall.Receives.Dependency = param1 f.DeliverCall.Receives.CnbPath = param2 @@ -64,8 +64,8 @@ func (f *DependencyManager) Deliver(param1 postal.Dependency, param2 string, par return f.DeliverCall.Returns.Error } func (f *DependencyManager) GenerateBillOfMaterials(param1 ...postal.Dependency) []packit.BOMEntry { - f.GenerateBillOfMaterialsCall.Lock() - defer f.GenerateBillOfMaterialsCall.Unlock() + f.GenerateBillOfMaterialsCall.mutex.Lock() + defer f.GenerateBillOfMaterialsCall.mutex.Unlock() f.GenerateBillOfMaterialsCall.CallCount++ f.GenerateBillOfMaterialsCall.Receives.Dependencies = param1 if f.GenerateBillOfMaterialsCall.Stub != nil { @@ -74,8 +74,8 @@ func (f *DependencyManager) GenerateBillOfMaterials(param1 ...postal.Dependency) return f.GenerateBillOfMaterialsCall.Returns.BOMEntrySlice } func (f *DependencyManager) Resolve(param1 string, param2 string, param3 string, param4 string) (postal.Dependency, error) { - f.ResolveCall.Lock() - defer f.ResolveCall.Unlock() + f.ResolveCall.mutex.Lock() + defer f.ResolveCall.mutex.Unlock() f.ResolveCall.CallCount++ f.ResolveCall.Receives.Path = param1 f.ResolveCall.Receives.Id = param2 diff --git a/fakes/entry_resolver.go b/fakes/entry_resolver.go index 7b95a0e..314c7a4 100644 --- a/fakes/entry_resolver.go +++ b/fakes/entry_resolver.go @@ -8,7 +8,7 @@ import ( type EntryResolver struct { MergeLayerTypesCall struct { - sync.Mutex + mutex sync.Mutex CallCount int Receives struct { Name string @@ -21,7 +21,7 @@ type EntryResolver struct { Stub func(string, []packit.BuildpackPlanEntry) (bool, bool) } ResolveCall struct { - sync.Mutex + mutex sync.Mutex CallCount int Receives struct { Name string @@ -39,8 +39,8 @@ type EntryResolver struct { } func (f *EntryResolver) MergeLayerTypes(param1 string, param2 []packit.BuildpackPlanEntry) (bool, bool) { - f.MergeLayerTypesCall.Lock() - defer f.MergeLayerTypesCall.Unlock() + f.MergeLayerTypesCall.mutex.Lock() + defer f.MergeLayerTypesCall.mutex.Unlock() f.MergeLayerTypesCall.CallCount++ f.MergeLayerTypesCall.Receives.Name = param1 f.MergeLayerTypesCall.Receives.Entries = param2 @@ -51,8 +51,8 @@ func (f *EntryResolver) MergeLayerTypes(param1 string, param2 []packit.Buildpack } func (f *EntryResolver) Resolve(param1 string, param2 []packit.BuildpackPlanEntry, param3 []interface { }) (packit.BuildpackPlanEntry, []packit.BuildpackPlanEntry) { - f.ResolveCall.Lock() - defer f.ResolveCall.Unlock() + f.ResolveCall.mutex.Lock() + defer f.ResolveCall.mutex.Unlock() f.ResolveCall.CallCount++ f.ResolveCall.Receives.Name = param1 f.ResolveCall.Receives.Entries = param2 diff --git a/fakes/sbom_generator.go b/fakes/sbom_generator.go index e7029d7..0781b4c 100644 --- a/fakes/sbom_generator.go +++ b/fakes/sbom_generator.go @@ -9,7 +9,7 @@ import ( type SBOMGenerator struct { GenerateFromDependencyCall struct { - sync.Mutex + mutex sync.Mutex CallCount int Receives struct { Dependency postal.Dependency @@ -24,8 +24,8 @@ type SBOMGenerator struct { } func (f *SBOMGenerator) GenerateFromDependency(param1 postal.Dependency, param2 string) (sbom.SBOM, error) { - f.GenerateFromDependencyCall.Lock() - defer f.GenerateFromDependencyCall.Unlock() + f.GenerateFromDependencyCall.mutex.Lock() + defer f.GenerateFromDependencyCall.mutex.Unlock() f.GenerateFromDependencyCall.CallCount++ f.GenerateFromDependencyCall.Receives.Dependency = param1 f.GenerateFromDependencyCall.Receives.Dir = param2 From ef6807f2842bd66964bceec798308bd2dba1b289 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 15:53:17 -0500 Subject: [PATCH 3/8] Bump Golang to 1.17 --- go.mod | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 0b1c065..1b4254c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/paketo-buildpacks/yarn -go 1.16 +go 1.17 require ( github.com/BurntSushi/toml v1.1.0 @@ -9,3 +9,92 @@ require ( github.com/paketo-buildpacks/packit/v2 v2.3.0 github.com/sclevine/spec v1.4.0 ) + +require ( + github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect + github.com/CycloneDX/cyclonedx-go v0.5.0 // indirect + github.com/ForestEckhardt/freezer v0.0.11 // indirect + github.com/Masterminds/semver/v3 v3.1.1 // indirect + github.com/Microsoft/go-winio v0.5.1 // indirect + github.com/Microsoft/hcsshim v0.8.23 // indirect + github.com/acobaugh/osrelease v0.1.0 // indirect + github.com/anchore/go-macholibre v0.0.0-20220308212642-53e6d0aaf6fb // indirect + github.com/anchore/go-rpmdb v0.0.0-20210914181456-a9c52348da63 // indirect + github.com/anchore/go-version v1.2.2-0.20200701162849-18adb9c92b9b // indirect + github.com/anchore/packageurl-go v0.1.1-0.20220314153042-1bcd40e5206b // indirect + github.com/anchore/stereoscope v0.0.0-20220406160859-c03a18a6b270 // indirect + github.com/anchore/syft v0.44.1 // indirect + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/bmatcuk/doublestar/v4 v4.0.2 // indirect + github.com/cenkalti/backoff/v4 v4.1.2 // indirect + github.com/containerd/cgroups v1.0.1 // indirect + github.com/containerd/containerd v1.5.10 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.10.1 // indirect + github.com/docker/cli v20.10.12+incompatible // indirect + github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/docker/docker v20.10.12+incompatible // indirect + github.com/docker/docker-credential-helpers v0.6.4 // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/facebookincubator/nvdtools v0.1.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.0 // indirect + github.com/go-restruct/restruct v1.2.0-alpha // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/google/go-containerregistry v0.8.1-0.20220209165246-a44adc326839 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/jinzhu/copier v0.3.2 // indirect + github.com/klauspost/compress v1.14.2 // indirect + github.com/klauspost/pgzip v1.2.5 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mholt/archiver/v3 v3.5.1 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/moby/sys/mount v0.2.0 // indirect + github.com/moby/sys/mountinfo v0.5.0 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/nwaples/rardecode v1.1.0 // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect + github.com/opencontainers/runc v1.0.2 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pierrec/lz4/v4 v4.1.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spdx/tools-golang v0.2.0 // indirect + github.com/spf13/afero v1.8.0 // indirect + github.com/testcontainers/testcontainers-go v0.13.0 // indirect + github.com/ulikunitz/xz v0.5.10 // indirect + github.com/vbatts/tar-split v0.11.2 // indirect + github.com/vifraa/gopom v0.1.0 // indirect + github.com/wagoodman/go-partybus v0.0.0-20210627031916-db1f5573bbc5 // indirect + github.com/wagoodman/go-progress v0.0.0-20200731105512-1020f39e6240 // indirect + github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/crypto v0.0.0-20220213190939-1e6e3497d506 // indirect + golang.org/x/mod v0.5.1 // indirect + golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c // indirect + google.golang.org/grpc v1.44.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +) From 2242c9ec2fdda080a620504b50e6142ff4606643 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 15:53:46 -0500 Subject: [PATCH 4/8] Bump Golang to 1.18 --- go.mod | 2 +- go.sum | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 1b4254c..e329801 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/paketo-buildpacks/yarn -go 1.17 +go 1.18 require ( github.com/BurntSushi/toml v1.1.0 diff --git a/go.sum b/go.sum index 1e7dacd..f40e4e8 100644 --- a/go.sum +++ b/go.sum @@ -183,7 +183,6 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= @@ -420,7 +419,6 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e/go.mod h1:V284PjgVwSk4ETmz84rpu9ehpGg7swlIH8npP9k2bGw= github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= github.com/cavaliercoder/go-rpm v0.0.0-20200122174316-8cb9fd9c31a8/go.mod h1:AZIh1CCnMrcVm6afFf96PBvE2MRpWFco91z8ObJtgDY= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= @@ -1663,7 +1661,6 @@ github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7 github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.2 h1:qvY3YFXRQE/XB8MlLzJH7mSzBs74eA2gg52YTk6jUPM= From 6656857b67e80f1f0656f1870ca906b186f0e096 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 16:01:00 -0500 Subject: [PATCH 5/8] Add variables to simplify build_test --- build_test.go | 137 ++++++++++++++------------------------------------ 1 file changed, 37 insertions(+), 100 deletions(-) diff --git a/build_test.go b/build_test.go index bf12061..126e2ad 100644 --- a/build_test.go +++ b/build_test.go @@ -35,7 +35,8 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer *bytes.Buffer - build packit.BuildFunc + buildContext packit.BuildContext + build packit.BuildFunc ) it.Before(func() { @@ -81,21 +82,8 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { sbomGenerator.GenerateFromDependencyCall.Returns.SBOM = sbom.SBOM{} buffer = bytes.NewBuffer(nil) - build = yarn.Build(entryResolver, - dependencyManager, - sbomGenerator, - chronos.DefaultClock, - scribe.NewEmitter(buffer)) - }) - - it.After(func() { - Expect(os.RemoveAll(layersDir)).To(Succeed()) - Expect(os.RemoveAll(cnbDir)).To(Succeed()) - Expect(os.RemoveAll(workingDir)).To(Succeed()) - }) - it("returns a result that installs yarn", func() { - result, err := build(packit.BuildContext{ + buildContext = packit.BuildContext{ WorkingDir: workingDir, CNBPath: cnbDir, Stack: "some-stack", @@ -113,7 +101,23 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }, Platform: packit.Platform{Path: "platform"}, Layers: packit.Layers{Path: layersDir}, - }) + } + + build = yarn.Build(entryResolver, + dependencyManager, + sbomGenerator, + chronos.DefaultClock, + scribe.NewEmitter(buffer)) + }) + + it.After(func() { + Expect(os.RemoveAll(layersDir)).To(Succeed()) + Expect(os.RemoveAll(cnbDir)).To(Succeed()) + Expect(os.RemoveAll(workingDir)).To(Succeed()) + }) + + it("returns a result that installs yarn", func() { + result, err := build(buildContext) Expect(err).NotTo(HaveOccurred()) Expect(result.Layers).To(HaveLen(1)) @@ -192,25 +196,15 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { it.Before(func() { entryResolver.MergeLayerTypesCall.Returns.Launch = true entryResolver.MergeLayerTypesCall.Returns.Build = true + + buildContext.Plan.Entries[0].Metadata = map[string]interface{}{ + "build": true, + "launch": true, + } }) it("makes the layer available in those phases", func() { - result, err := build(packit.BuildContext{ - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - { - Name: "yarn", - Metadata: map[string]interface{}{ - "build": true, - "launch": true, - }, - }, - }, - }, - Layers: packit.Layers{Path: layersDir}, - Stack: "some-stack", - }) + result, err := build(buildContext) Expect(err).NotTo(HaveOccurred()) Expect(result.Layers).To(HaveLen(1)) @@ -235,16 +229,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(packit.BuildContext{ - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - {Name: "yarn"}, - }, - }, - Layers: packit.Layers{Path: layersDir}, - Stack: "some-stack", - }) + _, err := build(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to parse layer content metadata"))) }) }) @@ -255,16 +240,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(packit.BuildContext{ - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - {Name: "yarn"}, - }, - }, - Layers: packit.Layers{Path: layersDir}, - Stack: "some-stack", - }) + _, err := build(buildContext) Expect(err).To(MatchError("failed to resolve dependency")) }) }) @@ -279,15 +255,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(packit.BuildContext{ - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - {Name: "yarn"}, - }, - }, - Layers: packit.Layers{Path: layersDir}, - }) + _, err := build(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -298,33 +266,18 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(packit.BuildContext{ - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - {Name: "yarn"}, - }, - }, - Layers: packit.Layers{Path: layersDir}, - Stack: "some-stack", - }) + _, err := build(buildContext) Expect(err).To(MatchError("failed to install dependency")) }) }) context("when generating the SBOM returns an error", func() { + it.Before(func() { + buildContext.BuildpackInfo = packit.BuildpackInfo{SBOMFormats: []string{"random-format"}} + }) + it("returns an error", func() { - _, err := build(packit.BuildContext{ - BuildpackInfo: packit.BuildpackInfo{SBOMFormats: []string{"random-format"}}, - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - {Name: "yarn"}, - }, - }, - Layers: packit.Layers{Path: layersDir}, - Stack: "some-stack", - }) + _, err := build(buildContext) Expect(err).To(MatchError("unsupported SBOM format: 'random-format'")) }) }) @@ -335,16 +288,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(packit.BuildContext{ - CNBPath: cnbDir, - Plan: packit.BuildpackPlan{ - Entries: []packit.BuildpackPlanEntry{ - {Name: "yarn"}, - }, - }, - Layers: packit.Layers{Path: layersDir}, - Stack: "some-stack", - }) + _, err := build(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) @@ -359,14 +303,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(packit.BuildContext{ - BuildpackInfo: packit.BuildpackInfo{ - Name: "Some Buildpack", - Version: "some-version", - SBOMFormats: []string{sbom.CycloneDXFormat, sbom.SPDXFormat}, - }, - }) - + _, err := build(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to parse BP_DISABLE_SBOM"))) }) }) From c5df0df2dff9d82907f545c200f496b868e6e09d Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 16:02:11 -0500 Subject: [PATCH 6/8] Use expectations and sequential tests when dealing with Env vars --- build_test.go | 4 ++-- init_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build_test.go b/build_test.go index 126e2ad..9fd7fe3 100644 --- a/build_test.go +++ b/build_test.go @@ -295,11 +295,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { context("when BP_DISABLE_SBOM is set incorrectly", func() { it.Before(func() { - os.Setenv("BP_DISABLE_SBOM", "not-a-bool") + Expect(os.Setenv("BP_DISABLE_SBOM", "not-a-bool")).To(Succeed()) }) it.After(func() { - os.Unsetenv("BP_DISABLE_SBOM") + Expect(os.Unsetenv("BP_DISABLE_SBOM")).To(Succeed()) }) it("returns an error", func() { diff --git a/init_test.go b/init_test.go index c2ff1f1..fd778aa 100644 --- a/init_test.go +++ b/init_test.go @@ -9,7 +9,7 @@ import ( func TestUnitYarn(t *testing.T) { suite := spec.New("yarn", spec.Report(report.Terminal{}), spec.Parallel()) - suite("Build", testBuild) + suite("Build", testBuild, spec.Sequential()) suite("Detect", testDetect) suite.Run(t) } From 117a664f86e051f8ccc5bd7c1099b75a732b9311 Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 16:05:18 -0500 Subject: [PATCH 7/8] Use draft.Planner from packit directly - See https://github.com/paketo-buildpacks/cpython/pull/327 for context --- build.go | 13 +++------ build_test.go | 22 +------------- fakes/entry_resolver.go | 64 ----------------------------------------- run/main.go | 3 -- 4 files changed, 5 insertions(+), 97 deletions(-) delete mode 100644 fakes/entry_resolver.go diff --git a/build.go b/build.go index 374069d..f9b5c84 100644 --- a/build.go +++ b/build.go @@ -9,17 +9,12 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/chronos" + "github.com/paketo-buildpacks/packit/v2/draft" "github.com/paketo-buildpacks/packit/v2/postal" "github.com/paketo-buildpacks/packit/v2/sbom" "github.com/paketo-buildpacks/packit/v2/scribe" ) -//go:generate faux --interface EntryResolver --output fakes/entry_resolver.go -type EntryResolver interface { - Resolve(name string, entries []packit.BuildpackPlanEntry, priorites []interface{}) (packit.BuildpackPlanEntry, []packit.BuildpackPlanEntry) - MergeLayerTypes(name string, entries []packit.BuildpackPlanEntry) (launch, build bool) -} - //go:generate faux --interface DependencyManager --output fakes/dependency_manager.go type DependencyManager interface { Resolve(path, id, version, stack string) (postal.Dependency, error) @@ -33,7 +28,6 @@ type SBOMGenerator interface { } func Build( - entryResolver EntryResolver, dependencyManager DependencyManager, sbomGenerator SBOMGenerator, clock chronos.Clock, @@ -47,7 +41,8 @@ func Build( return packit.BuildResult{}, err } - entry, _ := entryResolver.Resolve("yarn", context.Plan.Entries, nil) + planner := draft.NewPlanner() + entry, _ := planner.Resolve("yarn", context.Plan.Entries, nil) version, ok := entry.Metadata["version"].(string) if !ok { version = "default" @@ -64,7 +59,7 @@ func Build( bom := dependencyManager.GenerateBillOfMaterials(dependency) - launch, build := entryResolver.MergeLayerTypes("yarn", context.Plan.Entries) + launch, build := planner.MergeLayerTypes("yarn", context.Plan.Entries) var buildMetadata = packit.BuildMetadata{} var launchMetadata = packit.LaunchMetadata{} diff --git a/build_test.go b/build_test.go index 9fd7fe3..d3e9019 100644 --- a/build_test.go +++ b/build_test.go @@ -29,7 +29,6 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { layersDir string workingDir string cnbDir string - entryResolver *fakes.EntryResolver dependencyManager *fakes.DependencyManager sbomGenerator *fakes.SBOMGenerator @@ -50,11 +49,6 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { workingDir, err = os.MkdirTemp("", "working-dir") Expect(err).NotTo(HaveOccurred()) - entryResolver = &fakes.EntryResolver{} - entryResolver.ResolveCall.Returns.BuildpackPlanEntry = packit.BuildpackPlanEntry{ - Name: "yarn", - } - dependencyManager = &fakes.DependencyManager{} dependencyManager.ResolveCall.Returns.Dependency = postal.Dependency{ ID: "yarn", @@ -103,8 +97,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { Layers: packit.Layers{Path: layersDir}, } - build = yarn.Build(entryResolver, - dependencyManager, + build = yarn.Build(dependencyManager, sbomGenerator, chronos.DefaultClock, scribe.NewEmitter(buffer)) @@ -140,16 +133,6 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }, })) - Expect(entryResolver.ResolveCall.Receives.Name).To(Equal("yarn")) - Expect(entryResolver.ResolveCall.Receives.Entries).To(Equal([]packit.BuildpackPlanEntry{ - {Name: "yarn"}, - })) - - Expect(entryResolver.MergeLayerTypesCall.Receives.Name).To(Equal("yarn")) - Expect(entryResolver.MergeLayerTypesCall.Receives.Entries).To(Equal([]packit.BuildpackPlanEntry{ - {Name: "yarn"}, - })) - Expect(dependencyManager.ResolveCall.Receives.Path).To(Equal(filepath.Join(cnbDir, "buildpack.toml"))) Expect(dependencyManager.ResolveCall.Receives.Id).To(Equal("yarn")) Expect(dependencyManager.ResolveCall.Receives.Stack).To(Equal("some-stack")) @@ -194,9 +177,6 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { context("when the plan entry requires the dependency during the build and launch phases", func() { it.Before(func() { - entryResolver.MergeLayerTypesCall.Returns.Launch = true - entryResolver.MergeLayerTypesCall.Returns.Build = true - buildContext.Plan.Entries[0].Metadata = map[string]interface{}{ "build": true, "launch": true, diff --git a/fakes/entry_resolver.go b/fakes/entry_resolver.go deleted file mode 100644 index 314c7a4..0000000 --- a/fakes/entry_resolver.go +++ /dev/null @@ -1,64 +0,0 @@ -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2" -) - -type EntryResolver struct { - MergeLayerTypesCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Name string - Entries []packit.BuildpackPlanEntry - } - Returns struct { - Launch bool - Build bool - } - Stub func(string, []packit.BuildpackPlanEntry) (bool, bool) - } - ResolveCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Name string - Entries []packit.BuildpackPlanEntry - Priorites []interface { - } - } - Returns struct { - BuildpackPlanEntry packit.BuildpackPlanEntry - BuildpackPlanEntrySlice []packit.BuildpackPlanEntry - } - Stub func(string, []packit.BuildpackPlanEntry, []interface { - }) (packit.BuildpackPlanEntry, []packit.BuildpackPlanEntry) - } -} - -func (f *EntryResolver) MergeLayerTypes(param1 string, param2 []packit.BuildpackPlanEntry) (bool, bool) { - f.MergeLayerTypesCall.mutex.Lock() - defer f.MergeLayerTypesCall.mutex.Unlock() - f.MergeLayerTypesCall.CallCount++ - f.MergeLayerTypesCall.Receives.Name = param1 - f.MergeLayerTypesCall.Receives.Entries = param2 - if f.MergeLayerTypesCall.Stub != nil { - return f.MergeLayerTypesCall.Stub(param1, param2) - } - return f.MergeLayerTypesCall.Returns.Launch, f.MergeLayerTypesCall.Returns.Build -} -func (f *EntryResolver) Resolve(param1 string, param2 []packit.BuildpackPlanEntry, param3 []interface { -}) (packit.BuildpackPlanEntry, []packit.BuildpackPlanEntry) { - f.ResolveCall.mutex.Lock() - defer f.ResolveCall.mutex.Unlock() - f.ResolveCall.CallCount++ - f.ResolveCall.Receives.Name = param1 - f.ResolveCall.Receives.Entries = param2 - f.ResolveCall.Receives.Priorites = param3 - if f.ResolveCall.Stub != nil { - return f.ResolveCall.Stub(param1, param2, param3) - } - return f.ResolveCall.Returns.BuildpackPlanEntry, f.ResolveCall.Returns.BuildpackPlanEntrySlice -} diff --git a/run/main.go b/run/main.go index ea344fd..731e78a 100644 --- a/run/main.go +++ b/run/main.go @@ -6,7 +6,6 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/cargo" "github.com/paketo-buildpacks/packit/v2/chronos" - "github.com/paketo-buildpacks/packit/v2/draft" "github.com/paketo-buildpacks/packit/v2/postal" "github.com/paketo-buildpacks/packit/v2/sbom" "github.com/paketo-buildpacks/packit/v2/scribe" @@ -20,14 +19,12 @@ func (f Generator) GenerateFromDependency(dependency postal.Dependency, path str } func main() { - entryResolver := draft.NewPlanner() dependencyManager := postal.NewService(cargo.NewTransport()) logEmitter := scribe.NewEmitter(os.Stdout).WithLevel(os.Getenv("BP_LOG_LEVEL")) packit.Run( yarn.Detect(), yarn.Build( - entryResolver, dependencyManager, Generator{}, chronos.DefaultClock, From 781d4d932a29960823c18f3c1125fe4b8579ef1a Mon Sep 17 00:00:00 2001 From: Joshua Casey Date: Tue, 21 Jun 2022 16:09:02 -0500 Subject: [PATCH 8/8] Clarify readme --- README.md | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 29047b1..db5f307 100644 --- a/README.md +++ b/README.md @@ -22,17 +22,17 @@ file that looks like the following: # for deprecation. name = "yarn" - # The version of the Yarn dependency is not required. In the case it - # is not specified, the buildpack will provide the default version, which can - # be seen in the buildpack.toml file. - # If you wish to request a specific version, the buildpack supports - # specifying a semver constraint in the form of "1.*", "1.22.*", or even - # "1.22.4". - version = "1.22.4" - # The Yarn buildpack supports some non-required metadata options. [requires.metadata] + # The version of the Yarn dependency is not required. In the case it + # is not specified, the buildpack will provide the default version, which can + # be seen in the buildpack.toml file. + # If you wish to request a specific version, the buildpack supports + # specifying a semver constraint in the form of "1.*", "1.22.*", or even + # "1.22.4". + version = "1.22.4" + # Setting the build flag to true will ensure that the yarn # depdendency is available on the $PATH for subsequent buildpacks during # their build phase. If you are writing a buildpack that needs to run yarn @@ -50,15 +50,18 @@ file that looks like the following: To package this buildpack for consumption: -``` +```shell $ ./scripts/package.sh --version ``` This will create a `buildpackage.cnb` file under the `build` directory which you can use to build your app as follows: -``` -pack build -p -b -b build/buildpackage.cnb \ --b +```shell +pack build \ + --path \ + --buildpack \ + --buildpack build/buildpackage.cnb \ + --buildpack ``` Though the API of this buildpack does not require `node`, yarn is unusable without node. @@ -70,11 +73,11 @@ There are no extra configurations for this buildpack based on `buildpack.yml`. ## Run Tests To run all unit tests, run: -``` +```shell ./scripts/unit.sh ``` To run all integration tests, run: -``` +```shell /scripts/integration.sh ```