Abort stale first deployments
Test and publish container images / test (push) Successful in 2m25s
Test and publish container images / publish (push) Successful in 11s

This commit is contained in:
BuTzZ
2026-07-29 13:21:17 +02:00
parent 99ba1a2373
commit c349eed49d
3 changed files with 52 additions and 0 deletions
+3
View File
@@ -138,6 +138,9 @@ Der Erstlauf wird dafür als begrenzter systemd-Job gestartet; das lokale
Upload-Skript wartet über wiederverbindbare SSH-Prüfungen auf exakt den Upload-Skript wartet über wiederverbindbare SSH-Prüfungen auf exakt den
angeforderten Commit. So konkurriert der initiale Aufruf nicht mit dem angeforderten Commit. So konkurriert der initiale Aufruf nicht mit dem
Auto-Deploy-Timer und ein kurzzeitiger SSH-Abbruch beendet den Import nicht. Auto-Deploy-Timer und ein kurzzeitiger SSH-Abbruch beendet den Import nicht.
Wechselt `origin/main` währenddessen auf einen neueren Commit, beendet das
Upload-Skript nur seinen manuellen Livegang mit einer klaren Meldung; der
systemd-Dienst setzt das automatische Deployment des neuen Stands fort.
App und Nginx werden beim ersten Release erst gestartet, wenn sowohl der App und Nginx werden beim ersten Release erst gestartet, wenn sowohl der
Routingindex als auch ein nicht leerer, zur PBF-Prüfsumme passender Bestand an Routingindex als auch ein nicht leerer, zur PBF-Prüfsumme passender Bestand an
Häfen, Schleusen und Brücken geprüft wurde. Ein HTTP-Healthcheck allein kann Häfen, Schleusen und Brücken geprüft wurde. Ein HTTP-Healthcheck allein kann
@@ -52,6 +52,9 @@ case "$*" in
*"rev-parse HEAD"*) *"rev-parse HEAD"*)
printf '%s\n' "$FAKE_REVISION" printf '%s\n' "$FAKE_REVISION"
;; ;;
*"ls-remote --exit-code origin refs/heads/main"*)
printf '%s\trefs/heads/main\n' "$FAKE_MAIN_REVISION"
;;
*) *)
printf 'Unerwarteter Git-Aufruf: %s\n' "$*" >&2 printf 'Unerwarteter Git-Aufruf: %s\n' "$*" >&2
exit 90 exit 90
@@ -92,6 +95,7 @@ output="$(
FAKE_CALL_LOG="$FAKE_LOG" \ FAKE_CALL_LOG="$FAKE_LOG" \
FAKE_CHECK_COUNT="$CHECK_COUNT" \ FAKE_CHECK_COUNT="$CHECK_COUNT" \
FAKE_REVISION="$REVISION" \ FAKE_REVISION="$REVISION" \
FAKE_MAIN_REVISION="$REVISION" \
WATERMAPS_RELEASE_WAIT_SECONDS=60 \ WATERMAPS_RELEASE_WAIT_SECONDS=60 \
WATERMAPS_RELEASE_POLL_SECONDS=5 \ WATERMAPS_RELEASE_POLL_SECONDS=5 \
"$UPLOAD_SCRIPT" \ "$UPLOAD_SCRIPT" \
@@ -117,4 +121,26 @@ assert_contains \
"$output" "$output"
assert_contains "sleep|5" "$(<"$FAKE_LOG")" assert_contains "sleep|5" "$(<"$FAKE_LOG")"
NEWER_REVISION="4444444444444444444444444444444444444444"
set +e
mismatch_output="$(
PATH="$FAKE_BIN:$PATH" \
FAKE_CALL_LOG="$FAKE_LOG" \
FAKE_CHECK_COUNT="$CHECK_COUNT" \
FAKE_REVISION="$REVISION" \
FAKE_MAIN_REVISION="$NEWER_REVISION" \
"$UPLOAD_SCRIPT" \
--host 203.0.113.10 \
--identity "$TEST_IDENTITY" \
2>&1
)"
mismatch_status=$?
set -e
[[ "$mismatch_status" -ne 0 ]] ||
fail "Ein nicht veröffentlichter lokaler HEAD wurde für das Deployment akzeptiert."
assert_contains \
"Lokaler HEAD $REVISION ist nicht der aktuelle origin/main-Commit $NEWER_REVISION." \
"$mismatch_output"
printf 'Upload/Erstdeployment: systemd-Start und revisionsgenaues Warten: OK\n' printf 'Upload/Erstdeployment: systemd-Start und revisionsgenaues Warten: OK\n'
+23
View File
@@ -79,6 +79,24 @@ revision="$(git -C "$WM_ROOT_DIR" rev-parse HEAD)"
[[ "$revision" =~ ^[0-9a-f]{40}$ ]] || [[ "$revision" =~ ^[0-9a-f]{40}$ ]] ||
wm_local_die "Aktueller Git-Commit konnte nicht als vollständige SHA ermittelt werden." wm_local_die "Aktueller Git-Commit konnte nicht als vollständige SHA ermittelt werden."
origin_main_revision() {
local main_revision
main_revision="$(
git -C "$WM_ROOT_DIR" \
ls-remote --exit-code origin refs/heads/main |
awk 'NR == 1 { print $1 }'
)"
[[ "$main_revision" =~ ^[0-9a-f]{40}$ ]] ||
return 1
printf '%s\n' "$main_revision"
}
published_revision="$(origin_main_revision)" ||
wm_local_die "origin/main konnte nicht revisionsgenau gelesen werden."
[[ "$published_revision" == "$revision" ]] ||
wm_local_die "Lokaler HEAD $revision ist nicht der aktuelle origin/main-Commit $published_revision."
set -a set -a
# shellcheck disable=SC1090 # shellcheck disable=SC1090
source "$local_env" source "$local_env"
@@ -115,6 +133,7 @@ wait_for_remote_release() {
local poll_seconds="${WATERMAPS_RELEASE_POLL_SECONDS:-15}" local poll_seconds="${WATERMAPS_RELEASE_POLL_SECONDS:-15}"
local deadline local deadline
local attempts=0 local attempts=0
local current_main_revision
local remote_check local remote_check
[[ "$timeout_seconds" =~ ^[1-9][0-9]*$ ]] && [[ "$timeout_seconds" =~ ^[1-9][0-9]*$ ]] &&
@@ -142,6 +161,10 @@ wait_for_remote_release() {
attempts=$((attempts + 1)) attempts=$((attempts + 1))
if ((attempts == 1 || attempts % 4 == 0)); then if ((attempts == 1 || attempts % 4 == 0)); then
if current_main_revision="$(origin_main_revision 2>/dev/null)" &&
[[ "$current_main_revision" != "$expected_revision" ]]; then
wm_local_die "origin/main wurde während des Erstdeployments von $expected_revision auf $current_main_revision verschoben; starte den Livegang aus dem aktuellen main-Stand erneut."
fi
printf '[watermaps] Das revisionsgenaue Erstdeployment läuft unter systemd; warte auf Commit %s …\n' \ printf '[watermaps] Das revisionsgenaue Erstdeployment läuft unter systemd; warte auf Commit %s …\n' \
"$expected_revision" "$expected_revision"
fi fi