#!/usr/bin/env bash # deploy.sh # Laeuft im zentralen Deploy-Repo auf dem Shell-Runner: # 1. klont alle AG-Repos (read-only Deploy-Token) # 2. validiert alle Listen # 3. rollt sie NUR bei fehlerfreier Validierung auf beide Proxies aus # 4. baut je Gruppe die .db neu und laedt Squid einmal pro Proxy neu # # Erwartete CI/CD-Variablen (im Deploy-Repo, maskiert/protected): # GIT_USER - Name des Group-Deploy-Tokens (read_repository) # GIT_TOKEN - Wert des Group-Deploy-Tokens # SSH-Key + known_hosts liegen im Home des Runner-Users (nicht als CI-Variable). set -euo pipefail here=$(cd "$(dirname "$0")/.." && pwd) # shellcheck source=/dev/null source "$here/config/proxies.env" : "${GIT_USER:?GIT_USER fehlt}" : "${GIT_TOKEN:?GIT_TOKEN fehlt}" : "${CI_SERVER_HOST:?CI_SERVER_HOST fehlt (von GitLab CI gesetzt)}" groups="AG01 AG02 AG03 AG04 AG05 AG06 AG07 AG08" workdir=$(mktemp -d) trap 'rm -rf "$workdir"' EXIT # --- 1) + 2) Klonen und validieren -------------------------------------- for ag in $groups; do echo "== Pruefe $ag ==" repo="https://${GIT_USER}:${GIT_TOKEN}@${CI_SERVER_HOST}/${NAMESPACE}/${ag,,}.git" git clone --depth 1 -q "$repo" "$workdir/$ag" "$here/scripts/validate.sh" domain "$workdir/$ag/${ag}domain" "$here/scripts/validate.sh" url "$workdir/$ag/${ag}url" done # --- 3) + 4) Ausrollen --------------------------------------------------- SSH="ssh -o BatchMode=yes -o StrictHostKeyChecking=yes" failed="" # sammelt "proxy/AG" der fehlgeschlagenen Rebuilds for proxy in $PROXIES; do echo "== Deploy nach $proxy ==" for ag in $groups; do # Dateien in den Staging-Bereich des Proxys legen $SSH "${SSH_USER}@${proxy}" "mkdir -p /var/lib/squidguard/incoming/${ag}" rsync -e "$SSH" -a --checksum \ "$workdir/$ag/${ag}domain" "$workdir/$ag/${ag}url" \ "${SSH_USER}@${proxy}:/var/lib/squidguard/incoming/${ag}/" # Uebernahme + DB-Rebuild dieser Gruppe (privilegiert, aber eng begrenzt). # Schlaegt der Rebuild fehl, rollt das Proxy-Skript die Gruppe auf ihren # letzten guten Stand zurueck. Wir merken uns den Fehler, machen aber # mit den restlichen Gruppen weiter, damit deren gute Aenderungen live gehen. if $SSH "${SSH_USER}@${proxy}" "sudo /usr/local/sbin/squidguard-rebuild.sh ${ag}"; then : else echo "WARNUNG: Rebuild ${ag} auf ${proxy} fehlgeschlagen (Rollback aktiv)" >&2 failed="${failed} ${proxy}/${ag}" fi done # Squid einmal pro Proxy neu laden, damit die neuen .db aktiv werden. # Auch bei Einzelfehlern: die erfolgreich gebauten Gruppen sollen live gehen. $SSH "${SSH_USER}@${proxy}" "sudo /usr/local/sbin/squidguard-reload.sh" done if [ -n "$failed" ]; then echo "Deploy mit Fehlern abgeschlossen. Zurueckgerollt:${failed}" >&2 exit 1 fi echo "Deploy abgeschlossen."