Initial
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
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'
|
||||
Reference in New Issue
Block a user