feat: skip scaled processes that are missing in the Procfile

This allows folks to deploy apps that don't have a web process without needing to scale that process down before/after the first deploy. Note that the formations key in the app.json or a manual scale of other processes will be necessary to start anything non-web.

Closes #5700
This commit is contained in:
Jose Diaz-Gonzalez
2023-05-28 23:22:17 -04:00
parent 64f0f2674d
commit eb6f85f083
8 changed files with 60 additions and 1 deletions

View File

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

View File

@@ -0,0 +1 @@
hook

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1 @@
worker: python3 -u worker.py

View File

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