diff --git a/plugins/common/functions b/plugins/common/functions index b7fe733cf..a4e354fb3 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -687,7 +687,6 @@ release_and_deploy() { local DOKKU_SKIP_DEPLOY=${DOKKU_APP_SKIP_DEPLOY:="$DOKKU_GLOBAL_SKIP_DEPLOY"} dokku_log_info1 "Releasing $APP..." - plugn trigger pre-deploy "$APP" "$IMAGE_TAG" dokku_release "$APP" "$IMAGE_SOURCE_TYPE" "$IMAGE_TAG" if [[ "$DOKKU_SKIP_DEPLOY" != "true" ]]; then diff --git a/plugins/registry/triggers.go b/plugins/registry/triggers.go index 547955150..7167c8421 100644 --- a/plugins/registry/triggers.go +++ b/plugins/registry/triggers.go @@ -56,6 +56,12 @@ func TriggerPostDelete(appName string) error { // TriggerPostReleaseBuilder pushes the image to the remote registry func TriggerPostReleaseBuilder(appName string, image string) error { + parts := strings.Split(image, ":") + imageTag := parts[len(parts)-1] + if err := common.PlugnTrigger("pre-deploy", []string{appName, imageTag}...); err != nil { + return err + } + imageID, _ := common.DockerInspect(image, "{{ .Id }}") imageRepo := common.GetAppImageRepo(appName) computedImageRepo := reportComputedImageRepo(appName) @@ -73,10 +79,10 @@ func TriggerPostReleaseBuilder(appName string, image string) error { } common.LogInfo1("Pushing image to registry") - imageTag, err := incrementTagVersion(appName) + newTag, err := incrementTagVersion(appName) if err != nil { return err } - return pushToRegistry(appName, imageTag, imageID, computedImageRepo) + return pushToRegistry(appName, newTag, imageID, computedImageRepo) } diff --git a/plugins/scheduler-docker-local/internal-functions b/plugins/scheduler-docker-local/internal-functions index d8355137a..889509c05 100755 --- a/plugins/scheduler-docker-local/internal-functions +++ b/plugins/scheduler-docker-local/internal-functions @@ -235,3 +235,13 @@ fn-scheduler-docker-local-register-retired() { echo "${APP} ${DOCKER_ID} ${DEAD_TIME}" >>"${DEAD_FILE}" fi } + +fn-scheduler-docker-local-start-app-container() { + declare desc="starts a single app container" + declare APP="$1" DOCKER_ARGS="$2" + + declare -a __DOKKU_DOCKER_ARG_ARRAY + eval "__DOKKU_DOCKER_ARG_ARRAY=($DOCKER_ARGS)" + eval "$(config_export app "$APP" --merged)" + "$DOCKER_BIN" container create "${__DOKKU_DOCKER_ARG_ARRAY[@]}" +} diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy index 3605794a6..50c51f04d 100755 --- a/plugins/scheduler-docker-local/scheduler-deploy +++ b/plugins/scheduler-docker-local/scheduler-deploy @@ -115,7 +115,7 @@ trigger-scheduler-docker-local-scheduler-deploy() { DOCKER_ARGS+=" $IMAGE " DOCKER_ARGS+=" $START_CMD " - cid=$(fn-start-app-container "$DOCKER_ARGS") + cid=$(fn-scheduler-docker-local-start-app-container "$APP" "$DOCKER_ARGS") plugn trigger post-container-create "app" "$cid" "$APP" "deploy" "$PROC_TYPE" "$DOCKER_BIN" container start "$cid" >/dev/null || true @@ -222,14 +222,4 @@ fn-scheduler-docker-local-extract-start-cmd() { echo "$START_CMD" } -fn-start-app-container() { - declare desc="starts a single app container" - declare DOCKER_ARGS="$1" - - declare -a __DOKKU_DOCKER_ARG_ARRAY - eval "__DOKKU_DOCKER_ARG_ARRAY=($DOCKER_ARGS)" - eval "$(config_export app "$APP")" - "$DOCKER_BIN" container create "${__DOKKU_DOCKER_ARG_ARRAY[@]}" -} - trigger-scheduler-docker-local-scheduler-deploy "$@" diff --git a/plugins/scheduler-docker-local/scheduler-run b/plugins/scheduler-docker-local/scheduler-run index 2cbbb872c..eb0239834 100755 --- a/plugins/scheduler-docker-local/scheduler-run +++ b/plugins/scheduler-docker-local/scheduler-run @@ -3,6 +3,7 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" +source "$PLUGIN_AVAILABLE_PATH/scheduler-docker-local/internal-functions" trigger-scheduler-docker-local-scheduler-run() { declare desc="runs command in container based on app image" @@ -50,23 +51,21 @@ trigger-scheduler-docker-local-scheduler-run() { DOCKER_ARGS+=" --rm" fi has_tty && DOCKER_ARGS+=" --interactive --tty" - # the output of docker-args-run is possibly quoted/escaped so eval to normalize - declare -a DOCKER_ARGS_ARRAY - eval "DOCKER_ARGS_ARRAY=($DOCKER_ARGS)" for env_pair in "${RUN_ENV[@]}"; do - DOCKER_ARGS_ARRAY+=("--env=$env_pair") + DOCKER_ARGS+=" --env=$env_pair" done if [[ -n "$DOKKU_GLOBAL_FLAGS" ]]; then read -ra flags <<<"$DOKKU_GLOBAL_FLAGS" for flag in "${flags[@]}"; do if [[ "$flag" =~ ^--label.* ]]; then - DOCKER_ARGS_ARRAY+=("$flag") + DOCKER_ARGS+=" $flag" fi done fi [[ "$IMAGE_SOURCE_TYPE" == "herokuish" ]] && local EXEC_CMD="/exec" + is_image_cnb_based "$IMAGE" && EXEC_CMD="" POTENTIAL_PROCFILE_KEY="$1" PROC_CMD=$(plugn trigger procfile-get-command "$APP" "$POTENTIAL_PROCFILE_KEY" "5000" 2>/dev/null || echo '') @@ -76,8 +75,14 @@ trigger-scheduler-docker-local-scheduler-run() { set -- "$PROC_CMD" "${@:2}" fi - # shellcheck disable=SC2086 - CONTAINER_ID="$("$DOCKER_BIN" container create --label=com.dokku.container-type=$PROCESS_TYPE "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS "${DOCKER_ARGS_ARRAY[@]}" $IMAGE $EXEC_CMD "$@")" + # shellcheck disable=SC2124 + DOCKER_ARGS+=" --label=com.dokku.container-type=$PROCESS_TYPE ${DOCKER_RUN_LABEL_ARGS[@]} $DOKKU_GLOBAL_RUN_ARGS" + DOCKER_ARGS+=" $IMAGE " + DOCKER_ARGS+=" $EXEC_CMD " + # shellcheck disable=SC2124 + DOCKER_ARGS+=" $@" + + CONTAINER_ID=$(fn-scheduler-docker-local-start-app-container "$APP" "$DOCKER_ARGS") plugn trigger post-container-create "app" "$CONTAINER_ID" "$APP" "run" declare -a DOCKER_START_ARGS_ARRAY diff --git a/tests/apps/python/release.py b/tests/apps/python/release.py index afa731b5f..0d3a37e58 100644 --- a/tests/apps/python/release.py +++ b/tests/apps/python/release.py @@ -3,6 +3,7 @@ import os def main(): + print("GLOBAL_SECRET: {0}".format(os.getenv('GLOBAL_SECRET'))) print("SECRET_KEY: {0}".format(os.getenv('SECRET_KEY'))) diff --git a/tests/unit/app-json.bats b/tests/unit/app-json.bats index 39f406bd9..210b8bde0 100644 --- a/tests/unit/app-json.bats +++ b/tests/unit/app-json.bats @@ -2,11 +2,7 @@ load test_helper setup_file() { - if ! command -v "pack" &>/dev/null; then - add-apt-repository --yes ppa:cncf-buildpacks/pack-cli - apt-get update - apt-get --yes install pack-cli - fi + install_pack } setup() { @@ -66,7 +62,38 @@ teardown() { assert_success } +@test "(app-json) app.json herokuish release" { + run /bin/bash -c "dokku config:set --no-restart --global GLOBAL_SECRET=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku config:set --no-restart $TEST_APP SECRET_KEY=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run deploy_app python dokku@dokku.me:$TEST_APP add_requirements_txt + echo "output: $output" + echo "status: $status" + assert_success + assert_output_contains "Executing release task from Procfile" + assert_output_contains "SECRET_KEY: fjdkslafjdk" + + run /bin/bash -c "curl $(dokku url $TEST_APP)/env" + echo "output: $output" + echo "status: $status" + assert_success + assert_output_contains '"GLOBAL_SECRET": "fjdkslafjdk"' + assert_output_contains '"SECRET_KEY": "fjdkslafjdk"' +} + @test "(app-json) app.json cnb release" { + run /bin/bash -c "dokku config:set --no-restart --global GLOBAL_SECRET=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + run /bin/bash -c "dokku config:set --no-restart $TEST_APP DOKKU_CNB_EXPERIMENTAL=1 SECRET_KEY=fjdkslafjdk" echo "output: $output" echo "status: $status" @@ -83,6 +110,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success + assert_output_contains '"GLOBAL_SECRET": "fjdkslafjdk"' assert_output_contains '"SECRET_KEY": "fjdkslafjdk"' } diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index 3835fcd03..46e13eeb5 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -3,11 +3,7 @@ load test_helper setup_file() { - if ! command -v "pack" &>/dev/null; then - add-apt-repository --yes ppa:cncf-buildpacks/pack-cli - apt-get update - apt-get --yes install pack-cli - fi + install_pack } setup() { diff --git a/tests/unit/ps-cnb.bats b/tests/unit/ps-cnb.bats index 7d98ba0a6..5abbbb1bd 100644 --- a/tests/unit/ps-cnb.bats +++ b/tests/unit/ps-cnb.bats @@ -3,11 +3,7 @@ load test_helper setup_file() { - if ! command -v "pack" &>/dev/null; then - add-apt-repository --yes ppa:cncf-buildpacks/pack-cli - apt-get update - apt-get --yes install pack-cli - fi + install_pack } setup() { diff --git a/tests/unit/run_1.bats b/tests/unit/run_1.bats index 2b16b4943..d157ef4f0 100644 --- a/tests/unit/run_1.bats +++ b/tests/unit/run_1.bats @@ -2,6 +2,10 @@ load test_helper +setup_file() { + install_pack +} + setup() { global_setup create_app @@ -27,11 +31,58 @@ teardown() { assert_success } -@test "(run) run (with --env / -e)" { - deploy_app +@test "(run) run herokuish (with --env / -e)" { + run /bin/bash -c "dokku config:set --no-restart --global GLOBAL_SECRET=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku config:set --no-restart $TEST_APP SECRET_KEY=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run deploy_app python dokku@dokku.me:$TEST_APP add_requirements_txt + echo "output: $output" + echo "status: $status" + assert_success + run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST=testvalue'" echo "output: $output" echo "status: $status" + assert_success + + run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST2=testvalue2'" + echo "output: $output" + echo "status: $status" + assert_success +} + +@test "(run) run cnb (with --env / -e)" { + run /bin/bash -c "dokku config:set --no-restart --global GLOBAL_SECRET=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku config:set --no-restart $TEST_APP DOKKU_CNB_EXPERIMENTAL=1 SECRET_KEY=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run deploy_app python dokku@dokku.me:$TEST_APP add_requirements_txt + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST=testvalue'" + echo "output: $output" + echo "status: $status" + assert_success run /bin/bash -c "dokku run --env TEST=testvalue -e TEST2=testvalue2 $TEST_APP env | grep -E '^TEST2=testvalue2'" echo "output: $output" diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index 69ac92f55..254c2d0c0 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -577,3 +577,11 @@ detach_delete_network() { detach_network "$NETWORK_NAME" delete_network "$NETWORK_NAME" } + +install_pack() { + if ! command -v "pack" &>/dev/null; then + add-apt-repository --yes ppa:cncf-buildpacks/pack-cli + apt-get update + apt-get --yes install pack-cli + fi +}