From eb17a383c69fe713c1710bb81563a056f3eb657b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 7 May 2026 12:39:46 -0400 Subject: [PATCH 1/3] fix: reference SOURCECODE_WORK_DIR in builder core-post-extract The builder-dockerfile, builder-lambda, builder-nixpacks, builder-pack and builder-railpack `core-post-extract` triggers assigned `$2` to a local `SOURCECODE_WORK_DIR` but called `pushd "$TMP_WORK_DIR"`, which was unset. Bash 5.2 silently accepted `pushd ""`, so the bug stayed dormant. Bash 5.3 (shipped with Ubuntu 26.04) makes it a hard error and `set -e` aborts the trigger, causing every `git push` to fail with `pushd: null directory`. --- plugins/builder-dockerfile/core-post-extract | 2 +- plugins/builder-lambda/core-post-extract | 2 +- plugins/builder-nixpacks/core-post-extract | 2 +- plugins/builder-pack/core-post-extract | 2 +- plugins/builder-railpack/core-post-extract | 2 +- tests/unit/builder-dockerfile.bats | 23 ++++++++++++++++++++ tests/unit/builder-lambda.bats | 23 ++++++++++++++++++++ tests/unit/builder-nixpacks.bats | 23 ++++++++++++++++++++ tests/unit/builder-pack.bats | 23 ++++++++++++++++++++ tests/unit/builder-railpack.bats | 23 ++++++++++++++++++++ 10 files changed, 120 insertions(+), 5 deletions(-) diff --git a/plugins/builder-dockerfile/core-post-extract b/plugins/builder-dockerfile/core-post-extract index 5334e8d3a..15e80c16e 100755 --- a/plugins/builder-dockerfile/core-post-extract +++ b/plugins/builder-dockerfile/core-post-extract @@ -10,7 +10,7 @@ trigger-builder-dockerfile-core-post-extract() { declare APP="$1" SOURCECODE_WORK_DIR="$2" local NEW_DOCKERFILE="$(fn-builder-dockerfile-computed-dockerfile-path "$APP")" - pushd "$TMP_WORK_DIR" >/dev/null + pushd "$SOURCECODE_WORK_DIR" >/dev/null if [[ -z "$NEW_DOCKERFILE" ]]; then return diff --git a/plugins/builder-lambda/core-post-extract b/plugins/builder-lambda/core-post-extract index a7a4b6a39..7d431379a 100755 --- a/plugins/builder-lambda/core-post-extract +++ b/plugins/builder-lambda/core-post-extract @@ -10,7 +10,7 @@ trigger-builder-lambda-core-post-extract() { declare APP="$1" SOURCECODE_WORK_DIR="$2" local NEW_LAMBDA_YML="$(fn-builder-lambda-computed-lambdayml-path "$APP")" - pushd "$TMP_WORK_DIR" >/dev/null + pushd "$SOURCECODE_WORK_DIR" >/dev/null if [[ -z "$NEW_LAMBDA_YML" ]]; then return diff --git a/plugins/builder-nixpacks/core-post-extract b/plugins/builder-nixpacks/core-post-extract index eaaa5dd5e..a3d42a4b2 100755 --- a/plugins/builder-nixpacks/core-post-extract +++ b/plugins/builder-nixpacks/core-post-extract @@ -10,7 +10,7 @@ trigger-builder-nixpacks-core-post-extract() { declare APP="$1" SOURCECODE_WORK_DIR="$2" local NEW_NIXPACKS_YML="$(fn-builder-nixpacks-computed-nixpackstoml-path "$APP")" - pushd "$TMP_WORK_DIR" >/dev/null + pushd "$SOURCECODE_WORK_DIR" >/dev/null if [[ -z "$NEW_NIXPACKS_YML" ]]; then return diff --git a/plugins/builder-pack/core-post-extract b/plugins/builder-pack/core-post-extract index 4c50479e2..381d176f7 100755 --- a/plugins/builder-pack/core-post-extract +++ b/plugins/builder-pack/core-post-extract @@ -10,7 +10,7 @@ trigger-builder-pack-core-post-extract() { declare APP="$1" SOURCECODE_WORK_DIR="$2" local NEW_PROJECT_TOML="$(fn-builder-pack-computed-projecttoml-path "$APP")" - pushd "$TMP_WORK_DIR" >/dev/null + pushd "$SOURCECODE_WORK_DIR" >/dev/null if [[ -z "$NEW_PROJECT_TOML" ]]; then return diff --git a/plugins/builder-railpack/core-post-extract b/plugins/builder-railpack/core-post-extract index ad863c076..d78b8d7da 100755 --- a/plugins/builder-railpack/core-post-extract +++ b/plugins/builder-railpack/core-post-extract @@ -10,7 +10,7 @@ trigger-builder-railpack-core-post-extract() { declare APP="$1" SOURCECODE_WORK_DIR="$2" local NEW_RAILPACK_JSON="$(fn-builder-railpack-computed-railpackjson-path "$APP")" - pushd "$TMP_WORK_DIR" >/dev/null + pushd "$SOURCECODE_WORK_DIR" >/dev/null if [[ -z "$NEW_RAILPACK_JSON" ]]; then return diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index 794c31ca9..df1e02336 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -155,6 +155,29 @@ EOF assert_output "3001/udp 3000/tcp 3003" } +@test "(builder-dockerfile) core-post-extract renames the configured dockerfile" { + local TMP_DIR + TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-dockerfile.XXXXXX")" + trap "rm -rf '$TMP_DIR'" RETURN + echo "FROM scratch" >"$TMP_DIR/second.Dockerfile" + + run /bin/bash -c "dokku builder-dockerfile:set $TEST_APP dockerfile-path second.Dockerfile" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-dockerfile/core-post-extract $TEST_APP $TMP_DIR HEAD" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $TMP_DIR/Dockerfile" + assert_success + + run /bin/bash -c "test ! -e $TMP_DIR/second.Dockerfile" + assert_success +} + @test "(builder-dockerfile) ps:rebuild fetches files from image" { run /bin/bash -c "dokku --trace git:from-image $TEST_APP dokku/smoke-test-app:dockerfile" echo "output: $output" diff --git a/tests/unit/builder-lambda.bats b/tests/unit/builder-lambda.bats index 160e28b69..afbbcda9b 100644 --- a/tests/unit/builder-lambda.bats +++ b/tests/unit/builder-lambda.bats @@ -152,6 +152,29 @@ teardown() { assert_success } +@test "(builder-lambda) core-post-extract renames the configured lambda.yml" { + local TMP_DIR + TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-lambda.XXXXXX")" + trap "rm -rf '$TMP_DIR'" RETURN + echo "---" >"$TMP_DIR/lambda2.yml" + + run /bin/bash -c "dokku builder-lambda:set $TEST_APP lambdayml-path lambda2.yml" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-lambda/core-post-extract $TEST_APP $TMP_DIR HEAD" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $TMP_DIR/lambda.yml" + assert_success + + run /bin/bash -c "test ! -e $TMP_DIR/lambda2.yml" + assert_success +} + inject_lambda_yml() { local APP="$1" local APP_REPO_DIR="$2" diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index ecdd7d59a..657fd3596 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -131,6 +131,29 @@ teardown() { assert_output "['task.py', 'some', 'cron', 'task']" } +@test "(builder-nixpacks) core-post-extract renames the configured nixpacks.toml" { + local TMP_DIR + TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-nixpacks.XXXXXX")" + trap "rm -rf '$TMP_DIR'" RETURN + echo "" >"$TMP_DIR/nixpacks.alt.toml" + + run /bin/bash -c "dokku builder-nixpacks:set $TEST_APP nixpackstoml-path nixpacks.alt.toml" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-nixpacks/core-post-extract $TEST_APP $TMP_DIR HEAD" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $TMP_DIR/nixpacks.toml" + assert_success + + run /bin/bash -c "test ! -e $TMP_DIR/nixpacks.alt.toml" + assert_success +} + cron_run_wrapper() { local APP="$1" local APP_REPO_DIR="$2" diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index 8e21816af..0f335053d 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -228,6 +228,29 @@ teardown() { assert_output "['task.py', 'test']" } +@test "(builder-pack) core-post-extract renames the configured project.toml" { + local TMP_DIR + TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-pack.XXXXXX")" + trap "rm -rf '$TMP_DIR'" RETURN + echo "" >"$TMP_DIR/project2.toml" + + run /bin/bash -c "dokku builder-pack:set $TEST_APP projecttoml-path project2.toml" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-pack/core-post-extract $TEST_APP $TMP_DIR HEAD" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $TMP_DIR/project.toml" + assert_success + + run /bin/bash -c "test ! -e $TMP_DIR/project2.toml" + assert_success +} + cron_run_wrapper() { local APP="$1" local APP_REPO_DIR="$2" diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index 133e81542..82722be17 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -142,6 +142,29 @@ teardown() { assert_output "['task.py', 'some', 'cron', 'task']" } +@test "(builder-railpack) core-post-extract renames the configured railpack.json" { + local TMP_DIR + TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-railpack.XXXXXX")" + trap "rm -rf '$TMP_DIR'" RETURN + echo "{}" >"$TMP_DIR/railpack.alt.json" + + run /bin/bash -c "dokku builder-railpack:set $TEST_APP railpackjson-path railpack.alt.json" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-railpack/core-post-extract $TEST_APP $TMP_DIR HEAD" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $TMP_DIR/railpack.json" + assert_success + + run /bin/bash -c "test ! -e $TMP_DIR/railpack.alt.json" + assert_success +} + cron_run_wrapper() { local APP="$1" local APP_REPO_DIR="$2" From bc8adfa6e20066aa54052159869160e7568548a3 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 7 May 2026 12:47:00 -0400 Subject: [PATCH 2/3] test: add run_plugn_trigger and run_plugin_script bats helpers Both helpers wrap `run /bin/bash -c "..."` with the env vars dokku plugin scripts and `plugn` need, replacing the long inline boilerplate that was duplicated across `tests/unit/resource_3.bats` and the new `core-post-extract` regression tests in the builder bats files. --- tests/unit/builder-dockerfile.bats | 2 +- tests/unit/builder-lambda.bats | 2 +- tests/unit/builder-nixpacks.bats | 2 +- tests/unit/builder-pack.bats | 2 +- tests/unit/builder-railpack.bats | 2 +- tests/unit/resource_3.bats | 14 +++++++------- tests/unit/test_helper.bash | 23 +++++++++++++++++++++++ 7 files changed, 35 insertions(+), 12 deletions(-) diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index df1e02336..c2b41f6a2 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -166,7 +166,7 @@ EOF echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-dockerfile/core-post-extract $TEST_APP $TMP_DIR HEAD" + run_plugin_script builder-dockerfile core-post-extract "$TEST_APP" "$TMP_DIR" HEAD echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-lambda.bats b/tests/unit/builder-lambda.bats index afbbcda9b..fa97fc977 100644 --- a/tests/unit/builder-lambda.bats +++ b/tests/unit/builder-lambda.bats @@ -163,7 +163,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-lambda/core-post-extract $TEST_APP $TMP_DIR HEAD" + run_plugin_script builder-lambda core-post-extract "$TEST_APP" "$TMP_DIR" HEAD echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index 657fd3596..3f5e6e14e 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -142,7 +142,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-nixpacks/core-post-extract $TEST_APP $TMP_DIR HEAD" + run_plugin_script builder-nixpacks core-post-extract "$TEST_APP" "$TMP_DIR" HEAD echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index 0f335053d..1a9bf5451 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -239,7 +239,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-pack/core-post-extract $TEST_APP $TMP_DIR HEAD" + run_plugin_script builder-pack core-post-extract "$TEST_APP" "$TMP_DIR" HEAD echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index 82722be17..a6e99e906 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -153,7 +153,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/builder-railpack/core-post-extract $TEST_APP $TMP_DIR HEAD" + run_plugin_script builder-railpack core-post-extract "$TEST_APP" "$TMP_DIR" HEAD echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/resource_3.bats b/tests/unit/resource_3.bats index 687c1a512..174d2084d 100644 --- a/tests/unit/resource_3.bats +++ b/tests/unit/resource_3.bats @@ -23,7 +23,7 @@ teardown() { echo "status: $status" assert_output "256m" - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT plugn trigger docker-args-process-build $TEST_APP herokuish < /dev/null" + run_plugn_trigger docker-args-process-build "$TEST_APP" herokuish echo "output: $output" echo "status: $status" assert_success @@ -39,7 +39,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT plugn trigger docker-args-process-build $TEST_APP dockerfile < /dev/null" + run_plugn_trigger docker-args-process-build "$TEST_APP" dockerfile echo "output: $output" echo "status: $status" assert_success @@ -55,13 +55,13 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT plugn trigger docker-args-process-build $TEST_APP pack < /dev/null" + run_plugn_trigger docker-args-process-build "$TEST_APP" pack echo "output: $output" echo "status: $status" assert_success assert_output_not_contains "--memory" - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT plugn trigger docker-args-process-build $TEST_APP lambda < /dev/null" + run_plugn_trigger docker-args-process-build "$TEST_APP" lambda echo "output: $output" echo "status: $status" assert_success @@ -74,7 +74,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT plugn trigger docker-args-process-build $TEST_APP herokuish < /dev/null" + run_plugn_trigger docker-args-process-build "$TEST_APP" herokuish echo "output: $output" echo "status: $status" assert_success @@ -87,7 +87,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT plugn trigger docker-args-process-build $TEST_APP herokuish < /dev/null" + run_plugn_trigger docker-args-process-build "$TEST_APP" herokuish echo "output: $output" echo "status: $status" assert_success @@ -101,7 +101,7 @@ teardown() { echo "status: $status" assert_success - run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT DOKKU_OMIT_RESOURCE_ARGS=1 plugn trigger docker-args-process-build $TEST_APP herokuish < /dev/null" + run_plugn_trigger DOKKU_OMIT_RESOURCE_ARGS=1 docker-args-process-build "$TEST_APP" herokuish echo "output: $output" echo "status: $status" assert_success diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index 0ad154aea..60ba322e9 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -231,6 +231,29 @@ destroy_key() { rm -f /tmp/testkey* &>/dev/null || true } +# Run a plugn trigger with the env vars plugn needs, capturing $output/$status via bats `run`. +# Optional VAR=VAL pairs before are forwarded as extra env vars on the bash command line. +# Usage: run_plugn_trigger [VAR=VAL ...] +run_plugn_trigger() { + local extra_env="" + while [[ "$1" == *=* ]]; do + extra_env+=" $1" + shift + done + local TRIGGER="$1" + shift + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT${extra_env} plugn trigger $TRIGGER $* < /dev/null" +} + +# Run a single plugin's trigger script directly so other plugins' handlers do not fire. +# Captures $output/$status via bats `run`. +# Usage: run_plugin_script +run_plugin_script() { + local PLUGIN_NAME="$1" SCRIPT_NAME="$2" + shift 2 + run /bin/bash -c "PLUGIN_PATH=$PLUGIN_PATH PLUGIN_AVAILABLE_PATH=$PLUGIN_AVAILABLE_PATH PLUGIN_ENABLED_PATH=$PLUGIN_ENABLED_PATH PLUGIN_CORE_AVAILABLE_PATH=$PLUGIN_CORE_AVAILABLE_PATH DOKKU_LIB_ROOT=$DOKKU_LIB_ROOT $PLUGIN_ENABLED_PATH/$PLUGIN_NAME/$SCRIPT_NAME $*" +} + check_urls() { local PATTERN="$1" run /bin/bash -c "dokku urls $TEST_APP | grep -E \"${PATTERN}\"" From 5d212f319500e0dc2f8b36af0e2964f05c9a4436 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 8 May 2026 01:34:05 -0400 Subject: [PATCH 3/3] test: use BATS_TEST_TMPDIR in core-post-extract regression tests The previous form set `trap "rm -rf '$TMP_DIR'" RETURN` inside the test, but bats propagates `RETURN` traps to nested function calls, so the trap fired on the first `assert_success` and removed the work directory before the trigger script ran. Switching to bats's per-test `BATS_TEST_TMPDIR` removes the trap entirely and lets bats handle cleanup. --- tests/unit/builder-dockerfile.bats | 11 ++++------- tests/unit/builder-lambda.bats | 11 ++++------- tests/unit/builder-nixpacks.bats | 11 ++++------- tests/unit/builder-pack.bats | 11 ++++------- tests/unit/builder-railpack.bats | 11 ++++------- 5 files changed, 20 insertions(+), 35 deletions(-) diff --git a/tests/unit/builder-dockerfile.bats b/tests/unit/builder-dockerfile.bats index c2b41f6a2..d6d9b682d 100644 --- a/tests/unit/builder-dockerfile.bats +++ b/tests/unit/builder-dockerfile.bats @@ -156,25 +156,22 @@ EOF } @test "(builder-dockerfile) core-post-extract renames the configured dockerfile" { - local TMP_DIR - TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-dockerfile.XXXXXX")" - trap "rm -rf '$TMP_DIR'" RETURN - echo "FROM scratch" >"$TMP_DIR/second.Dockerfile" + echo "FROM scratch" >"$BATS_TEST_TMPDIR/second.Dockerfile" run /bin/bash -c "dokku builder-dockerfile:set $TEST_APP dockerfile-path second.Dockerfile" echo "output: $output" echo "status: $status" assert_success - run_plugin_script builder-dockerfile core-post-extract "$TEST_APP" "$TMP_DIR" HEAD + run_plugin_script builder-dockerfile core-post-extract "$TEST_APP" "$BATS_TEST_TMPDIR" HEAD echo "output: $output" echo "status: $status" assert_success - run /bin/bash -c "test -f $TMP_DIR/Dockerfile" + run /bin/bash -c "test -f $BATS_TEST_TMPDIR/Dockerfile" assert_success - run /bin/bash -c "test ! -e $TMP_DIR/second.Dockerfile" + run /bin/bash -c "test ! -e $BATS_TEST_TMPDIR/second.Dockerfile" assert_success } diff --git a/tests/unit/builder-lambda.bats b/tests/unit/builder-lambda.bats index fa97fc977..e2c0933b5 100644 --- a/tests/unit/builder-lambda.bats +++ b/tests/unit/builder-lambda.bats @@ -153,25 +153,22 @@ teardown() { } @test "(builder-lambda) core-post-extract renames the configured lambda.yml" { - local TMP_DIR - TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-lambda.XXXXXX")" - trap "rm -rf '$TMP_DIR'" RETURN - echo "---" >"$TMP_DIR/lambda2.yml" + echo "---" >"$BATS_TEST_TMPDIR/lambda2.yml" run /bin/bash -c "dokku builder-lambda:set $TEST_APP lambdayml-path lambda2.yml" echo "output: $output" echo "status: $status" assert_success - run_plugin_script builder-lambda core-post-extract "$TEST_APP" "$TMP_DIR" HEAD + run_plugin_script builder-lambda core-post-extract "$TEST_APP" "$BATS_TEST_TMPDIR" HEAD echo "output: $output" echo "status: $status" assert_success - run /bin/bash -c "test -f $TMP_DIR/lambda.yml" + run /bin/bash -c "test -f $BATS_TEST_TMPDIR/lambda.yml" assert_success - run /bin/bash -c "test ! -e $TMP_DIR/lambda2.yml" + run /bin/bash -c "test ! -e $BATS_TEST_TMPDIR/lambda2.yml" assert_success } diff --git a/tests/unit/builder-nixpacks.bats b/tests/unit/builder-nixpacks.bats index 3f5e6e14e..56f4cf20f 100644 --- a/tests/unit/builder-nixpacks.bats +++ b/tests/unit/builder-nixpacks.bats @@ -132,25 +132,22 @@ teardown() { } @test "(builder-nixpacks) core-post-extract renames the configured nixpacks.toml" { - local TMP_DIR - TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-nixpacks.XXXXXX")" - trap "rm -rf '$TMP_DIR'" RETURN - echo "" >"$TMP_DIR/nixpacks.alt.toml" + echo "" >"$BATS_TEST_TMPDIR/nixpacks.alt.toml" run /bin/bash -c "dokku builder-nixpacks:set $TEST_APP nixpackstoml-path nixpacks.alt.toml" echo "output: $output" echo "status: $status" assert_success - run_plugin_script builder-nixpacks core-post-extract "$TEST_APP" "$TMP_DIR" HEAD + run_plugin_script builder-nixpacks core-post-extract "$TEST_APP" "$BATS_TEST_TMPDIR" HEAD echo "output: $output" echo "status: $status" assert_success - run /bin/bash -c "test -f $TMP_DIR/nixpacks.toml" + run /bin/bash -c "test -f $BATS_TEST_TMPDIR/nixpacks.toml" assert_success - run /bin/bash -c "test ! -e $TMP_DIR/nixpacks.alt.toml" + run /bin/bash -c "test ! -e $BATS_TEST_TMPDIR/nixpacks.alt.toml" assert_success } diff --git a/tests/unit/builder-pack.bats b/tests/unit/builder-pack.bats index 1a9bf5451..9cc3a6a05 100644 --- a/tests/unit/builder-pack.bats +++ b/tests/unit/builder-pack.bats @@ -229,25 +229,22 @@ teardown() { } @test "(builder-pack) core-post-extract renames the configured project.toml" { - local TMP_DIR - TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-pack.XXXXXX")" - trap "rm -rf '$TMP_DIR'" RETURN - echo "" >"$TMP_DIR/project2.toml" + echo "" >"$BATS_TEST_TMPDIR/project2.toml" run /bin/bash -c "dokku builder-pack:set $TEST_APP projecttoml-path project2.toml" echo "output: $output" echo "status: $status" assert_success - run_plugin_script builder-pack core-post-extract "$TEST_APP" "$TMP_DIR" HEAD + run_plugin_script builder-pack core-post-extract "$TEST_APP" "$BATS_TEST_TMPDIR" HEAD echo "output: $output" echo "status: $status" assert_success - run /bin/bash -c "test -f $TMP_DIR/project.toml" + run /bin/bash -c "test -f $BATS_TEST_TMPDIR/project.toml" assert_success - run /bin/bash -c "test ! -e $TMP_DIR/project2.toml" + run /bin/bash -c "test ! -e $BATS_TEST_TMPDIR/project2.toml" assert_success } diff --git a/tests/unit/builder-railpack.bats b/tests/unit/builder-railpack.bats index a6e99e906..597283111 100644 --- a/tests/unit/builder-railpack.bats +++ b/tests/unit/builder-railpack.bats @@ -143,25 +143,22 @@ teardown() { } @test "(builder-railpack) core-post-extract renames the configured railpack.json" { - local TMP_DIR - TMP_DIR="$(mktemp -d "/tmp/dokku-test-builder-railpack.XXXXXX")" - trap "rm -rf '$TMP_DIR'" RETURN - echo "{}" >"$TMP_DIR/railpack.alt.json" + echo "{}" >"$BATS_TEST_TMPDIR/railpack.alt.json" run /bin/bash -c "dokku builder-railpack:set $TEST_APP railpackjson-path railpack.alt.json" echo "output: $output" echo "status: $status" assert_success - run_plugin_script builder-railpack core-post-extract "$TEST_APP" "$TMP_DIR" HEAD + run_plugin_script builder-railpack core-post-extract "$TEST_APP" "$BATS_TEST_TMPDIR" HEAD echo "output: $output" echo "status: $status" assert_success - run /bin/bash -c "test -f $TMP_DIR/railpack.json" + run /bin/bash -c "test -f $BATS_TEST_TMPDIR/railpack.json" assert_success - run /bin/bash -c "test ! -e $TMP_DIR/railpack.alt.json" + run /bin/bash -c "test ! -e $BATS_TEST_TMPDIR/railpack.alt.json" assert_success }