Files
Artista-Filmcamp/scripts/ci-runner-isolation.sh
T
Nick SzaunigandClaude Opus 5.5 0421d7d57a
Docker-Images bauen und veroeffentlichen / lint (push) Successful in 1m54s
Docker-Images bauen und veroeffentlichen / typecheck (push) Successful in 1m14s
Docker-Images bauen und veroeffentlichen / test (push) Successful in 1m35s
Docker-Images bauen und veroeffentlichen / build-and-push (push) Failing after 6m9s
ci: Qualitaets-Gate vor dem Image-Build
Der Workflow baute bisher bei jedem Push auf main ungeprueft beide Images.
Jetzt laufen lint (inkl. pnpm audit ab high), typecheck und test auf dem
isolierten Runner (ci-isolated, ohne Docker-Socket und Clusternetz); die
Tests bekommen Postgres 18.6 als Service ueber TEST_DATABASE_URL.
build-and-push startet nur, wenn alle drei gruen sind. Muster und
Runner-Pruefskript aus dem VyCept-Repo (docs/BETRIEB.md 11b).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-14 09:02:55 +02:00

61 lines
2.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# Prüft im CI-Job die Grenzen des isolierten Runners (Label ci-isolated,
# Runner-Doku im VyCept-Repo, docs/BETRIEB.md 11b; Kopie von dort). Läuft als erster Schritt jedes Prüf-Jobs, damit jeder
# Runner bei jedem Lauf geprüft wird. Schlägt fehl, wenn der Job mehr darf als
# vorgesehen – oder wenn die Prüfung selbst nichts aussagen würde.
set -euo pipefail
fail() {
echo "Runner-Isolation verletzt: $*" >&2
exit 1
}
reachable() {
timeout 5 bash -c "exec 3<>/dev/tcp/$1/$2" 2>/dev/null
}
# Namen mit Wiederholung auflösen: Das DNS des Job-Netzes antwortet unter Last
# gelegentlich erst beim zweiten Versuch.
resolve() {
local address=""
for _ in 1 2 3 4 5; do
address=$(getent hosts "$1" | awk '{ print $1; exit }' || true)
if [ -n "$address" ]; then echo "$address"; return 0; fi
sleep 2
done
return 1
}
# 1. Kein Zugang zum Docker-Daemon über den Socket.
[ -z "${DOCKER_HOST:-}" ] || fail "DOCKER_HOST ist gesetzt ($DOCKER_HOST)"
for socket in /var/run/docker.sock /run/docker.sock; do
[ ! -e "$socket" ] || fail "Docker-Socket $socket ist sichtbar"
done
# 2. Kein Zugang zur Docker-API des Daemons im Runner-Pod (Gateway des Job-Netzes):
# 2375 (ohne TLS) zu, 2376 nur mit Client-Zertifikat, das der Job nicht hat.
gateway_hex=$(awk '$2 == "00000000" { print $3; exit }' /proc/net/route)
[ -n "$gateway_hex" ] || fail "kein Standard-Gateway gefunden – Prüfung wäre wirkungslos"
gateway=$(printf '%d.%d.%d.%d' "0x${gateway_hex:6:2}" "0x${gateway_hex:4:2}" "0x${gateway_hex:2:2}" "0x${gateway_hex:0:2}")
if reachable "$gateway" 2375; then fail "Docker-API ohne TLS am Gateway $gateway:2375"; fi
if curl -sk --max-time 5 "https://$gateway:2376/version" >/dev/null 2>&1; then
fail "Docker-API am Gateway $gateway:2376 ohne Client-Zertifikat nutzbar"
fi
# 3. Kein Clusternetz: Kubernetes-API (Service und Knoten) und fremde Namespaces.
for target in 10.43.0.1:443 10.50.1.51:6443 10.50.1.52:6443 10.50.1.53:6443; do
if reachable "${target%:*}" "${target##*:}"; then fail "$target ist erreichbar"; fi
done
resolve kubernetes.default.svc.cluster.local >/dev/null || fail "Clusternamen nicht auflösbar – Prüfung wäre wirkungslos"
# Fremder Namespace (VyCept-Datenbank) und eigener Namespace (Gitea-Datenbank).
for target in vycept-postgres.vycept.svc.cluster.local:5432 gitea-postgres.gitea.svc.cluster.local:5432; do
host=${target%:*}
address=$(resolve "$host") || fail "$host nicht auflösbar – Prüfung wäre wirkungslos"
if reachable "$address" "${target##*:}"; then fail "$host ($address) ist erreichbar"; fi
done
# 4. Internet bleibt erreichbar (npm, GitHub, Images).
reachable registry.npmjs.org 443 || fail "Internet (registry.npmjs.org) nicht erreichbar"
echo "Runner-Isolation in Ordnung (Gateway $gateway, kein Socket, kein Clusternetz)"