Skip to content

Commit 98e154a

Browse files
authored
deploy: fix rollback release-root path contamination (#131)
1 parent 1573799 commit 98e154a

2 files changed

Lines changed: 57 additions & 1 deletion

File tree

bin/rollback-release.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ while [ "$#" -gt 0 ]; do
4646
case "$1" in
4747
--release-root)
4848
[ "$#" -ge 2 ] || die "--release-root requires a value"
49-
bb_refresh_release_paths "$2" 1
49+
BAUDBOT_RELEASE_ROOT="$2"
5050
shift 2
5151
;;
5252
--skip-restart)
@@ -63,6 +63,10 @@ while [ "$#" -gt 0 ]; do
6363
esac
6464
done
6565

66+
# Normalize release paths after env + CLI parsing so BAUDBOT_RELEASE_ROOT always
67+
# wins over any inherited BAUDBOT_CURRENT/PREVIOUS/RELEASES path variables.
68+
bb_refresh_release_paths "${BAUDBOT_RELEASE_ROOT:-/opt/baudbot}" 1
69+
6670
bb_require_root "rollback (or BAUDBOT_ROLLBACK_ALLOW_NON_ROOT=1 for tests)" "$BAUDBOT_ROLLBACK_ALLOW_NON_ROOT"
6771

6872
[ -d "$BAUDBOT_RELEASES_DIR" ] || die "release directory missing: $BAUDBOT_RELEASES_DIR"

bin/rollback-release.test.sh

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,23 @@ run_rollback() {
8585
"$ROLLBACK_SCRIPT" "$target"
8686
}
8787

88+
run_rollback_with_stale_release_paths() {
89+
local release_root="$1"
90+
local stale_root="$2"
91+
92+
BAUDBOT_ROLLBACK_ALLOW_NON_ROOT=1 \
93+
BAUDBOT_RELEASE_ROOT="$release_root" \
94+
BAUDBOT_RELEASES_DIR="$stale_root/releases" \
95+
BAUDBOT_CURRENT_LINK="$stale_root/current" \
96+
BAUDBOT_PREVIOUS_LINK="$stale_root/previous" \
97+
BAUDBOT_ROLLBACK_DEPLOY_CMD="true" \
98+
BAUDBOT_ROLLBACK_RESTART_CMD="true" \
99+
BAUDBOT_ROLLBACK_HEALTH_CMD="true" \
100+
BAUDBOT_ROLLBACK_SKIP_VERSION_CHECK=1 \
101+
BAUDBOT_ROLLBACK_SKIP_CLI_LINK=1 \
102+
"$ROLLBACK_SCRIPT" previous
103+
}
104+
88105
test_rollback_previous_switches_current() {
89106
(
90107
set -euo pipefail
@@ -164,12 +181,47 @@ test_rollback_deploy_failure_keeps_current() {
164181
)
165182
}
166183

184+
test_rollback_release_root_overrides_stale_release_path_env() {
185+
(
186+
set -euo pipefail
187+
local tmp repo release_root stale_root sha1 sha2 current previous
188+
189+
tmp="$(mktemp -d /tmp/baudbot-rollback-test.XXXXXX)"
190+
trap 'rm -rf "$tmp"' EXIT
191+
192+
repo="$tmp/repo"
193+
release_root="$tmp/opt/baudbot"
194+
stale_root="$tmp/stale"
195+
196+
mkdir -p "$stale_root/releases/fake-current" "$stale_root/releases/fake-previous"
197+
ln -s "$stale_root/releases/fake-current" "$stale_root/current"
198+
ln -s "$stale_root/releases/fake-previous" "$stale_root/previous"
199+
200+
make_repo "$repo"
201+
run_update "$repo" "$release_root"
202+
sha1="$(git -C "$repo" rev-parse HEAD)"
203+
204+
new_commit "$repo" "second"
205+
run_update "$repo" "$release_root"
206+
sha2="$(git -C "$repo" rev-parse HEAD)"
207+
208+
run_rollback_with_stale_release_paths "$release_root" "$stale_root"
209+
210+
current="$(readlink -f "$release_root/current")"
211+
previous="$(readlink -f "$release_root/previous")"
212+
213+
[ "$current" = "$release_root/releases/$sha1" ]
214+
[ "$previous" = "$release_root/releases/$sha2" ]
215+
)
216+
}
217+
167218
echo "=== rollback-release tests ==="
168219
echo ""
169220

170221
run_test "rollback previous switches current" test_rollback_previous_switches_current
171222
run_test "rollback missing release keeps current" test_rollback_missing_release_fails_without_mutation
172223
run_test "rollback deploy failure keeps current" test_rollback_deploy_failure_keeps_current
224+
run_test "rollback release-root overrides stale env" test_rollback_release_root_overrides_stale_release_path_env
173225

174226
echo ""
175227
echo "=== $PASSED/$TOTAL passed, $FAILED failed ==="

0 commit comments

Comments
 (0)