diff --git a/integration/helpers.go b/integration/helpers.go index a49bd28..ef013df 100644 --- a/integration/helpers.go +++ b/integration/helpers.go @@ -5,6 +5,14 @@ package integration_helpers +import ( + "errors" + "fmt" + "testing" + + "github.com/paketo-buildpacks/occam" +) + type Buildpack struct { ID string Name string @@ -58,3 +66,34 @@ func DependenciesForId(dependencies []Dependency, id string) []Dependency { return output } + +func NewRetryBuild(t *testing.T, retry int) RetryBuild { + return RetryBuild{t, retry} +} + +type RetryBuild struct { + t *testing.T + retry int +} + +func (r *RetryBuild) Execute(packBuild occam.PackBuild, name string, source string) (occam.Image, fmt.Stringer, error) { + var image occam.Image + var logs fmt.Stringer + var errs error + + for i := range r.retry + 1 { + if i > 0 { + r.t.Logf("Retry %v\n", i) + } + var err error + image, logs, err = packBuild.Execute(name, source) + if err == nil { + return image, logs, err + } else { + errs = errors.Join(errs, err) + r.t.Logf("Build failed: %v\n", err) + } + } + + return image, logs, errs +} diff --git a/integration/installers/miniconda_default_test.go b/integration/installers/miniconda_default_test.go index 842fbd0..8504675 100644 --- a/integration/installers/miniconda_default_test.go +++ b/integration/installers/miniconda_default_test.go @@ -16,6 +16,8 @@ import ( . "github.com/onsi/gomega" . "github.com/paketo-buildpacks/occam/matchers" + + integration_helpers "github.com/paketo-buildpacks/python-installers/integration" ) func minicondaTestDefault(t *testing.T, context spec.G, it spec.S) { @@ -23,6 +25,8 @@ func minicondaTestDefault(t *testing.T, context spec.G, it spec.S) { Expect = NewWithT(t).Expect Eventually = NewWithT(t).Eventually + retryBuild = integration_helpers.NewRetryBuild(t, 3) + pack occam.Pack docker occam.Docker ) @@ -64,13 +68,15 @@ func minicondaTestDefault(t *testing.T, context spec.G, it spec.S) { err error ) - image, logs, err = pack.WithNoColor().Build. + image, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, - ). - Execute(name, source) + ), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), logs.String) Expect(logs).To(ContainLines( @@ -134,7 +140,7 @@ func minicondaTestDefault(t *testing.T, context spec.G, it spec.S) { source, err = occam.Source(filepath.Join("testdata", "conda", "miniconda_app")) Expect(err).NotTo(HaveOccurred()) - image, logs, err = pack.WithNoColor().Build. + image, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, @@ -143,8 +149,10 @@ func minicondaTestDefault(t *testing.T, context spec.G, it spec.S) { WithEnv(map[string]string{ "BP_LOG_LEVEL": "DEBUG", }). - WithSBOMOutputDir(sbomDir). - Execute(name, source) + WithSBOMOutputDir(sbomDir), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), logs.String) container, err = docker.Container.Run. diff --git a/integration/installers/miniconda_offline_test.go b/integration/installers/miniconda_offline_test.go index ecf7076..cafe6cf 100644 --- a/integration/installers/miniconda_offline_test.go +++ b/integration/installers/miniconda_offline_test.go @@ -14,14 +14,19 @@ import ( "github.com/sclevine/spec" . "github.com/onsi/gomega" + + integration_helpers "github.com/paketo-buildpacks/python-installers/integration" ) func minicondaTestOffline(t *testing.T, context spec.G, it spec.S) { var ( Expect = NewWithT(t).Expect Eventually = NewWithT(t).Eventually - pack occam.Pack - docker occam.Docker + + retryBuild = integration_helpers.NewRetryBuild(t, 3) + + pack occam.Pack + docker occam.Docker ) it.Before(func() { @@ -58,14 +63,16 @@ func minicondaTestOffline(t *testing.T, context spec.G, it spec.S) { var err error var logs fmt.Stringer - image, logs, err = pack.WithNoColor().Build. + image, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Offline, settings.Buildpacks.BuildPlan.Online, ). - WithNetwork("none"). - Execute(name, source) + WithNetwork("none"), + name, + source, + ) Expect(err).NotTo(HaveOccurred(), logs.String()) diff --git a/integration/installers/miniconda_reuse_layer_test.go b/integration/installers/miniconda_reuse_layer_test.go index d39d55c..62c65a4 100644 --- a/integration/installers/miniconda_reuse_layer_test.go +++ b/integration/installers/miniconda_reuse_layer_test.go @@ -25,6 +25,8 @@ func minicondaTestLayerReuse(t *testing.T, context spec.G, it spec.S) { Expect = NewWithT(t).Expect Eventually = NewWithT(t).Eventually + retryBuild = integration_helpers.NewRetryBuild(t, 3) + pack occam.Pack docker occam.Docker @@ -77,13 +79,15 @@ func minicondaTestLayerReuse(t *testing.T, context spec.G, it spec.S) { secondContainer occam.Container ) - firstImage, logs, err = pack.WithNoColor().Build. + firstImage, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, - ). - Execute(name, source) + ), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), logs.String) imageIDs[firstImage.ID] = struct{}{} @@ -94,13 +98,15 @@ func minicondaTestLayerReuse(t *testing.T, context spec.G, it spec.S) { containerIDs[firstContainer.ID] = struct{}{} - secondImage, logs, err = pack.WithNoColor().Build. + secondImage, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, - ). - Execute(name, source) + ), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), logs.String) imageIDs[secondImage.ID] = struct{}{} @@ -151,14 +157,16 @@ func minicondaTestLayerReuse(t *testing.T, context spec.G, it spec.S) { dependencies := integration_helpers.DependenciesForId(buildpackInfo.Metadata.Dependencies, "miniconda3") - firstImage, logs, err = pack.WithNoColor().Build. + firstImage, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, ). - WithEnv(map[string]string{"BP_MINICONDA_VERSION": dependencies[0].Version}). - Execute(name, source) + WithEnv(map[string]string{"BP_MINICONDA_VERSION": dependencies[0].Version}), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), logs.String) imageIDs[firstImage.ID] = struct{}{} @@ -169,14 +177,16 @@ func minicondaTestLayerReuse(t *testing.T, context spec.G, it spec.S) { containerIDs[firstContainer.ID] = struct{}{} - secondImage, logs, err = pack.WithNoColor().Build. + secondImage, logs, err = retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, ). - WithEnv(map[string]string{"BP_MINICONDA_VERSION": dependencies[2].Version}). - Execute(name, source) + WithEnv(map[string]string{"BP_MINICONDA_VERSION": dependencies[2].Version}), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), logs.String) imageIDs[secondImage.ID] = struct{}{} diff --git a/integration/installers/miniconda_versions_test.go b/integration/installers/miniconda_versions_test.go index 2a1f6d8..f4b0ed8 100644 --- a/integration/installers/miniconda_versions_test.go +++ b/integration/installers/miniconda_versions_test.go @@ -25,6 +25,8 @@ func minicondaTestVersions(t *testing.T, context spec.G, it spec.S) { Expect = NewWithT(t).Expect Eventually = NewWithT(t).Eventually + retryBuild = integration_helpers.NewRetryBuild(t, 3) + pack occam.Pack docker occam.Docker ) @@ -76,14 +78,16 @@ func minicondaTestVersions(t *testing.T, context spec.G, it spec.S) { Expect(firstMinicondaVersion).NotTo(Equal(secondMinicondaVersion)) - firstImage, firstLogs, err := pack.WithNoColor().Build. + firstImage, firstLogs, err := retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, ). - WithEnv(map[string]string{miniconda.EnvVersion: firstMinicondaVersion}). - Execute(name, source) + WithEnv(map[string]string{miniconda.EnvVersion: firstMinicondaVersion}), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), firstLogs.String) imagesMap[firstImage.ID] = nil @@ -105,14 +109,16 @@ func minicondaTestVersions(t *testing.T, context spec.G, it spec.S) { return cLogs.String() }).Should(ContainSubstring(fmt.Sprintf(`conda %s`, firstMinicondaVersion))) - secondImage, secondLogs, err := pack.WithNoColor().Build. + secondImage, secondLogs, err := retryBuild.Execute(pack.WithNoColor().Build. WithPullPolicy("never"). WithBuildpacks( settings.Buildpacks.PythonInstallers.Online, settings.Buildpacks.BuildPlan.Online, ). - WithEnv(map[string]string{miniconda.EnvVersion: secondMinicondaVersion}). - Execute(name, source) + WithEnv(map[string]string{miniconda.EnvVersion: secondMinicondaVersion}), + name, + source, + ) Expect(err).ToNot(HaveOccurred(), secondLogs.String) imagesMap[secondImage.ID] = nil