From 0a8d5eb744907eb9855ae02282aff365c1fd82e2 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Tue, 30 Jul 2019 14:29:48 -0400 Subject: [PATCH] refactor: add initial support for builder plugins A builder plugin implements some method for 'building' artifacts from a given source code archive. This refactor moves the majority of the image building code into separate plugins, allowing us to implement other builders, but also simplifying the common pugin codebase. Also move the pre-build-buildpack hook from the build-env plugin to builder-herokuish. --- docs/development/plugin-triggers.md | 30 +++++ plugins/20_events/builder-build | 1 + plugins/20_events/builder-release | 1 + plugins/build-env/plugin.toml | 4 - plugins/builder-dockerfile/builder-build | 45 ++++++++ plugins/builder-dockerfile/builder-release | 19 +++ plugins/builder-dockerfile/plugin.toml | 4 + plugins/builder-herokuish/builder-build | 50 ++++++++ plugins/builder-herokuish/builder-release | 36 ++++++ .../docker-args-build | 6 +- .../docker-args-deploy | 0 .../docker-args-run | 0 plugins/builder-herokuish/plugin.toml | 4 + .../pre-build-buildpack | 24 ++-- plugins/common/functions | 109 +----------------- 15 files changed, 209 insertions(+), 124 deletions(-) create mode 120000 plugins/20_events/builder-build create mode 120000 plugins/20_events/builder-release delete mode 100644 plugins/build-env/plugin.toml create mode 100755 plugins/builder-dockerfile/builder-build create mode 100755 plugins/builder-dockerfile/builder-release create mode 100644 plugins/builder-dockerfile/plugin.toml create mode 100755 plugins/builder-herokuish/builder-build create mode 100755 plugins/builder-herokuish/builder-release rename plugins/{00_dokku-standard => builder-herokuish}/docker-args-build (73%) rename plugins/{00_dokku-standard => builder-herokuish}/docker-args-deploy (100%) rename plugins/{00_dokku-standard => builder-herokuish}/docker-args-run (100%) create mode 100644 plugins/builder-herokuish/plugin.toml rename plugins/{build-env => builder-herokuish}/pre-build-buildpack (52%) diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index 5b583b68c..cb09115e3 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -68,6 +68,36 @@ case "$URL_TYPE" in esac ``` +### `builder-build` + +- Description: Triggers the artifact build process +- Invoked by: `dokku deploy` +- Arguments: `$BUILDER_TYPE` `$APP` `$SOURCECODE_WORK_DIR` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x + +# TODO +``` + +### `builder-release` + +- Description: Triggers the artifact release process +- Invoked by: `dokku deploy` +- Arguments: `$BUILDER_TYPE` `$APP` `$IMAGE_TAG` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x + +# TODO +``` + ### `check-deploy` - Description: Allows you to run checks on a deploy before Dokku allows the container to handle requests. diff --git a/plugins/20_events/builder-build b/plugins/20_events/builder-build new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/builder-build @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/20_events/builder-release b/plugins/20_events/builder-release new file mode 120000 index 000000000..5178a749f --- /dev/null +++ b/plugins/20_events/builder-release @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/build-env/plugin.toml b/plugins/build-env/plugin.toml deleted file mode 100644 index 2513dd959..000000000 --- a/plugins/build-env/plugin.toml +++ /dev/null @@ -1,4 +0,0 @@ -[plugin] -description = "dokku core build-env plugin" -version = "0.17.9" -[plugin.config] diff --git a/plugins/builder-dockerfile/builder-build b/plugins/builder-dockerfile/builder-build new file mode 100755 index 000000000..79563ac31 --- /dev/null +++ b/plugins/builder-dockerfile/builder-build @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_AVAILABLE_PATH/config/functions" + +trigger-builder-build-builder-dockerfile() { + declare desc="builder-dockerfile builder-build plugin trigger" + declare trigger="trigger-builder-build-builder-dockerfile" + declare BUILDER_TYPE="$1" APP="$2" SOURCECODE_WORK_DIR="$3" + + if [[ "$BUILDER_TYPE" != "dockerfile" ]]; then + return + fi + + local IMAGE=$(get_app_image_name "$APP") + local DOCKER_BUILD_LABEL_ARGS="--label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP" + + pushd "$SOURCECODE_WORK_DIR" &>/dev/null + + # extract first port from Dockerfile + local DOCKERFILE_PORTS=$(get_dockerfile_exposed_ports Dockerfile) + [[ -n "$DOCKERFILE_PORTS" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_PORTS="$DOCKERFILE_PORTS" + + # extract ENTRYPOINT/CMD from Dockerfile + local DOCKERFILE_ENTRYPOINT=$(extract_directive_from_dockerfile Dockerfile ENTRYPOINT) + [[ -n "$DOCKERFILE_ENTRYPOINT" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_ENTRYPOINT="$DOCKERFILE_ENTRYPOINT" + local DOCKERFILE_CMD=$(extract_directive_from_dockerfile Dockerfile CMD) + [[ -n "$DOCKERFILE_CMD" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_CMD="$DOCKERFILE_CMD" + plugn trigger pre-build-dockerfile "$APP" + + [[ "$DOKKU_DOCKERFILE_CACHE_BUILD" == "false" ]] && DOKKU_DOCKER_BUILD_OPTS="$DOKKU_DOCKER_BUILD_OPTS --no-cache" + local DOCKER_ARGS=$(: | plugn trigger docker-args-build "$APP" "$BUILDER_TYPE") + DOCKER_ARGS+=$(: | plugn trigger docker-args-process-build "$APP" "$IMAGE_TAG" "$BUILDER_TYPE") + + # strip --volume and -v args from DOCKER_ARGS + local DOCKER_ARGS=$(sed -e "s/--volume=[[:graph:]]\+[[:blank:]]\?//g" -e "s/-v[[:blank:]]\?[[:graph:]]\+[[:blank:]]\?//g" <<<"$DOCKER_ARGS") + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + + "$DOCKER_BIN" build "${DOCKER_BUILD_LABEL_ARGS[@]}" $DOKKU_GLOBAL_BUILD_ARGS "${ARG_ARRAY[@]}" "${DOKKU_DOCKER_BUILD_OPTS[@]}" -t $IMAGE . + + plugn trigger post-build-dockerfile "$APP" +} + +trigger-builder-build-builder-dockerfile "$@" diff --git a/plugins/builder-dockerfile/builder-release b/plugins/builder-dockerfile/builder-release new file mode 100755 index 000000000..0d83ce05a --- /dev/null +++ b/plugins/builder-dockerfile/builder-release @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x + +trigger-builder-release-builder-dockerfile() { + declare desc="builder-dockerfile builder-release plugin trigger" + declare trigger="trigger-builder-release-builder-dockerfile" + declare BUILDER_TYPE="$1" APP="$2" IMAGE_TAG="$3" + + if [[ "$BUILDER_TYPE" != "herokuish" ]]; then + return + fi + + # buildstep plugins don't necessarily make sense for dockerfiles. call the new breed!!! + plugn trigger pre-release-dockerfile "$APP" "$IMAGE_TAG" + plugn trigger post-release-dockerfile "$APP" "$IMAGE_TAG" +} + +trigger-builder-release-builder-dockerfile "$@" diff --git a/plugins/builder-dockerfile/plugin.toml b/plugins/builder-dockerfile/plugin.toml new file mode 100644 index 000000000..ebc97c6b2 --- /dev/null +++ b/plugins/builder-dockerfile/plugin.toml @@ -0,0 +1,4 @@ +[plugin] +description = "dokku core builder-dockerfile plugin" +version = "0.17.9" +[plugin.config] diff --git a/plugins/builder-herokuish/builder-build b/plugins/builder-herokuish/builder-build new file mode 100755 index 000000000..051294d6c --- /dev/null +++ b/plugins/builder-herokuish/builder-build @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_AVAILABLE_PATH/config/functions" + +trigger-builder-build-builder-herokuish() { + declare desc="builder-herokuish builder-build plugin trigger" + declare trigger="trigger-builder-build-builder-herokuish" + declare BUILDER_TYPE="$1" APP="$2" SOURCECODE_WORK_DIR="$3" + + if [[ "$BUILDER_TYPE" != "herokuish" ]]; then + return + fi + + local IMAGE=$(get_app_image_name "$APP") + local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache" + local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache" + local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") + local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP" + local CID + + pushd "$SOURCECODE_WORK_DIR" &>/dev/null + + eval "$(config_export app "$APP")" + + DOKKU_IMAGE="$(config_get "$APP" DOKKU_IMAGE || echo "$DOKKU_IMAGE")" + CID=$(tar -c . | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app") + test "$("$DOCKER_BIN" wait "$CID")" -eq 0 + + "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null + [[ -d $DOKKU_APP_CACHE_DIR ]] || mkdir -p "$DOKKU_APP_CACHE_DIR" + plugn trigger pre-build-buildpack "$APP" + + local DOCKER_ARGS=$(: | plugn trigger docker-args-build "$APP" "$BUILDER_TYPE") + [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true " + DOCKER_ARGS+=$(: | plugn trigger docker-args-process-build "$APP" "$IMAGE_TAG" "$BUILDER_TYPE") + + declare -a ARG_ARRAY + eval "ARG_ARRAY=($DOCKER_ARGS)" + # shellcheck disable=SC2086 + CID=$("$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -d -v $DOKKU_APP_HOST_CACHE_DIR:/cache -e CACHE_PATH=/cache "${ARG_ARRAY[@]}" $IMAGE /build) + "$DOCKER_BIN" attach "$CID" + test "$("$DOCKER_BIN" wait "$CID")" -eq 0 + + "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null + + plugn trigger post-build-buildpack "$APP" +} + +trigger-builder-build-builder-herokuish "$@" diff --git a/plugins/builder-herokuish/builder-release b/plugins/builder-herokuish/builder-release new file mode 100755 index 000000000..555359e97 --- /dev/null +++ b/plugins/builder-herokuish/builder-release @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_AVAILABLE_PATH/config/functions" + +trigger-builder-release-builder-herokuish() { + declare desc="builder-herokuish builder-release plugin trigger" + declare trigger="trigger-builder-release-builder-herokuish" + declare BUILDER_TYPE="$1" APP="$2" IMAGE_TAG="$3" + + if [[ "$BUILDER_TYPE" != "herokuish" ]]; then + return + fi + + local CID + local IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") + local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") + local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP" + + plugn trigger pre-release-buildpack "$APP" "$IMAGE_TAG" + if [[ -n $(config_export global) ]]; then + CID=$(config_export global | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/00-global-env.sh") + test "$("$DOCKER_BIN" wait "$CID")" -eq 0 + + "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null + fi + if [[ -n $(config_export app "$APP") ]]; then + CID=$(config_export app "$APP" | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/01-app-env.sh") + test "$("$DOCKER_BIN" wait "$CID")" -eq 0 + + "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null + fi + plugn trigger post-release-buildpack "$APP" "$IMAGE_TAG" +} + +trigger-builder-release-builder-herokuish "$@" diff --git a/plugins/00_dokku-standard/docker-args-build b/plugins/builder-herokuish/docker-args-build similarity index 73% rename from plugins/00_dokku-standard/docker-args-build rename to plugins/builder-herokuish/docker-args-build index 5d2a59924..e207d266a 100755 --- a/plugins/00_dokku-standard/docker-args-build +++ b/plugins/builder-herokuish/docker-args-build @@ -3,7 +3,9 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_AVAILABLE_PATH/config/functions" -app_user_docker_args() { +trigger-docker-args-builder-herokuish() { + declare desc="builder-herokuish docker-args plugin trigger" + declare trigger="trigger-docker-args-builder-herokuish" local APP="$1" local STDIN local DOKKU_APP_TYPE @@ -23,4 +25,4 @@ app_user_docker_args() { echo -n "$docker_args" } -app_user_docker_args "$@" +trigger-docker-args-builder-herokuish "$@" diff --git a/plugins/00_dokku-standard/docker-args-deploy b/plugins/builder-herokuish/docker-args-deploy similarity index 100% rename from plugins/00_dokku-standard/docker-args-deploy rename to plugins/builder-herokuish/docker-args-deploy diff --git a/plugins/00_dokku-standard/docker-args-run b/plugins/builder-herokuish/docker-args-run similarity index 100% rename from plugins/00_dokku-standard/docker-args-run rename to plugins/builder-herokuish/docker-args-run diff --git a/plugins/builder-herokuish/plugin.toml b/plugins/builder-herokuish/plugin.toml new file mode 100644 index 000000000..3c5314d64 --- /dev/null +++ b/plugins/builder-herokuish/plugin.toml @@ -0,0 +1,4 @@ +[plugin] +description = "dokku core builder-herokuish plugin" +version = "0.17.9" +[plugin.config] diff --git a/plugins/build-env/pre-build-buildpack b/plugins/builder-herokuish/pre-build-buildpack similarity index 52% rename from plugins/build-env/pre-build-buildpack rename to plugins/builder-herokuish/pre-build-buildpack index 8ca2ed9d7..2bce0e273 100755 --- a/plugins/build-env/pre-build-buildpack +++ b/plugins/builder-herokuish/pre-build-buildpack @@ -4,11 +4,11 @@ set -eo pipefail source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" -build_env_pre_build_buildpack() { - declare desc="build-env pre-build-buildpack plugin trigger" - local trigger="build_env_pre_build_buildpack" - local APP="$1" - local IMAGE id +trigger-pre-build-buildpack-builder-herokuish() { + declare desc="builder-herokuish pre-build-buildpack plugin trigger" + declare trigger="trigger-pre-build-buildpack-builder-herokuish" + declare APP="$1" + local IMAGE CID local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP" @@ -22,16 +22,16 @@ build_env_pre_build_buildpack() { dokku_log_info1 "Adding BUILD_ENV to build environment..." # create build env files for use in buildpacks like this: # https://github.com/niteoweb/heroku-buildpack-buildout/blob/5879fa3418f7d8e079f1aa5816ba1adde73f4948/bin/compile#L34 - id=$(config_bundle --merged "$APP" | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /tmp/env; cat | tar -x -C /tmp/env") - test "$("$DOCKER_BIN" wait "$id")" -eq 0 + CID=$(config_bundle --merged "$APP" | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /tmp/env; cat | tar -x -C /tmp/env") + test "$("$DOCKER_BIN" wait "$CID")" -eq 0 - "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$id" "$IMAGE" >/dev/null + "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null # create build env for 'old style' buildpacks and dokku plugins - id=$(config_export app "$APP" --format envfile --merged | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "cat >> /app/.env") - test "$("$DOCKER_BIN" wait "$id")" -eq 0 + CID=$(config_export app "$APP" --format envfile --merged | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "cat >> /app/.env") + test "$("$DOCKER_BIN" wait "$CID")" -eq 0 - "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$id" "$IMAGE" >/dev/null + "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$CID" "$IMAGE" >/dev/null } -build_env_pre_build_buildpack "$@" +trigger-pre-build-buildpack-builder-herokuish "$@" diff --git a/plugins/common/functions b/plugins/common/functions index d3bfc8960..ab317ca51 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -517,120 +517,17 @@ is_app_running() { dokku_build() { declare desc="build phase" - declare APP="$1" IMAGE_SOURCE_TYPE="$2" TMP_WORK_DIR="$3" - source "$PLUGIN_AVAILABLE_PATH/config/functions" + declare APP="$1" IMAGE_SOURCE_TYPE="$2" SOURCECODE_WORK_DIR="$3" verify_app_name "$APP" - - local cid IMAGE=$(get_app_image_name "$APP") - local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache" - local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache" - - local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") - local DOCKER_BUILD_LABEL_ARGS="--label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP" - local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP" - - eval "$(config_export app "$APP")" - pushd "$TMP_WORK_DIR" &>/dev/null - - case "$IMAGE_SOURCE_TYPE" in - herokuish) - DOKKU_IMAGE="$(config_get "$APP" DOKKU_IMAGE || echo "$DOKKU_IMAGE")" - cid=$(tar -c . | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app") - test "$("$DOCKER_BIN" wait "$cid")" -eq 0 - - "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$cid" "$IMAGE" >/dev/null - [[ -d $DOKKU_APP_CACHE_DIR ]] || mkdir -p "$DOKKU_APP_CACHE_DIR" - plugn trigger pre-build-buildpack "$APP" - - local DOCKER_ARGS=$(: | plugn trigger docker-args-build "$APP" "$IMAGE_SOURCE_TYPE") - [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true " - local IMAGE_SOURCE_TYPE="herokuish" - DOCKER_ARGS+=$(: | plugn trigger docker-args-process-build "$APP" "$IMAGE_TAG" "$IMAGE_SOURCE_TYPE") - - declare -a ARG_ARRAY - eval "ARG_ARRAY=($DOCKER_ARGS)" - # shellcheck disable=SC2086 - cid=$("$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -d -v $DOKKU_APP_HOST_CACHE_DIR:/cache -e CACHE_PATH=/cache "${ARG_ARRAY[@]}" $IMAGE /build) - "$DOCKER_BIN" attach "$cid" - test "$("$DOCKER_BIN" wait "$cid")" -eq 0 - - "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$cid" "$IMAGE" >/dev/null - - plugn trigger post-build-buildpack "$APP" - ;; - - dockerfile) - # extract first port from Dockerfile - local DOCKERFILE_PORTS=$(get_dockerfile_exposed_ports Dockerfile) - [[ -n "$DOCKERFILE_PORTS" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_PORTS="$DOCKERFILE_PORTS" - - # extract ENTRYPOINT/CMD from Dockerfile - local DOCKERFILE_ENTRYPOINT=$(extract_directive_from_dockerfile Dockerfile ENTRYPOINT) - [[ -n "$DOCKERFILE_ENTRYPOINT" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_ENTRYPOINT="$DOCKERFILE_ENTRYPOINT" - local DOCKERFILE_CMD=$(extract_directive_from_dockerfile Dockerfile CMD) - [[ -n "$DOCKERFILE_CMD" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_CMD="$DOCKERFILE_CMD" - plugn trigger pre-build-dockerfile "$APP" - - [[ "$DOKKU_DOCKERFILE_CACHE_BUILD" == "false" ]] && DOKKU_DOCKER_BUILD_OPTS="$DOKKU_DOCKER_BUILD_OPTS --no-cache" - local DOCKER_ARGS=$(: | plugn trigger docker-args-build "$APP" "$IMAGE_SOURCE_TYPE") - local IMAGE_SOURCE_TYPE="dockerfile" - DOCKER_ARGS+=$(: | plugn trigger docker-args-process-build "$APP" "$IMAGE_TAG" "$IMAGE_SOURCE_TYPE") - - # strip --volume and -v args from DOCKER_ARGS - local DOCKER_ARGS=$(sed -e "s/--volume=[[:graph:]]\+[[:blank:]]\?//g" -e "s/-v[[:blank:]]\?[[:graph:]]\+[[:blank:]]\?//g" <<<"$DOCKER_ARGS") - declare -a ARG_ARRAY - eval "ARG_ARRAY=($DOCKER_ARGS)" - - "$DOCKER_BIN" build "${DOCKER_BUILD_LABEL_ARGS[@]}" $DOKKU_GLOBAL_BUILD_ARGS "${ARG_ARRAY[@]}" "${DOKKU_DOCKER_BUILD_OPTS[@]}" -t $IMAGE . - - plugn trigger post-build-dockerfile "$APP" - ;; - - *) - dokku_log_fail "Building image source type $IMAGE_SOURCE_TYPE not supported!" - ;; - esac + plugn trigger builder-build "$IMAGE_SOURCE_TYPE" "$APP" "$SOURCECODE_WORK_DIR" } dokku_release() { declare desc="release phase" declare APP="$1" IMAGE_SOURCE_TYPE="$2" IMAGE_TAG="$3" - source "$PLUGIN_AVAILABLE_PATH/config/functions" - local cid IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") - - local DOCKER_COMMIT_LABEL_ARGS=("--change" "LABEL org.label-schema.schema-version=1.0" "--change" "LABEL org.label-schema.vendor=dokku" "--change" "LABEL com.dokku.app-name=$APP") - local DOCKER_RUN_LABEL_ARGS="--label=com.dokku.app-name=$APP" - - case "$IMAGE_SOURCE_TYPE" in - herokuish) - plugn trigger pre-release-buildpack "$APP" "$IMAGE_TAG" - if [[ -n $(config_export global) ]]; then - cid=$(config_export global | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/00-global-env.sh") - test "$("$DOCKER_BIN" wait "$cid")" -eq 0 - - "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$cid" "$IMAGE" >/dev/null - fi - if [[ -n $(config_export app "$APP") ]]; then - cid=$(config_export app "$APP" | "$DOCKER_BIN" run "${DOCKER_RUN_LABEL_ARGS[@]}" $DOKKU_GLOBAL_RUN_ARGS -i -a stdin "$IMAGE" /bin/bash -c "mkdir -p /app/.profile.d && cat > /app/.profile.d/01-app-env.sh") - test "$("$DOCKER_BIN" wait "$cid")" -eq 0 - - "$DOCKER_BIN" commit "${DOCKER_COMMIT_LABEL_ARGS[@]}" "$cid" "$IMAGE" >/dev/null - fi - plugn trigger post-release-buildpack "$APP" "$IMAGE_TAG" - ;; - - dockerfile) - # buildstep plugins don't necessarily make sense for dockerfiles. call the new breed!!! - plugn trigger pre-release-dockerfile "$APP" "$IMAGE_TAG" - plugn trigger post-release-dockerfile "$APP" "$IMAGE_TAG" - ;; - - *) - dokku_log_fail "Releasing image source type $IMAGE_SOURCE_TYPE not supported!" - ;; - esac + plugn trigger builder-release "$IMAGE_SOURCE_TYPE" "$APP" "$IMAGE_TAG" } dokku_deploy_cmd() {