From 3d49dbe63f82bf339d38d151be206e89406e5258 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 18:06:22 -0500 Subject: [PATCH 1/9] tests: add tests to prove that Procfile tasks all work for every builder Closes #8242 --- tests/apps/python/Procfile | 1 + tests/unit/builder-dockerfile.bats | 11 +++++++-- tests/unit/builder-herokuish.bats | 9 +++++++- tests/unit/builder-nixpacks.bats | 11 ++++++++- tests/unit/builder-pack.bats | 3 ++- tests/unit/builder-railpack.bats | 37 ++++++++++++++++++++++++++++++ 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/tests/apps/python/Procfile b/tests/apps/python/Procfile index 77b9a38ff..8a57141ee 100644 --- a/tests/apps/python/Procfile +++ b/tests/apps/python/Procfile @@ -8,6 +8,7 @@ web: python3 -u web.py first.Procfile # testing inline comment worker: python3 -u worker.py custom: echo -n release: python3 -u release.py +task: python3 -u task.py test # Old version with separate processes (use this if you have issues with the threaded version) diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index 754a09be1..ad7226949 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -147,15 +147,22 @@ EOF echo "status: $status" assert_success - run deploy_app dockerfile + run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP convert_to_dockerfile echo "output: $output" echo "status: $status" assert_success - run /bin/bash -c "dokku ps:inspect $TEST_APP" + run /bin/bash -c "dokku run $TEST_APP python task.py test" echo "output: $output" echo "status: $status" assert_success + assert_output "['task.py', 'test']" + + run /bin/bash -c "dokku run $TEST_APP task" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-herokuish.bats b/tests/unit/builder-herokuish.bats index 8677d52e5..3be33a035 100644 --- a/tests/unit/builder-herokuish.bats +++ b/tests/unit/builder-herokuish.bats @@ -105,10 +105,17 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "dokku ps:inspect $TEST_APP" + run /bin/bash -c "dokku run $TEST_APP python task.py test" echo "output: $output" echo "status: $status" assert_success + assert_output "['task.py', 'test']" + + run /bin/bash -c "dokku run $TEST_APP task" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index 98a9734b5..1685cbb24 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -59,11 +59,20 @@ teardown() { echo "output: $output" echo "status: $status" assert_success + assert_output_contains 'load build definition from Dockerfile' + assert_output_contains "SECRET_KEY: fjdkslafjdk" - run /bin/bash -c "dokku ps:inspect $TEST_APP" + run /bin/bash -c "dokku run $TEST_APP python task.py test" echo "output: $output" echo "status: $status" assert_success + assert_output "['task.py', 'test']" + + run /bin/bash -c "dokku run $TEST_APP task" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index 3ad4eaf1a..279629800 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -101,10 +101,11 @@ teardown() { assert_success assert_output "['task.py', 'test']" - run /bin/bash -c "dokku ps:inspect $TEST_APP" + run /bin/bash -c "dokku run $TEST_APP task" echo "output: $output" echo "status: $status" assert_success + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index e0dcc5f6c..1ae3192b8 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -54,6 +54,43 @@ teardown() { assert_output_contains 'Successfully built image in' } +@test "(builder-pack) run" { + run /bin/bash -c "dokku config:set $TEST_APP SECRET_KEY=fjdkslafjdk" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku builder:set $TEST_APP selected railpack" + echo "output: $output" + echo "status: $status" + assert_success + + run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP inject_requirements_txt + echo "output: $output" + echo "status: $status" + assert_success + assert_output_contains 'create mise config' + assert_output_contains 'Successfully built image in' + + run /bin/bash -c "dokku run $TEST_APP python task.py test" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "['task.py', 'test']" + + run /bin/bash -c "dokku run $TEST_APP task" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "['task.py', 'test']" + + run /bin/bash -c "dokku run $TEST_APP env" + echo "output: $output" + echo "status: $status" + assert_success + assert_output_contains "SECRET_KEY=fjdkslafjdk" +} + inject_requirements_txt() { local APP="$1" local APP_REPO_DIR="$2" From ca51f2de01657d81dfa9993403d9873502ba21d1 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 18:26:01 -0500 Subject: [PATCH 2/9] chore: remove debug mode --- plugins/builder-nixpacks/builder-build | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/builder-nixpacks/builder-build b/plugins/builder-nixpacks/builder-build index df8662b55..8509c2a29 100755 --- a/plugins/builder-nixpacks/builder-build +++ b/plugins/builder-nixpacks/builder-build @@ -6,7 +6,6 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x trigger-builder-nixpacks-builder-build() { - set -x declare desc="builder-nixpacks builder-build plugin trigger" declare trigger="builder-build" declare BUILDER_TYPE="$1" APP="$2" SOURCECODE_WORK_DIR="$3" @@ -257,7 +256,6 @@ trigger-builder-nixpacks-builder-build() { plugn trigger post-build "$BUILDER_TYPE" "$APP" "$SOURCECODE_WORK_DIR" popd &>/dev/null || pushd "/tmp" >/dev/null - set +x } trigger-builder-nixpacks-builder-build "$@" From 3a476716ebaf665733d2d65009f71c8aa1972a08 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 18:29:02 -0500 Subject: [PATCH 3/9] tests: allow specifying 'at least 1 occurrence' for assert_output_contains --- tests/unit/test_helper.bash | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index 1669d5c29..95e89376d 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -148,6 +148,14 @@ assert_output_contains() { input="${input/$expected/}" found=$((found + 1)) done + + if [[ "$count" -eq -1 ]]; then + if [[ "$found" -gt 0 ]]; then + return 0 + fi + flunk "expected at least 1 occurrence of '$expected', found $found" + fi + [[ "$count" -eq "$found" ]] || flunk "expected $count occurrences of '$expected', found $found" } From 52418dd799632849b049b240a22a298f7a5cb52c Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 18:29:42 -0500 Subject: [PATCH 4/9] tests: allow 1 or more occurrends of 'load build definition from Dockerfile' For unknown reasons, sometimes this gets output twice by the nixpacks builder. --- tests/unit/builder-nixpacks.bats | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index 1685cbb24..04f03976d 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -29,7 +29,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output_contains 'load build definition from Dockerfile' + assert_output_contains 'load build definition from Dockerfile' -1 assert_output_contains "SECRET_KEY: fjdkslafjdk" run /bin/bash -c "dokku builder-nixpacks:set $TEST_APP nixpackstoml-path nonexistent.toml" @@ -41,7 +41,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output_contains 'load build definition from Dockerfile' + assert_output_contains 'load build definition from Dockerfile' -1 } @test "(builder-nixpacks) run" { @@ -59,7 +59,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output_contains 'load build definition from Dockerfile' + assert_output_contains 'load build definition from Dockerfile' -1 assert_output_contains "SECRET_KEY: fjdkslafjdk" run /bin/bash -c "dokku run $TEST_APP python task.py test" From 153ff6ecb4b3a538b7df2b0b115f75a814820142 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 18:32:26 -0500 Subject: [PATCH 5/9] tests: fix expected output when task is specified from Procfile When run from a Procfile, we output an additional message like "-----> Found 'task' in Procfile, running that command". --- tests/unit/builder-dockerfile.bats | 2 +- tests/unit/builder-herokuish.bats | 2 +- tests/unit/builder-nixpacks.bats | 2 +- tests/unit/builder-pack.bats | 2 +- tests/unit/builder-railpack.bats | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index ad7226949..d48958023 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -162,7 +162,7 @@ EOF echo "output: $output" echo "status: $status" assert_success - assert_output "['task.py', 'test']" + assert_output_contains "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-herokuish.bats b/tests/unit/builder-herokuish.bats index 3be33a035..613891abe 100644 --- a/tests/unit/builder-herokuish.bats +++ b/tests/unit/builder-herokuish.bats @@ -115,7 +115,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output "['task.py', 'test']" + assert_output_contains "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index 04f03976d..4ee3286ad 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -72,7 +72,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output "['task.py', 'test']" + assert_output_contains "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index 279629800..a51582da5 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -105,7 +105,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output "['task.py', 'test']" + assert_output_contains "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index 1ae3192b8..80c427a82 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -82,7 +82,7 @@ teardown() { echo "output: $output" echo "status: $status" assert_success - assert_output "['task.py', 'test']" + assert_output_contains "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" From 4a7328b02294d0e2e20d1dad06983cb902bbd586 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 18:34:39 -0500 Subject: [PATCH 6/9] tests: update expected output --- tests/unit/ps-general-2.bats | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/ps-general-2.bats b/tests/unit/ps-general-2.bats index 379d7727d..db2520b3b 100644 --- a/tests/unit/ps-general-2.bats +++ b/tests/unit/ps-general-2.bats @@ -169,7 +169,7 @@ teardown() { run /bin/bash -c "dokku --quiet ps:scale $TEST_APP" output=$(echo "$output" | tr -s " ") echo "output: ($output)" - assert_output $'cron: 0\ncustom: 0\nrelease: 0\nweb: 1\nworker: 1' + assert_output $'cron: 0\ncustom: 0\nrelease: 0\ntask: 0\nweb: 1\nworker: 1' run /bin/bash -c "dokku ps:scale $TEST_APP worker=0" echo "output: $output" @@ -179,7 +179,7 @@ teardown() { run /bin/bash -c "dokku --quiet ps:scale $TEST_APP" output=$(echo "$output" | tr -s " ") echo "output: ($output)" - assert_output $'cron: 0\ncustom: 0\nrelease: 0\nweb: 1\nworker: 0' + assert_output $'cron: 0\ncustom: 0\nrelease: 0\ntask: 0\nweb: 1\nworker: 0' run /bin/bash -c "dokku ps:set $TEST_APP procfile-path second.Procfile" echo "output: $output" From 4e50dbfb0273aa23312681f2e206ef0f3a6a957d Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 19:05:30 -0500 Subject: [PATCH 7/9] tests: run tasks with quiet output so we can check the entire output --- tests/unit/builder-dockerfile.bats | 4 ++-- tests/unit/builder-herokuish.bats | 4 ++-- tests/unit/builder-nixpacks.bats | 4 ++-- tests/unit/builder-pack.bats | 4 ++-- tests/unit/builder-railpack.bats | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index d48958023..c64d5bc36 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -158,11 +158,11 @@ EOF assert_success assert_output "['task.py', 'test']" - run /bin/bash -c "dokku run $TEST_APP task" + run /bin/bash -c "dokku --quiet run $TEST_APP task" echo "output: $output" echo "status: $status" assert_success - assert_output_contains "['task.py', 'test']" + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-herokuish.bats b/tests/unit/builder-herokuish.bats index 613891abe..fabc7c4a5 100644 --- a/tests/unit/builder-herokuish.bats +++ b/tests/unit/builder-herokuish.bats @@ -111,11 +111,11 @@ teardown() { assert_success assert_output "['task.py', 'test']" - run /bin/bash -c "dokku run $TEST_APP task" + run /bin/bash -c "dokku --quiet run $TEST_APP task" echo "output: $output" echo "status: $status" assert_success - assert_output_contains "['task.py', 'test']" + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index 4ee3286ad..fa765fac3 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -68,11 +68,11 @@ teardown() { assert_success assert_output "['task.py', 'test']" - run /bin/bash -c "dokku run $TEST_APP task" + run /bin/bash -c "dokku --quiet run $TEST_APP task" echo "output: $output" echo "status: $status" assert_success - assert_output_contains "['task.py', 'test']" + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index a51582da5..cf052a926 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -101,11 +101,11 @@ teardown() { assert_success assert_output "['task.py', 'test']" - run /bin/bash -c "dokku run $TEST_APP task" + run /bin/bash -c "dokku --quiet run $TEST_APP task" echo "output: $output" echo "status: $status" assert_success - assert_output_contains "['task.py', 'test']" + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index 80c427a82..2f5ab5541 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -78,11 +78,11 @@ teardown() { assert_success assert_output "['task.py', 'test']" - run /bin/bash -c "dokku run $TEST_APP task" + run /bin/bash -c "dokku --quiet run $TEST_APP task" echo "output: $output" echo "status: $status" assert_success - assert_output_contains "['task.py', 'test']" + assert_output "['task.py', 'test']" run /bin/bash -c "dokku run $TEST_APP env" echo "output: $output" From 5e2e53d86497b7812e4cd485ecda3c4052d33f61 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 19:07:56 -0500 Subject: [PATCH 8/9] tests: run python3 instead of python --- tests/unit/builder-dockerfile.bats | 2 +- tests/unit/builder-herokuish.bats | 2 +- tests/unit/builder-nixpacks.bats | 2 +- tests/unit/builder-pack.bats | 2 +- tests/unit/builder-railpack.bats | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index c64d5bc36..73c5b9c99 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -152,7 +152,7 @@ EOF echo "status: $status" assert_success - run /bin/bash -c "dokku run $TEST_APP python task.py test" + run /bin/bash -c "dokku run $TEST_APP python3 task.py test" echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-herokuish.bats b/tests/unit/builder-herokuish.bats index fabc7c4a5..fb1536f91 100644 --- a/tests/unit/builder-herokuish.bats +++ b/tests/unit/builder-herokuish.bats @@ -105,7 +105,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "dokku run $TEST_APP python task.py test" + run /bin/bash -c "dokku run $TEST_APP python3 task.py test" echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index fa765fac3..e66a6147a 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -62,7 +62,7 @@ teardown() { assert_output_contains 'load build definition from Dockerfile' -1 assert_output_contains "SECRET_KEY: fjdkslafjdk" - run /bin/bash -c "dokku run $TEST_APP python task.py test" + run /bin/bash -c "dokku run $TEST_APP python3 task.py test" echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index cf052a926..55c662149 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -95,7 +95,7 @@ teardown() { assert_output_contains 'Building with buildpack 1' 0 assert_output_contains 'Installing dependencies using pip' - run /bin/bash -c "dokku run $TEST_APP python task.py test" + run /bin/bash -c "dokku run $TEST_APP python3 task.py test" echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index 2f5ab5541..531aed86b 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -72,7 +72,7 @@ teardown() { assert_output_contains 'create mise config' assert_output_contains 'Successfully built image in' - run /bin/bash -c "dokku run $TEST_APP python task.py test" + run /bin/bash -c "dokku run $TEST_APP python3 task.py test" echo "output: $output" echo "status: $status" assert_success From 3ae8fae9fdaf3f6ebe273ab6ce40a4a630353534 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 25 Dec 2025 19:49:57 -0500 Subject: [PATCH 9/9] fix: ensure the buildkit container is always running --- tests/unit/builder-railpack.bats | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index 531aed86b..a904e553b 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -5,7 +5,6 @@ load test_helper setup_file() { global_setup install_railpack - docker run --rm --privileged -d --name buildkit moby/buildkit:latest touch /etc/default/dokku sudo tee -a /etc/default/dokku <<<"export BUILDKIT_HOST='docker-container://buildkit'" } @@ -16,7 +15,9 @@ teardown_file() { } setup() { + global_setup create_app + docker run --rm --privileged -d --name buildkit moby/buildkit:latest } teardown() {