feat: add proper support for various buildpack urls

Transform the urls to the correct values when necessary, and validate them otherwise.

Closes #3923
This commit is contained in:
Jose Diaz-Gonzalez
2020-04-07 00:14:52 -04:00
parent 5917105e4e
commit 93225ada48
2 changed files with 111 additions and 22 deletions

View File

@@ -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 {

View File

@@ -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"