#!/bin/bash # Portal-deploy: kører som deploy-brugeren, hvor portalen kører. # Kaldes af CD med et git-tag: git show :deploy/deploy.sh | bash -s -- # # Appmappen er en git-checkout, ejet af deploy. Afviger den fra git (ændrede # eller nye filer), afbrydes der: drift skal rettes i git, ikke overskrives. # Svarer /healthz ikke efter genstart, rulles der tilbage til forrige commit. set -euo pipefail APP_DIR=${PORTAL_DIR:-/opt/portal/app} VENV=${PORTAL_VENV:-/opt/portal/venv} HEALTH_URL=http://127.0.0.1:8000/healthz TAG=${1:?brug: deploy.sh } cd "$APP_DIR" git fetch --tags --quiet if [ -n "$(git status --porcelain)" ]; then echo "afbrudt: appmappen afviger fra git:" git status --short exit 1 fi PREV=$(git rev-parse HEAD) checkout() { local fra=$1 til=$2 git checkout -q --detach "$til" if ! git diff --quiet "$fra" "$til" -- requirements.txt; then "$VENV/bin/pip" install -q -r requirements.txt fi } restart_and_check() { sudo /usr/bin/systemctl restart portal for i in $(seq 1 30); do if curl -fsS -m 4 "$HEALTH_URL" >/dev/null 2>&1; then echo "sund efter $((i * 2))s" return 0 fi sleep 2 done echo "healthz svarede ikke" return 1 } checkout "$PREV" "$TAG" if restart_and_check; then echo "udrullet $TAG ($(git rev-parse --short HEAD))" exit 0 fi echo "ruller tilbage til $(git rev-parse --short "$PREV")" checkout "$TAG" "$PREV" restart_and_check || echo "ADVARSEL: heller ikke den forrige udgave svarer" exit 1