Skip to content

Commit 9132ebc

Browse files
committed
deploy: force-fetch branch tip after clone to defeat stale refs
git clone --single-branch can serve a stale ref advertisement from GitHub's CDN or HTTP transport cache, causing baudbot update to deploy commits that are minutes to days behind the true remote HEAD. After cloning, explicitly fetch --force the branch and hard-reset to origin/<branch> to guarantee the checkout reflects the latest tip. Adds a test confirming sequential updates pick up new commits.
1 parent db472fe commit 9132ebc

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

bin/update-release.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,12 @@ fi
393393
log "cloning update source"
394394
git clone --quiet --single-branch --branch "$BRANCH" "$REPO_URL" "$CHECKOUT_DIR"
395395

396+
# Force-refresh the branch tip to defeat transport-level caching (GitHub CDN,
397+
# HTTP proxies, stale local mirrors). Without this, `git clone` can serve a
398+
# ref advertisement that is minutes-to-days behind the true remote HEAD.
399+
git -C "$CHECKOUT_DIR" fetch --quiet --force --no-tags origin "$BRANCH"
400+
git -C "$CHECKOUT_DIR" reset --quiet --hard "origin/$BRANCH"
401+
396402
if [ -n "$BAUDBOT_UPDATE_REF" ]; then
397403
log "checking out ref: $BAUDBOT_UPDATE_REF"
398404
git -C "$CHECKOUT_DIR" fetch --quiet origin "$BAUDBOT_UPDATE_REF"

bin/update-release.test.sh

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,37 @@ test_release_root_overrides_stale_source_path_env() {
252252
)
253253
}
254254

255+
test_update_picks_up_latest_commit() {
256+
(
257+
set -euo pipefail
258+
local tmp repo release_root sha1 sha2 current_sha
259+
260+
tmp="$(mktemp -d /tmp/baudbot-update-test.XXXXXX)"
261+
trap 'rm -rf "$tmp"' EXIT
262+
263+
repo="$tmp/repo"
264+
release_root="$tmp/opt/baudbot"
265+
266+
make_repo "$repo"
267+
sha1="$(git -C "$repo" rev-parse HEAD)"
268+
269+
run_update "$repo" "$release_root" "test -f hello.txt"
270+
271+
current_sha="$(readlink -f "$release_root/current")"
272+
[ "$current_sha" = "$release_root/releases/$sha1" ]
273+
274+
# Push a new commit and update again — must land on the new SHA.
275+
new_commit "$repo" "latest-tip"
276+
sha2="$(git -C "$repo" rev-parse HEAD)"
277+
[ "$sha1" != "$sha2" ]
278+
279+
run_update "$repo" "$release_root" "test -f hello.txt"
280+
281+
current_sha="$(readlink -f "$release_root/current")"
282+
[ "$current_sha" = "$release_root/releases/$sha2" ]
283+
)
284+
}
285+
255286
test_resolve_npm_from_fake_agent_home() {
256287
(
257288
set -euo pipefail
@@ -364,6 +395,7 @@ run_test "publishes git-free release snapshot" test_publish_git_free_release
364395
run_test "preflight failure keeps current release" test_preflight_failure_keeps_current
365396
run_test "deploy failure keeps current release" test_deploy_failure_keeps_current
366397
run_test "release root overrides stale source env" test_release_root_overrides_stale_source_path_env
398+
run_test "update picks up latest commit" test_update_picks_up_latest_commit
367399
run_test "resolves npm from agent embedded runtime" test_resolve_npm_from_fake_agent_home
368400
run_test "resolves npm from sudo user home" test_resolve_npm_from_fake_sudo_user_home
369401
run_test "resolve_npm_bin fails when npm missing" test_resolve_npm_fails_when_missing

0 commit comments

Comments
 (0)