d3638d49ae
Beispiel-Setup: ein Repo je AG fuer Zugriffskontrolle, zentrales Deploy-Repo mit Validierung, Rollout auf beide Proxys, DB-Rebuild je Gruppe und Auto-Rollback auf den letzten guten Stand. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
75 lines
2.9 KiB
Bash
Executable File
75 lines
2.9 KiB
Bash
Executable File
#!/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."
|