diff --git a/bin/update-release.sh b/bin/update-release.sh index 6def89e..39eb4b0 100755 --- a/bin/update-release.sh +++ b/bin/update-release.sh @@ -349,6 +349,12 @@ fi log "cloning update source" git clone --quiet --single-branch --branch "$BRANCH" "$REPO_URL" "$CHECKOUT_DIR" +# Force-refresh the branch tip to defeat transport-level caching (GitHub CDN, +# HTTP proxies, stale local mirrors). Without this, `git clone` can serve a +# ref advertisement that is minutes-to-days behind the true remote HEAD. +git -C "$CHECKOUT_DIR" fetch --quiet --force --no-tags origin "$BRANCH" +git -C "$CHECKOUT_DIR" reset --quiet --hard "origin/$BRANCH" + if [ -n "$BAUDBOT_UPDATE_REF" ]; then log "checking out ref: $BAUDBOT_UPDATE_REF" git -C "$CHECKOUT_DIR" fetch --quiet origin "$BAUDBOT_UPDATE_REF" diff --git a/bin/update-release.test.sh b/bin/update-release.test.sh index 52406c2..cbbfae8 100755 --- a/bin/update-release.test.sh +++ b/bin/update-release.test.sh @@ -214,6 +214,37 @@ test_release_root_overrides_stale_source_path_env() { ) } +test_update_picks_up_latest_commit() { + ( + set -euo pipefail + local tmp repo release_root sha1 sha2 current_sha + + tmp="$(mktemp -d /tmp/baudbot-update-test.XXXXXX)" + trap 'rm -rf "$tmp"' EXIT + + repo="$tmp/repo" + release_root="$tmp/opt/baudbot" + + make_repo "$repo" + sha1="$(git -C "$repo" rev-parse HEAD)" + + run_update "$repo" "$release_root" "test -f hello.txt" + + current_sha="$(readlink -f "$release_root/current")" + [ "$current_sha" = "$release_root/releases/$sha1" ] + + # Push a new commit and update again — must land on the new SHA. + new_commit "$repo" "latest-tip" + sha2="$(git -C "$repo" rev-parse HEAD)" + [ "$sha1" != "$sha2" ] + + run_update "$repo" "$release_root" "test -f hello.txt" + + current_sha="$(readlink -f "$release_root/current")" + [ "$current_sha" = "$release_root/releases/$sha2" ] + ) +} + echo "=== update-release tests ===" echo "" @@ -221,6 +252,7 @@ run_test "publishes git-free release snapshot" test_publish_git_free_release run_test "preflight failure keeps current release" test_preflight_failure_keeps_current run_test "deploy failure keeps current release" test_deploy_failure_keeps_current run_test "release root overrides stale source env" test_release_root_overrides_stale_source_path_env +run_test "update picks up latest commit" test_update_picks_up_latest_commit echo "" echo "=== $PASSED/$TOTAL passed, $FAILED failed ==="