From 93225ada485b6d8f6aa447289cf5dd8dd31b1622 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 7 Apr 2020 00:14:52 -0400 Subject: [PATCH] feat: add proper support for various buildpack urls Transform the urls to the correct values when necessary, and validate them otherwise. Closes #3923 --- plugins/buildpacks/subcommands.go | 37 ++++++++++-- tests/unit/30_buildpacks.bats | 96 +++++++++++++++++++++++++------ 2 files changed, 111 insertions(+), 22 deletions(-) diff --git a/plugins/buildpacks/subcommands.go b/plugins/buildpacks/subcommands.go index 0a0b4eb44..7335d0ca3 100644 --- a/plugins/buildpacks/subcommands.go +++ b/plugins/buildpacks/subcommands.go @@ -3,11 +3,31 @@ package buildpacks import ( "errors" "fmt" + "regexp" "strings" "github.com/dokku/dokku/plugins/common" ) +func validBuildpackURL(buildpack string) (string, error) { + if buildpack == "" { + return buildpack, errors.New("Must specify a buildpack to add") + } + + reHerokuValue := regexp.MustCompile(`(?m)^([\w]+\/[\w]+)$`) + if found := reHerokuValue.Find([]byte(buildpack)); found != nil { + parts := strings.SplitN(buildpack, "/", 2) + return fmt.Sprintf("https://github.com/%s/heroku-buildpack-%s.git", parts[0], parts[1]), nil + } + + reString := regexp.MustCompile(`(?m)^(http|https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+)(.git(#derp)?)?$`) + if found := reString.Find([]byte(buildpack)); found != nil { + return buildpack, nil + } + + return buildpack, fmt.Errorf("Invalid buildpack specified: %v", buildpack) +} + // CommandAdd implements buildpacks:add func CommandAdd(args []string, index int) (err error) { var appName string @@ -20,8 +40,10 @@ func CommandAdd(args []string, index int) (err error) { if len(args) >= 2 { buildpack = args[1] } - if buildpack == "" { - return errors.New("Must specify a buildpack to add") + + buildpack, err = validBuildpackURL(buildpack) + if err != nil { + return err } err = common.PropertyListAdd("buildpacks", appName, "buildpacks", buildpack, index) @@ -82,6 +104,11 @@ func CommandRemove(args []string, index int) (err error) { return } + buildpack, err = validBuildpackURL(buildpack) + if err != nil { + return err + } + var buildpacks []string buildpacks, err = common.PropertyListGet("buildpacks", appName, "buildpacks") if err != nil { @@ -152,8 +179,10 @@ func CommandSet(args []string, index int) (err error) { if len(args) >= 2 { buildpack = args[1] } - if buildpack == "" { - return errors.New("Must specify a buildpack to add") + + buildpack, err = validBuildpackURL(buildpack) + if err != nil { + return err } if index > 0 { diff --git a/tests/unit/30_buildpacks.bats b/tests/unit/30_buildpacks.bats index b8e697c94..c45794699 100644 --- a/tests/unit/30_buildpacks.bats +++ b/tests/unit/30_buildpacks.bats @@ -24,7 +24,34 @@ teardown() { assert_output "$help_output" } -@test "(buildpacks) buildpacks:add" { +@test "(buildpacks) buildpacks:add - failure" { + run /bin/bash -c "dokku buildpacks:add $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:add $TEST_APP nodejs" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:add $TEST_APP /nodejs" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:add $TEST_APP /nodejs" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:add $TEST_APP http://nodejs" + echo "output: $output" + echo "status: $status" + assert_failure +} + +@test "(buildpacks) buildpacks:add - success" { run /bin/bash -c "dokku buildpacks:add $TEST_APP heroku/nodejs" echo "output: $output" echo "status: $status" @@ -33,7 +60,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output_contains "heroku/nodejs" + assert_output_contains "https://github.com/heroku/heroku-buildpack-nodejs.git" run /bin/bash -c "dokku buildpacks:add $TEST_APP heroku/ruby" echo "output: $output" @@ -43,7 +70,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/nodejs heroku/ruby" + assert_output "https://github.com/heroku/heroku-buildpack-nodejs.git https://github.com/heroku/heroku-buildpack-ruby.git" run /bin/bash -c "dokku buildpacks:add --index 1 $TEST_APP heroku/golang" echo "output: $output" @@ -53,7 +80,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/golang heroku/nodejs heroku/ruby" + assert_output "https://github.com/heroku/heroku-buildpack-golang.git https://github.com/heroku/heroku-buildpack-nodejs.git https://github.com/heroku/heroku-buildpack-ruby.git" run /bin/bash -c "dokku buildpacks:add --index 2 $TEST_APP heroku/python" echo "output: $output" @@ -63,7 +90,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/golang heroku/python heroku/nodejs heroku/ruby" + assert_output "https://github.com/heroku/heroku-buildpack-golang.git https://github.com/heroku/heroku-buildpack-python.git https://github.com/heroku/heroku-buildpack-nodejs.git https://github.com/heroku/heroku-buildpack-ruby.git" run /bin/bash -c "dokku buildpacks:add --index 100 $TEST_APP heroku/php" echo "output: $output" @@ -73,10 +100,37 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/golang heroku/python heroku/nodejs heroku/ruby heroku/php" + assert_output "https://github.com/heroku/heroku-buildpack-golang.git https://github.com/heroku/heroku-buildpack-python.git https://github.com/heroku/heroku-buildpack-nodejs.git https://github.com/heroku/heroku-buildpack-ruby.git https://github.com/heroku/heroku-buildpack-php.git" } -@test "(buildpacks) buildpacks:set" { +@test "(buildpacks) buildpacks:set - failure" { + run /bin/bash -c "dokku buildpacks:set $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:set $TEST_APP nodejs" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:set $TEST_APP /nodejs" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:set $TEST_APP /nodejs" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:set $TEST_APP http://nodejs" + echo "output: $output" + echo "status: $status" + assert_failure +} + +@test "(buildpacks) buildpacks:set - success" { run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs" echo "output: $output" echo "status: $status" @@ -85,7 +139,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output_contains "heroku/nodejs" + assert_output_contains "https://github.com/heroku/heroku-buildpack-nodejs.git" run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/ruby" echo "output: $output" @@ -95,7 +149,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/ruby" + assert_output "https://github.com/heroku/heroku-buildpack-ruby.git" run /bin/bash -c "dokku buildpacks:set --index 1 $TEST_APP heroku/golang" echo "output: $output" @@ -105,7 +159,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/golang" + assert_output "https://github.com/heroku/heroku-buildpack-golang.git" run /bin/bash -c "dokku buildpacks:set --index 2 $TEST_APP heroku/python" echo "output: $output" @@ -115,7 +169,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/golang heroku/python" + assert_output "https://github.com/heroku/heroku-buildpack-golang.git https://github.com/heroku/heroku-buildpack-python.git" run /bin/bash -c "dokku buildpacks:set --index 100 $TEST_APP heroku/php" echo "output: $output" @@ -125,7 +179,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output "heroku/golang heroku/python heroku/php" + assert_output "https://github.com/heroku/heroku-buildpack-golang.git https://github.com/heroku/heroku-buildpack-python.git https://github.com/heroku/heroku-buildpack-php.git" } @test "(buildpacks) buildpacks:remove" { @@ -142,7 +196,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output_contains "heroku/nodejs heroku/ruby" + assert_output_contains "https://github.com/heroku/heroku-buildpack-nodejs.git https://github.com/heroku/heroku-buildpack-ruby.git" run /bin/bash -c "dokku buildpacks:remove $TEST_APP heroku/nodejs" echo "output: $output" @@ -152,7 +206,7 @@ teardown() { run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" echo "output: $output" echo "status: $status" - assert_output_contains "heroku/ruby" + assert_output_contains "https://github.com/heroku/heroku-buildpack-ruby.git" run /bin/bash -c "dokku buildpacks:remove $TEST_APP heroku/php" echo "output: $output" @@ -209,10 +263,6 @@ teardown() { } @test "(buildpacks) buildpacks deploy" { - echo "output: $output" - echo "status: $status" - assert_success - create_app echo "output: $output" echo "status: $status" @@ -228,6 +278,16 @@ teardown() { echo "status: $status" assert_success + run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku ps:rebuild $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + run destroy_app echo "output: $output" echo "status: $status"