149 lines
5.8 KiB
YAML
149 lines
5.8 KiB
YAML
name: EK-DOS-WEB bauen und ausrollen
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
DEPLOY_HOST: 10.0.11.131
|
|
DEPLOY_USER: deploy
|
|
DEPLOY_ROOT: /var/www/ekdos
|
|
|
|
jobs:
|
|
# ──────────────────────────────────────────────────────────────────────────
|
|
# Die Oberfläche wird hier zu statischen Dateien kompiliert. Node existiert
|
|
# ausschliesslich in diesem Container; auf dem Zielserver läuft keines.
|
|
# ──────────────────────────────────────────────────────────────────────────
|
|
frontend:
|
|
runs-on: ubuntu-latest
|
|
container: node:22-bookworm-slim
|
|
defaults:
|
|
run:
|
|
working-directory: frontend
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: pnpm bereitstellen
|
|
run: corepack enable && corepack prepare pnpm@10.16.1 --activate
|
|
|
|
- name: Abhängigkeiten installieren
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
# Typprüfung getrennt, damit ein Typfehler nicht als Bündelfehler erscheint.
|
|
- name: Typen prüfen
|
|
run: pnpm typecheck
|
|
|
|
- name: Bündel bauen
|
|
run: pnpm build
|
|
|
|
- uses: actions/upload-artifact@v3
|
|
with:
|
|
name: frontend-dist
|
|
path: frontend/dist
|
|
retention-days: 7
|
|
|
|
# ──────────────────────────────────────────────────────────────────────────
|
|
# Das Backend wird nicht kompiliert, aber geprüft: Syntax aller Dateien und
|
|
# ein Abhängigkeitsbaum ohne Entwicklungspakete.
|
|
# ──────────────────────────────────────────────────────────────────────────
|
|
backend:
|
|
runs-on: ubuntu-latest
|
|
container: php:8.5-cli
|
|
defaults:
|
|
run:
|
|
working-directory: backend
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Composer und Erweiterungen bereitstellen
|
|
run: |
|
|
apt-get update && apt-get install -y --no-install-recommends git unzip libpq-dev
|
|
docker-php-ext-install pdo_pgsql
|
|
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
|
|
|
- name: Abhängigkeiten installieren
|
|
run: composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-req=ext-redis
|
|
|
|
- name: Syntax prüfen
|
|
run: find src public bin -type f \( -name '*.php' -o -name 'ekdos' \) -print0 | xargs -0 -n1 php -l
|
|
|
|
- uses: actions/upload-artifact@v3
|
|
with:
|
|
name: backend-build
|
|
path: |
|
|
backend
|
|
!backend/.env
|
|
retention-days: 7
|
|
|
|
# ──────────────────────────────────────────────────────────────────────────
|
|
# Ausrollen. Jede Veröffentlichung landet in einem eigenen Verzeichnis; erst
|
|
# der Symlink-Tausch macht sie sichtbar. Ein Fehlschlag lässt die laufende
|
|
# Fassung unberührt.
|
|
# ──────────────────────────────────────────────────────────────────────────
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
needs: [frontend, backend]
|
|
if: gitea.ref == 'refs/heads/main'
|
|
steps:
|
|
- uses: actions/download-artifact@v3
|
|
with:
|
|
name: frontend-dist
|
|
path: dist
|
|
|
|
- uses: actions/download-artifact@v3
|
|
with:
|
|
name: backend-build
|
|
path: backend
|
|
|
|
- name: SSH einrichten
|
|
run: |
|
|
install -m 700 -d ~/.ssh
|
|
echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/id_ed25519
|
|
chmod 600 ~/.ssh/id_ed25519
|
|
ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
|
|
|
|
- name: Oberfläche übertragen
|
|
run: |
|
|
RELEASE="$DEPLOY_ROOT/releases/${{ gitea.sha }}"
|
|
ssh "$DEPLOY_USER@$DEPLOY_HOST" "mkdir -p '$RELEASE'"
|
|
rsync -az --delete dist/ "$DEPLOY_USER@$DEPLOY_HOST:$RELEASE/"
|
|
|
|
- name: Backend übertragen
|
|
run: |
|
|
# .env bleibt auf dem Server und wird nie überschrieben.
|
|
rsync -az --delete \
|
|
--exclude '.env' \
|
|
--exclude 'var/cache' \
|
|
backend/ "$DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_ROOT/backend/"
|
|
|
|
- name: Umschalten und neu laden
|
|
run: |
|
|
ssh "$DEPLOY_USER@$DEPLOY_HOST" bash -euo pipefail <<'REMOTE'
|
|
cd /var/www/ekdos
|
|
|
|
# Schema fortschreiben, bevor die neue Oberfläche sichtbar wird.
|
|
php backend/bin/ekdos migrate
|
|
|
|
# Atomarer Tausch: ln -sfn auf ein temporäres Ziel, dann umbenennen.
|
|
ln -sfn "releases/${GITEA_SHA:-$(ls -1t releases | head -1)}" current.new
|
|
mv -Tf current.new current
|
|
|
|
# Opcache hält den alten Quelltext, bis fpm neu lädt.
|
|
sudo systemctl reload php8.5-fpm
|
|
|
|
# Zwischengespeicherte n8n-Antworten passen womöglich nicht mehr
|
|
# zum neuen Abbildungscode.
|
|
php backend/bin/ekdos cache:flush
|
|
|
|
# Die letzten fünf Veröffentlichungen behalten.
|
|
ls -1t releases | tail -n +6 | xargs -r -I{} rm -rf "releases/{}"
|
|
REMOTE
|
|
env:
|
|
GITEA_SHA: ${{ gitea.sha }}
|
|
|
|
- name: Gesundheitsprüfung
|
|
run: |
|
|
ssh "$DEPLOY_USER@$DEPLOY_HOST" \
|
|
'curl -fsS -o /dev/null -w "%{http_code}\n" http://127.0.0.1/api/health'
|