diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index a141b115f71..26b4f269ab0 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -1810,6 +1810,21 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x # TODO ``` +### `procfile-exists` + +- Description: Checks if a procfile exists for the specified app +- Invoked by: `internally` +- Arguments: `$APP` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x + +# TODO +``` + ### `proxy-build-config` - Description: Builds the proxy implementation configuration for a given app diff --git a/plugins/20_events/procfile-exists b/plugins/20_events/procfile-exists new file mode 120000 index 00000000000..5178a749ff6 --- /dev/null +++ b/plugins/20_events/procfile-exists @@ -0,0 +1 @@ +hook \ No newline at end of file diff --git a/plugins/ps/Makefile b/plugins/ps/Makefile index dbf6e32216a..fa9285662cb 100644 --- a/plugins/ps/Makefile +++ b/plugins/ps/Makefile @@ -1,5 +1,5 @@ SUBCOMMANDS = subcommands/inspect subcommands/rebuild subcommands/report subcommands/restart subcommands/restore subcommands/retire subcommands/scale subcommands/set subcommands/start subcommands/stop -TRIGGERS = triggers/app-restart triggers/core-post-deploy triggers/core-post-extract triggers/install triggers/post-app-clone triggers/post-app-clone-setup triggers/post-app-rename triggers/post-app-rename-setup triggers/post-create triggers/post-delete triggers/post-stop triggers/pre-deploy triggers/procfile-get-command triggers/ps-can-scale triggers/ps-current-scale triggers/ps-set-scale triggers/report +TRIGGERS = triggers/app-restart triggers/core-post-deploy triggers/core-post-extract triggers/install triggers/post-app-clone triggers/post-app-clone-setup triggers/post-app-rename triggers/post-app-rename-setup triggers/post-create triggers/post-delete triggers/post-stop triggers/pre-deploy triggers/procfile-get-command triggers/procfile-exists triggers/ps-can-scale triggers/ps-current-scale triggers/ps-set-scale triggers/report BUILD = commands subcommands triggers PLUGIN_NAME = ps diff --git a/plugins/ps/src/triggers/triggers.go b/plugins/ps/src/triggers/triggers.go index c4170d297dc..d0acb17b2ac 100644 --- a/plugins/ps/src/triggers/triggers.go +++ b/plugins/ps/src/triggers/triggers.go @@ -64,6 +64,9 @@ func main() { processType := flag.Arg(1) port := common.ToInt(flag.Arg(2), 5000) err = ps.TriggerProcfileGetCommand(appName, processType, port) + case "procfile-exists": + appName := flag.Arg(0) + err = ps.TriggerProcfileExists(appName) case "ps-can-scale": appName := flag.Arg(0) canScale := common.ToBool(flag.Arg(1)) diff --git a/plugins/ps/triggers.go b/plugins/ps/triggers.go index 160274d22af..a36810c0b2a 100644 --- a/plugins/ps/triggers.go +++ b/plugins/ps/triggers.go @@ -1,6 +1,7 @@ package ps import ( + "errors" "fmt" "os" "path" @@ -259,6 +260,15 @@ func TriggerPreDeploy(appName string, imageTag string) error { return nil } +// TriggerProcfileExists checks if a procfile exists +func TriggerProcfileExists(appName string) error { + if hasProcfile(appName) { + return nil + } + + return errors.New("Procfile does not exist") +} + // TriggerProcfileGetCommand fetches a command from the procfile func TriggerProcfileGetCommand(appName string, processType string, port int) error { if !hasProcfile(appName) { diff --git a/plugins/scheduler-docker-local/scheduler-deploy b/plugins/scheduler-docker-local/scheduler-deploy index 0372bf13979..aa69eedc604 100755 --- a/plugins/scheduler-docker-local/scheduler-deploy +++ b/plugins/scheduler-docker-local/scheduler-deploy @@ -37,6 +37,11 @@ trigger-scheduler-docker-local-scheduler-deploy() { DOKKU_START_CMD="$(config_get "$APP" DOKKU_START_CMD || true)" + local PROCFILE_EXISTS=false + if plugn trigger procfile-exists "$APP" 2>/dev/null; then + PROCFILE_EXISTS=true + fi + local DOKKU_WAIT_TO_RETIRE="$(plugn trigger checks-get-property "$APP" wait-to-retire)" export DOKKU_WAIT_TO_RETIRE @@ -54,6 +59,12 @@ trigger-scheduler-docker-local-scheduler-deploy() { continue fi + local PROC_CMD=$(plugn trigger procfile-get-command "$APP" "$PROC_TYPE" "5000" 2>/dev/null || echo '') + if [[ "$PROCFILE_EXISTS" == true ]] && [[ "$PROC_CMD" == "" ]]; then + dokku_log_warn "Skipping $PROC_TYPE as it is missing from the current Procfile" + continue + fi + if [[ "$PROC_TYPE" != "web" ]]; then echo "$PLUGIN_AVAILABLE_PATH/scheduler-docker-local/bin/scheduler-deploy-process $APP $IMAGE_SOURCE_TYPE $IMAGE $IMAGE_TAG $PROC_TYPE $PROC_COUNT" >>"$TMP_FILE" continue diff --git a/tests/apps/python/worker.Procfile b/tests/apps/python/worker.Procfile new file mode 100644 index 00000000000..9eed8058897 --- /dev/null +++ b/tests/apps/python/worker.Procfile @@ -0,0 +1 @@ +worker: python3 -u worker.py diff --git a/tests/unit/scheduler-docker-local.bats b/tests/unit/scheduler-docker-local.bats index 42c9066340f..8bce5e89c70 100644 --- a/tests/unit/scheduler-docker-local.bats +++ b/tests/unit/scheduler-docker-local.bats @@ -56,6 +56,24 @@ teardown() { assert_success } +@test "(scheduler-docker-local) no-web" { + run create_app + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku ps:set $TEST_APP procfile-path worker.Procfile" + echo "output: $output" + echo "status: $status" + assert_success + + run deploy_app + echo "output: $output" + echo "status: $status" + assert_success + assert_output_contains "Skipping web as it is missing from the current Procfile" +} + @test "(scheduler-docker-local) init-process" { run create_app echo "output: $output"