From dfefdab67ca42be5de6af71e6940bf30c0e92f32 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 7 Jan 2019 07:04:02 -0500 Subject: [PATCH] refactor: simplify script execution The previous method had a few too many nested if statements, making it difficult to track when and where the function stopped executing. --- plugins/app-json/internal-functions | 145 ++++++++++++++-------------- 1 file changed, 75 insertions(+), 70 deletions(-) diff --git a/plugins/app-json/internal-functions b/plugins/app-json/internal-functions index c38ed2828..1a16d4496 100755 --- a/plugins/app-json/internal-functions +++ b/plugins/app-json/internal-functions @@ -32,75 +32,80 @@ execute_script() { IMAGE=$(get_deploying_app_image_name "$APP" "$IMAGE_TAG") local SCRIPT_CMD=$(get_phase_script "$IMAGE" "$PHASE_SCRIPT_KEY" 2>/dev/null) - if [[ -n "$SCRIPT_CMD" ]]; then - dokku_log_info1 "Running '$SCRIPT_CMD' in app container" - local COMMAND - COMMAND="set -eo pipefail; [[ \$DOKKU_TRACE ]] && set -x ; " - COMMAND+=" if [[ -d '/app' ]]; then " - COMMAND+=" export HOME=/app ; " - COMMAND+=" cd \$HOME ; " - COMMAND+=" fi ; " - COMMAND+=" if [[ -d '/app/.profile.d' ]]; then " - COMMAND+=" for file in /app/.profile.d/*; do source \$file; done ; " - COMMAND+=" fi ; " - COMMAND+=" if [[ -d '/cache' ]]; then " - COMMAND+=" echo restoring installation cache... ; " - COMMAND+=" rm -rf /tmp/cache ; " - COMMAND+=" ln -sf /cache /tmp/cache ; " - COMMAND+=" fi ; " - - if [[ "$SCRIPT_CMD" == /* ]]; then - local SCRIPT_BIN="$(echo "$SCRIPT_CMD" | cut -d' ' -f1)" - COMMAND+=" if [[ ! -x \"$SCRIPT_BIN\" ]]; then " - COMMAND+=" echo specified binary is not executable ; " - COMMAND+=" exit 1 ; " - COMMAND+=" fi " - fi - - COMMAND+=" $SCRIPT_CMD || exit 1;" - COMMAND+=" if [[ -d '/cache' ]]; then " - COMMAND+=" echo removing installation cache... ; " - COMMAND+=" rm -f /tmp/cache ; " - COMMAND+=" fi " - - local CACHE_DIR="$DOKKU_ROOT/$APP/cache" - local CACHE_HOST_DIR="$DOKKU_HOST_ROOT/$APP/cache" - [[ -d $CACHE_DIR ]] || mkdir -p "$CACHE_DIR" - - local DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG") - # strip --restart args from DOCKER_ARGS - local DOCKER_ARGS=$(sed -e "s/--restart=[[:graph:]]\+[[:blank:]]\?//g" <<<"$DOCKER_ARGS") - - # eval args as array to respect escapes - declare -a ARG_ARRAY - eval "ARG_ARRAY=($DOCKER_ARGS)" - - local DOKKU_APP_SHELL="/bin/bash" - DOKKU_APP_SHELL="$(config_get --global DOKKU_APP_SHELL || echo "$DOKKU_APP_SHELL")" - DOKKU_APP_SHELL="$(config_get "$APP" DOKKU_APP_SHELL || echo "$DOKKU_APP_SHELL")" - [[ -z "$DOKKU_APP_SHELL" ]] && DOKKU_APP_SHELL="/bin/bash" - - id=$(docker run "$DOKKU_GLOBAL_RUN_ARGS" -e DOKKU_TRACE="$DOKKU_TRACE" --label=dokku_phase_script="${PHASE_SCRIPT_KEY}" -d -v "$CACHE_HOST_DIR:/cache" "${ARG_ARRAY[@]}" "$IMAGE" "$DOKKU_APP_SHELL" -c "$COMMAND") - if test "$(docker wait "$id")" -eq 0; then - dokku_container_log_verbose_quiet "$id" - if [[ "$PHASE_SCRIPT_KEY" != "postdeploy" ]]; then - if ! is_image_herokuish_based "$IMAGE"; then - local DOKKU_DOCKERFILE_ENTRYPOINT=$(config_get "$APP" DOKKU_DOCKERFILE_ENTRYPOINT) - local DOKKU_DOCKERFILE_CMD=$(config_get "$APP" DOKKU_DOCKERFILE_CMD) - [[ -z "$DOKKU_DOCKERFILE_ENTRYPOINT" ]] && DOKKU_DOCKERFILE_ENTRYPOINT="$(get_entrypoint_from_image "$IMAGE")" - [[ -z "$DOKKU_DOCKERFILE_CMD" ]] && DOKKU_DOCKERFILE_CMD="$(get_cmd_from_image "$IMAGE")" - - [[ -n "$DOKKU_DOCKERFILE_ENTRYPOINT" ]] && local DOCKER_COMMIT_ENTRYPOINT_CHANGE_ARG="--change='$DOKKU_DOCKERFILE_ENTRYPOINT'" - [[ -n "$DOKKU_DOCKERFILE_CMD" ]] && local DOCKER_COMMIT_CMD_CHANGE_ARG="--change='$DOKKU_DOCKERFILE_CMD'" - - local DOCKER_COMMIT_ARGS="$DOCKER_COMMIT_ENTRYPOINT_CHANGE_ARG $DOCKER_COMMIT_CMD_CHANGE_ARG" - fi - # shellcheck disable=SC2086 - eval docker commit $DOCKER_COMMIT_ARGS "$id" "$IMAGE" >/dev/null - fi - else - dokku_container_log_verbose_quiet "$id" - dokku_log_fail "execution of '$SCRIPT_CMD' failed!" - fi + if [[ -z "$SCRIPT_CMD" ]]; then + return fi + + dokku_log_info1 "Running '$SCRIPT_CMD' in app container" + local COMMAND + COMMAND="set -eo pipefail; [[ \$DOKKU_TRACE ]] && set -x ; " + COMMAND+=" if [[ -d '/app' ]]; then " + COMMAND+=" export HOME=/app ; " + COMMAND+=" cd \$HOME ; " + COMMAND+=" fi ; " + COMMAND+=" if [[ -d '/app/.profile.d' ]]; then " + COMMAND+=" for file in /app/.profile.d/*; do source \$file; done ; " + COMMAND+=" fi ; " + COMMAND+=" if [[ -d '/cache' ]]; then " + COMMAND+=" echo restoring installation cache... ; " + COMMAND+=" rm -rf /tmp/cache ; " + COMMAND+=" ln -sf /cache /tmp/cache ; " + COMMAND+=" fi ; " + + if [[ "$SCRIPT_CMD" == /* ]]; then + local SCRIPT_BIN="$(echo "$SCRIPT_CMD" | cut -d' ' -f1)" + COMMAND+=" if [[ ! -x \"$SCRIPT_BIN\" ]]; then " + COMMAND+=" echo specified binary is not executable ; " + COMMAND+=" exit 1 ; " + COMMAND+=" fi " + fi + + COMMAND+=" $SCRIPT_CMD || exit 1;" + COMMAND+=" if [[ -d '/cache' ]]; then " + COMMAND+=" echo removing installation cache... ; " + COMMAND+=" rm -f /tmp/cache ; " + COMMAND+=" fi " + + local CACHE_DIR="$DOKKU_ROOT/$APP/cache" + local CACHE_HOST_DIR="$DOKKU_HOST_ROOT/$APP/cache" + [[ -d $CACHE_DIR ]] || mkdir -p "$CACHE_DIR" + + local DOCKER_ARGS=$(: | plugn trigger docker-args-deploy "$APP" "$IMAGE_TAG") + # strip --restart args from DOCKER_ARGS + local DOCKER_ARGS=$(sed -e "s/--restart=[[:graph:]]\+[[:blank:]]\?//g" <<<"$DOCKER_ARGS") + + # eval args as array to respect escapes + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + + local DOKKU_APP_SHELL="/bin/bash" + DOKKU_APP_SHELL="$(config_get --global DOKKU_APP_SHELL || echo "$DOKKU_APP_SHELL")" + DOKKU_APP_SHELL="$(config_get "$APP" DOKKU_APP_SHELL || echo "$DOKKU_APP_SHELL")" + [[ -z "$DOKKU_APP_SHELL" ]] && DOKKU_APP_SHELL="/bin/bash" + + id=$(docker run "$DOKKU_GLOBAL_RUN_ARGS" -e DOKKU_TRACE="$DOKKU_TRACE" --label=dokku_phase_script="${PHASE_SCRIPT_KEY}" -d -v "$CACHE_HOST_DIR:/cache" "${ARG_ARRAY[@]}" "$IMAGE" "$DOKKU_APP_SHELL" -c "$COMMAND") + if test "$(docker wait "$id")" -ne 0; then + dokku_container_log_verbose_quiet "$id" + dokku_log_fail "execution of '$SCRIPT_CMD' failed!" + fi + + dokku_container_log_verbose_quiet "$id" + if [[ "$PHASE_SCRIPT_KEY" != "predeploy" ]]; then + return + fi + + if ! is_image_herokuish_based "$IMAGE"; then + local DOKKU_DOCKERFILE_ENTRYPOINT=$(config_get "$APP" DOKKU_DOCKERFILE_ENTRYPOINT) + local DOKKU_DOCKERFILE_CMD=$(config_get "$APP" DOKKU_DOCKERFILE_CMD) + [[ -z "$DOKKU_DOCKERFILE_ENTRYPOINT" ]] && DOKKU_DOCKERFILE_ENTRYPOINT="$(get_entrypoint_from_image "$IMAGE")" + [[ -z "$DOKKU_DOCKERFILE_CMD" ]] && DOKKU_DOCKERFILE_CMD="$(get_cmd_from_image "$IMAGE")" + + [[ -n "$DOKKU_DOCKERFILE_ENTRYPOINT" ]] && local DOCKER_COMMIT_ENTRYPOINT_CHANGE_ARG="--change='$DOKKU_DOCKERFILE_ENTRYPOINT'" + [[ -n "$DOKKU_DOCKERFILE_CMD" ]] && local DOCKER_COMMIT_CMD_CHANGE_ARG="--change='$DOKKU_DOCKERFILE_CMD'" + + local DOCKER_COMMIT_ARGS="$DOCKER_COMMIT_ENTRYPOINT_CHANGE_ARG $DOCKER_COMMIT_CMD_CHANGE_ARG" + fi + + # shellcheck disable=SC2086 + eval docker commit $DOCKER_COMMIT_ARGS "$id" "$IMAGE" >/dev/null }