#!/usr/bin/env bash # # Deployment: Repository aktualisieren, Image bauen, Dienste neu starten. # Aufruf: ./scripts/deploy.sh [branch] # set -euo pipefail REPO="${HOME}/repo" BRANCH="${1:-main}" LOG="${HOME}/deploy.log" log() { printf '%(%F %T)T %s\n' -1 "$*" | tee -a "$LOG"; } log "=== Deployment gestartet (Branch: ${BRANCH}) ===" # --- 1. Stand sichern, um zurückrollen zu koennen --- cd "$REPO" ALT_COMMIT="$(git rev-parse --short HEAD)" log "Aktueller Stand: ${ALT_COMMIT}" # --- 2. Repository aktualisieren --- git fetch --all --prune git checkout "$BRANCH" git pull --ff-only NEU_COMMIT="$(git rev-parse --short HEAD)" if [[ "$ALT_COMMIT" == "$NEU_COMMIT" ]]; then log "Keine Aenderungen. Deployment beendet." exit 0 fi log "Neuer Stand: ${NEU_COMMIT}" # --- 3. Quadlet-Verknuepfungen auffrischen --- mkdir -p "${HOME}/.config/containers/systemd" find "${HOME}/.config/containers/systemd" -type l -delete for f in "${REPO}"/quadlet/*.{container,volume,network,pod}; do [[ -e "$f" ]] && ln -sf "$f" "${HOME}/.config/containers/systemd/" done # --- 4. Image bauen --- log "Baue Image ${NEU_COMMIT} ..." podman build --pull \ -t "localhost/webapp:${NEU_COMMIT}" \ "${REPO}/images/webapp" podman tag "localhost/webapp:${NEU_COMMIT}" localhost/webapp:aktuell # --- 5. Dienste neu starten --- systemctl --user daemon-reload systemctl --user restart webapp.service # --- 6. Zustand pruefen --- log "Warte auf Gesundheitsstatus ..." for i in {1..30}; do if podman healthcheck run webapp &>/dev/null; then log "Deployment erfolgreich: ${ALT_COMMIT} -> ${NEU_COMMIT}" podman image prune -f &>/dev/null || true exit 0 fi sleep 2 done # --- 7. Automatischer Rollback --- log "FEHLER: Gesundheitspruefung fehlgeschlagen. Rollback auf ${ALT_COMMIT}." podman tag "localhost/webapp:${ALT_COMMIT}" localhost/webapp:aktuell git checkout "$ALT_COMMIT" systemctl --user daemon-reload systemctl --user restart webapp.service log "Rollback abgeschlossen." exit 1