From fd97b868589f44ab58c76eaf865acd88c928ff07 Mon Sep 17 00:00:00 2001 From: Javier Romero Date: Sun, 7 Apr 2019 15:35:29 -0500 Subject: [PATCH 1/2] suggest-builders command Signed-off-by: Javier Romero --- acceptance/acceptance_test.go | 12 +++++++++ cmd/pack/main.go | 1 + commands/build.go | 12 ++++----- commands/suggest_builders.go | 22 +++++++++++++++++ commands/suggest_builders_test.go | 41 +++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 commands/suggest_builders.go create mode 100644 commands/suggest_builders_test.go diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go index d1905bda8..3bd80ebb6 100644 --- a/acceptance/acceptance_test.go +++ b/acceptance/acceptance_test.go @@ -826,6 +826,18 @@ func testAcceptance(t *testing.T, when spec.G, it spec.S) { }) }) + when("pack suggest-builders", func() { + it("displays suggested builders", func() { + cmd := packCmd("suggest-builders") + output, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("suggest-builders command failed: %s: %s", output, err) + } + h.AssertContains(t, string(output), "Suggested builders:") + h.AssertContains(t, string(output), "cloudfoundry/cnb:bionic") + }) + }) + when("pack set-default-builder", func() { it("sets the default-stack-id in ~/.pack/config.toml", func() { cmd := packCmd("set-default-builder", "some/builder") diff --git a/cmd/pack/main.go b/cmd/pack/main.go index 898d4d05c..5cb11b31e 100644 --- a/cmd/pack/main.go +++ b/cmd/pack/main.go @@ -50,6 +50,7 @@ func main() { rootCmd.AddCommand(commands.SetRunImagesMirrors(&logger)) rootCmd.AddCommand(commands.InspectBuilder(&logger, &cfg, &client)) rootCmd.AddCommand(commands.SetDefaultBuilder(&logger)) + rootCmd.AddCommand(commands.SuggestBuilders(&logger)) rootCmd.AddCommand(commands.Version(&logger, Version)) diff --git a/commands/build.go b/commands/build.go index 02a5ec80e..8b491a3f4 100644 --- a/commands/build.go +++ b/commands/build.go @@ -90,16 +90,16 @@ func suggestSettingBuilder(logger *logging.Logger) { func suggestBuilders(logger *logging.Logger) { logger.Info("Suggested builders:\n") + tw := tabwriter.NewWriter(logger.RawWriter(), 10, 10, 5, ' ', tabwriter.TabIndent) - for len(suggestedBuilders) > 0 { - n := rand.Intn(len(suggestedBuilders)) - builders := suggestedBuilders[n] + for _, i := range rand.Perm(len(suggestedBuilders)) { + builders := suggestedBuilders[i] for _, builder := range builders { - tw.Write([]byte(fmt.Sprintf("\t%s:\t%s\t%s\t\n", builder.name, style.Symbol(builder.image), builder.info))) + _, _ = tw.Write([]byte(fmt.Sprintf("\t%s:\t%s\t%s\t\n", builder.name, style.Symbol(builder.image), builder.info))) } - suggestedBuilders = append(suggestedBuilders[:n], suggestedBuilders[n+1:]...) } - tw.Flush() + _ = tw.Flush() + logger.Info("") logger.Tip("Learn more about a specific builder with:\n") logger.Info("\tpack inspect-builder [builder image]") diff --git a/commands/suggest_builders.go b/commands/suggest_builders.go new file mode 100644 index 000000000..e5fc610d2 --- /dev/null +++ b/commands/suggest_builders.go @@ -0,0 +1,22 @@ +package commands + +import ( + "github.com/buildpack/pack/logging" + "github.com/spf13/cobra" +) + +func SuggestBuilders(logger *logging.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "suggest-builders", + Short: "Display list of builders recommended by the Cloud Native Buildpacks project", + Args: cobra.NoArgs, + RunE: logError(logger, func(cmd *cobra.Command, args []string) error { + suggestBuilders(logger) + + return nil + }), + } + + AddHelpFlag(cmd, "suggest-builders") + return cmd +} diff --git a/commands/suggest_builders_test.go b/commands/suggest_builders_test.go new file mode 100644 index 000000000..6cb07ddd1 --- /dev/null +++ b/commands/suggest_builders_test.go @@ -0,0 +1,41 @@ +package commands_test + +import ( + "bytes" + "testing" + + "github.com/sclevine/spec" + "github.com/sclevine/spec/report" + "github.com/spf13/cobra" + + "github.com/buildpack/pack/commands" + "github.com/buildpack/pack/logging" + h "github.com/buildpack/pack/testhelpers" +) + +func TestSuggestBuilders(t *testing.T) { + spec.Run(t, "Commands", testSuggestBuildersCommand, spec.Parallel(), spec.Report(report.Terminal{})) +} + +func testSuggestBuildersCommand(t *testing.T, when spec.G, it spec.S) { + + var ( + command *cobra.Command + logger *logging.Logger + outBuf bytes.Buffer + ) + + it.Before(func() { + logger = logging.NewLogger(&outBuf, &outBuf, false, false) + command = commands.SuggestBuilders(logger) + }) + + when("#SuggestBuilders", func() { + it("display suggested builders", func() { + command.SetArgs([]string{}) + h.AssertNil(t, command.Execute()) + h.AssertContains(t, outBuf.String(), "Suggested builders:") + h.AssertContains(t, outBuf.String(), "cloudfoundry/cnb:bionic") + }) + }) +} From 3f82a83631e4e717c81a87ca38368ac7fd060832 Mon Sep 17 00:00:00 2001 From: Javier Romero Date: Tue, 9 Apr 2019 12:52:46 -0500 Subject: [PATCH 2/2] Changes based on PR feedback Signed-off-by: Javier Romero --- commands/build.go | 47 ------------------------------------ commands/commands.go | 43 +++++++++++++++++++++++++++++++++ commands/suggest_builders.go | 2 +- 3 files changed, 44 insertions(+), 48 deletions(-) diff --git a/commands/build.go b/commands/build.go index 8b491a3f4..739faf3dd 100644 --- a/commands/build.go +++ b/commands/build.go @@ -1,11 +1,6 @@ package commands import ( - "fmt" - "math/rand" - "text/tabwriter" - "time" - "github.com/spf13/cobra" "github.com/buildpack/pack" @@ -15,25 +10,6 @@ import ( "github.com/buildpack/pack/style" ) -type suggestedBuilder struct { - name string - image string - info string -} - -var suggestedBuilders = [][]suggestedBuilder{ - { - {"Cloud Foundry", "cloudfoundry/cnb:bionic", "small base image with Java & Node.js"}, - {"Cloud Foundry", "cloudfoundry/cnb:cflinuxfs3", "larger base image with Java, Node.js & Python"}, - }, - { - {"Heroku", "heroku/buildpacks", "heroku-18 base image with official Heroku buildpacks"}, - }, -} - -func init() { - rand.Seed(time.Now().UnixNano()) -} func Build(logger *logging.Logger, fetcher pack.Fetcher) *cobra.Command { var buildFlags pack.BuildFlags @@ -82,29 +58,6 @@ func Build(logger *logging.Logger, fetcher pack.Fetcher) *cobra.Command { return cmd } -func suggestSettingBuilder(logger *logging.Logger) { - logger.Info("Please select a default builder with:\n") - logger.Info("\tpack set-default-builder \n") - suggestBuilders(logger) -} - -func suggestBuilders(logger *logging.Logger) { - logger.Info("Suggested builders:\n") - - tw := tabwriter.NewWriter(logger.RawWriter(), 10, 10, 5, ' ', tabwriter.TabIndent) - for _, i := range rand.Perm(len(suggestedBuilders)) { - builders := suggestedBuilders[i] - for _, builder := range builders { - _, _ = tw.Write([]byte(fmt.Sprintf("\t%s:\t%s\t%s\t\n", builder.name, style.Symbol(builder.image), builder.info))) - } - } - _ = tw.Flush() - - logger.Info("") - logger.Tip("Learn more about a specific builder with:\n") - logger.Info("\tpack inspect-builder [builder image]") -} - func buildCommandFlags(cmd *cobra.Command, buildFlags *pack.BuildFlags) { cmd.Flags().StringVarP(&buildFlags.AppDir, "path", "p", "", "Path to app dir (defaults to current working directory)") cmd.Flags().StringVar(&buildFlags.Builder, "builder", "", "Builder (defaults to builder configured by 'set-default-builder')") diff --git a/commands/commands.go b/commands/commands.go index e850e3d74..870d09f1b 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -3,15 +3,35 @@ package commands import ( "context" "fmt" + "github.com/buildpack/pack/style" + "math/rand" "os" "os/signal" "syscall" + "text/tabwriter" "github.com/spf13/cobra" "github.com/buildpack/pack/logging" ) + +type suggestedBuilder struct { + name string + image string + info string +} + +var suggestedBuilders = [][]suggestedBuilder{ + { + {"Cloud Foundry", "cloudfoundry/cnb:bionic", "small base image with Java & Node.js"}, + {"Cloud Foundry", "cloudfoundry/cnb:cflinuxfs3", "larger base image with Java, Node.js & Python"}, + }, + { + {"Heroku", "heroku/buildpacks", "heroku-18 base image with official Heroku buildpacks"}, + }, +} + // TODO: Check if most recent cobra version fixed bug in help strings. It was not always capitalizing the first // letter in the help string. If it's fixed, we can remove this. func AddHelpFlag(cmd *cobra.Command, commandName string) { @@ -49,3 +69,26 @@ func createCancellableContext() context.Context { return ctx } + +func suggestSettingBuilder(logger *logging.Logger) { + logger.Info("Please select a default builder with:\n") + logger.Info("\tpack set-default-builder \n") + suggestBuilders(logger) +} + +func suggestBuilders(logger *logging.Logger) { + logger.Info("Suggested builders:\n") + + tw := tabwriter.NewWriter(logger.RawWriter(), 10, 10, 5, ' ', tabwriter.TabIndent) + for _, i := range rand.Perm(len(suggestedBuilders)) { + builders := suggestedBuilders[i] + for _, builder := range builders { + _, _ = tw.Write([]byte(fmt.Sprintf("\t%s:\t%s\t%s\t\n", builder.name, style.Symbol(builder.image), builder.info))) + } + } + _ = tw.Flush() + + logger.Info("") + logger.Tip("Learn more about a specific builder with:\n") + logger.Info("\tpack inspect-builder [builder image]") +} diff --git a/commands/suggest_builders.go b/commands/suggest_builders.go index e5fc610d2..def1a870d 100644 --- a/commands/suggest_builders.go +++ b/commands/suggest_builders.go @@ -8,7 +8,7 @@ import ( func SuggestBuilders(logger *logging.Logger) *cobra.Command { cmd := &cobra.Command{ Use: "suggest-builders", - Short: "Display list of builders recommended by the Cloud Native Buildpacks project", + Short: "Display list of recommended builders", Args: cobra.NoArgs, RunE: logError(logger, func(cmd *cobra.Command, args []string) error { suggestBuilders(logger)