Files
OPNexus/.github/workflows/ci.yml
T
Julian Boldt c662a58426
Release / verify (push) Canceled after 0s
CI / checks (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / backend (push) Canceled after 0s
Release / test (push) Canceled after 0s
Release / publish (backend) (push) Canceled after 0s
Release / publish (frontend) (push) Canceled after 0s
Release / publish (proxy) (push) Canceled after 0s
Release / publish (updater) (push) Canceled after 0s
Release v1.15.0
Updates aus dem Webinterface. Auf Klick, mit Fortschritt und automatischem Rollback; ein eigener,
optionaler Container erledigt die Arbeit. Ende-zu-Ende mit echten Images getestet, siehe Handbuch
„Update aus dem Webinterface (optional)“:

- **Updates aus dem Webinterface (optional):** Einstellungen › „OPNexus aktualisieren“ zeigt die
  neueste Version samt Release-Notes und aktualisiert auf Klick — mit Fortschrittsanzeige,
  automatischem Rollback bei einem fehlgeschlagenen Update und „Auf Vorversion zurücksetzen“
  (mit Hinweis, ob dabei Daten verloren gehen). Dahinter arbeitet ein eigener, kleiner
  **Updater-Container** (`updater/`, Compose-Profil `updater`, mit `COMPOSE_PROFILES=updater`
  in `.env` aktivieren), der dieselbe Logik wie `opnexus update` ausführt. Er ist standardmäßig
  **aus** und der einzige Container mit Docker-Socket; das Backend bekommt ihn nie. Der Updater
  hat keinen veröffentlichten Port, ist nur mit einem selbst erzeugten Token ansprechbar und kann
  ausschließlich „aktualisieren auf die vom Release-Feed gemeldete neueste stabile Version“,
  „zurückrollen“ und „Status“. Hauptversions-Sprünge bleiben der Kommandozeile vorbehalten.
  Anfragen stehen im Audit-Log (neuer Typ „OPNexus-System“). Gilt nur für Release-Images.
- `opnexus` (jetzt in `updater/opnexus`, `scripts/opnexus` ist ein Symlink): `status --porcelain`,
  Exit-Code 3 für „fehlgeschlagen und sauber zurückgerollt“. Release-Images und -Bundle enthalten
  zusätzlich `opnexus-updater`.
- Der Banner „Neue Version verfügbar“ verlinkt auf den neuen Abschnitt in den Einstellungen.
2026-10-10 00:24:01 +02:00

64 lines
2.2 KiB
YAML

# Tests bei jedem Push/PR. Wird auch vom Release-Workflow wiederverwendet,
# damit ein Release-Tag nie Images baut, deren Tests nicht grün waren.
#
# Die Jobs laufen bewusst in Containern (`container:`): dann ist der
# Postgres-Service überall unter dem Namen "postgres" erreichbar — auf
# GitHub genauso wie auf einem Forgejo/Gitea-Runner im Docker-Modus.
name: CI
on:
push:
branches: [master]
pull_request:
workflow_call:
jobs:
backend:
runs-on: ubuntu-latest
# Volles Image (nicht -slim): enthält git für actions/checkout.
container: python:3.12
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: opnexus
POSTGRES_PASSWORD: ci
# conftest.py erwartet eine DB, deren Name auf _test endet.
POSTGRES_DB: opnexus_test
options: >-
--health-cmd "pg_isready -U opnexus"
--health-interval 5s --health-timeout 5s --health-retries 10
env:
DATABASE_URL: postgresql+asyncpg://opnexus:ci@postgres:5432/opnexus_test
steps:
- uses: actions/checkout@v4
# pg_dump/pg_restore 16 wie im Backend-Image (Dumps nur gleiche Hauptversion).
- run: backend/scripts/install_pg_client.sh 16
- run: pip install -r backend/requirements.txt
- run: python -m pytest -q
working-directory: backend
frontend:
runs-on: ubuntu-latest
container: node:20
steps:
- uses: actions/checkout@v4
- run: npm ci --no-audit --no-fund
working-directory: frontend
- run: npm run lint
working-directory: frontend
# next build prüft auch die Typen.
- run: npm run build
working-directory: frontend
# Schnelle Konsistenzprüfungen, die ohne Datenbank und Build auskommen.
checks:
runs-on: ubuntu-latest
container: node:20
steps:
- uses: actions/checkout@v4
- run: python3 scripts/check_i18n.py
- run: bash -n scripts/opnexus && bash -n scripts/check_version.sh && bash -n scripts/make_release_bundle.sh
# Updater-Container (Zustandsübergänge, Ablehnungen, Auth) ohne Docker-Daemon.
- run: python3 -m unittest discover -s updater -p 'test_*.py'