From a91f32c70c71f45d2125fcd091b7bc2eb579ed24 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Wed, 22 Jul 2026 19:32:59 +0200 Subject: [PATCH] =?UTF-8?q?CI-Ampel=20nachger=C3=BCstet=20(Wasserdicht-Run?= =?UTF-8?q?de=2022.07.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 76 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .gitea/workflows/ci.yml diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..ecb0bfd --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,76 @@ +# Universelle CI-Ampel — wird bei der Repo-Anlage automatisch eingepflanzt +# (gitea-repo-create.sh, Wasserdicht-Runde 22.07.2026) und läuft auf dem +# Gitea-Actions-Runner (arcane-VM). +# GRUNDSATZ: Rot ist ein Ergebnis („nicht bewiesen"), kein Ärgernis. +# • Reines Doku-Repo (noch kein Code) → GRÜN mit Vermerk. +# • Code ohne Tests → ROT. Tests sind Pflicht, kein Deko. +# Der Workflow erkennt selbst, was das Projekt ist (Python / Node / beides). +name: Ampel +on: [push, pull_request] + +jobs: + ampel: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Ampel — erkennt Projekt-Typ selbst und prüft entsprechend + shell: bash + run: | + # Der Runner startet bash mit -e — das schalten wir ab: die Ampel wertet + # JEDEN Fehler selbst (rot=1) und liefert am Ende EIN Klartext-Urteil. + # (Lehre Lauf #5: ungeschütztes pytest unter -e schnitt den Bericht ab.) + set -u +e + rot=0 + py_datei=$(find . -name '*.py' -not -path './.git/*' -not -path '*/node_modules/*' -print -quit) + pkg_dateien=$(find . -name package.json -not -path '*/node_modules/*' -not -path './.git/*') + + if [ -z "$py_datei" ] && [ -z "$pkg_dateien" ]; then + echo "✅ Doku-Repo (noch kein Code) — Ampel GRÜN mit Vermerk." + exit 0 + fi + + if [ -n "$py_datei" ]; then + echo "== Python erkannt ==" + { python3 -m venv /tmp/ampel-venv && . /tmp/ampel-venv/bin/activate; } || { echo "❌ Python-Setup kaputt (venv)"; exit 1; } + pip install -q ruff pytest || { echo "❌ Werkzeug-Installation kaputt"; exit 1; } + echo "-- Ruff (Linter: toter Code, kaputte Imports, Schlampereien)" + ruff check . || rot=1 + echo "-- Abhängigkeiten installierbar? (halluzinierte Pakete fliegen hier auf)" + while IFS= read -r req; do + [ -n "$req" ] || continue + pip install -q -r "$req" || { echo "❌ $req nicht installierbar"; rot=1; } + done < <(find . -name 'requirements*.txt' -not -path '*/node_modules/*' -not -path './.git/*') + echo "-- Importierbar? (kaputte Modul-Struktur fliegt hier auf)" + python -m compileall -q . || rot=1 + echo "-- Pytest (keine Tests gefunden = ROT)" + ec=0; pytest -q || ec=$? + if [ $ec -eq 5 ]; then + echo "❌ KEINE TESTS GEFUNDEN — Tests sind Pflicht, kein Deko (AGENTS.md)." + rot=1 + elif [ $ec -ne 0 ]; then + rot=1 + fi + fi + + if [ -n "$pkg_dateien" ]; then + echo "== Node/TypeScript erkannt ==" + while IFS= read -r pkg; do + [ -n "$pkg" ] || continue + d=$(dirname "$pkg") + echo "-- $d" + if [ ! -f "$d/package-lock.json" ]; then + echo "❌ $d: kein package-lock.json — Build nicht reproduzierbar." + echo " Fix: dort 'npm install --package-lock-only' ausführen und committen." + rot=1; continue + fi + (cd "$d" && npm ci --no-audit --no-fund) || { rot=1; continue; } + if grep -q '"build"' "$pkg"; then (cd "$d" && npm run build) || rot=1; fi + if grep -q '"test"' "$pkg"; then (cd "$d" && npm test --silent) || rot=1; fi + done <<< "$pkg_dateien" + fi + + if [ $rot -ne 0 ]; then + echo "❌ AMPEL ROT — nichts heißt ‚fertig', solange das rot ist." + fi + exit $rot