ci: deploy-container.sh — swap/rollback with dry-run tests

This commit is contained in:
2026-04-25 02:41:51 +03:00
parent f97cb72e9e
commit cb494a4290
2 changed files with 131 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
#!/usr/bin/env bash
# deploy-container.sh — swap or rollback the flights-web container on the host.
#
# Usage: deploy-container.sh [--dry-run] <swap|rollback>
#
# `swap` — assumes the new image is tagged flights-web:${GITHUB_SHA}.
# Tags :current → :previous, :sha → :current, restarts container.
# `rollback` — runs flights-web:previous in place of :current, repoints :current.
#
# Env:
# GITHUB_SHA (required for swap)
# FLIGHTS_WEB_PORT (default 8081 — host port that nginx proxies to)
# IMAGE_NAME (default flights-web — set this to point at a registry later)
set -euo pipefail
DRY_RUN=0
if [ "${1:-}" = "--dry-run" ]; then
DRY_RUN=1
shift
fi
CMD="${1:-}"
PORT="${FLIGHTS_WEB_PORT:-8081}"
IMAGE="${IMAGE_NAME:-flights-web}"
run() {
if [ "$DRY_RUN" -eq 1 ]; then
printf 'docker %s\n' "$*"
else
docker "$@"
fi
}
run_or_skip() {
# Same as run, but doesn't fail in real mode if the docker call fails.
if [ "$DRY_RUN" -eq 1 ]; then
printf 'docker %s\n' "$*"
else
docker "$@" || true
fi
}
case "$CMD" in
swap)
: "${GITHUB_SHA:?GITHUB_SHA required for swap}"
SHORT_SHA="${GITHUB_SHA:0:7}"
# 1. Tag the currently-live image as :previous (skip if first deploy).
if [ "$DRY_RUN" -eq 1 ] || docker image inspect "${IMAGE}:current" >/dev/null 2>&1; then
run tag "${IMAGE}:current" "${IMAGE}:previous"
fi
# 2. Tag the new SHA as :current.
run tag "${IMAGE}:${SHORT_SHA}" "${IMAGE}:current"
# 3. Stop + remove existing container if present.
run_or_skip stop flights-web
run_or_skip rm flights-web
# 4. Run new container.
run run -d --name flights-web --restart unless-stopped \
-p "127.0.0.1:${PORT}:8080" \
"${IMAGE}:current"
;;
rollback)
if [ "$DRY_RUN" -eq 0 ] && ! docker image inspect "${IMAGE}:previous" >/dev/null 2>&1; then
echo "fatal: ${IMAGE}:previous not found — cannot rollback" >&2
exit 1
fi
run_or_skip stop flights-web
run_or_skip rm flights-web
run run -d --name flights-web --restart unless-stopped \
-p "127.0.0.1:${PORT}:8080" \
"${IMAGE}:previous"
# Repoint :current to :previous so subsequent swaps have a sane baseline.
run tag "${IMAGE}:previous" "${IMAGE}:current"
;;
*)
echo "usage: $0 [--dry-run] <swap|rollback>" >&2
exit 2
;;
esac