name: Build & Deploy on: push: tags: - 'v*' jobs: deploy: runs-on: ubuntu-latest steps: # Intern klonen statt ueber die oeffentliche Domain: Gitea laeuft auf # demselben Host, der Weg ueber die oeffentliche IP findet nicht # zurueck (NAT-Hairpin). Der Job-Container erreicht Gitea ueber das # Netz gitea-ci unter seinem Containernamen. - uses: actions/checkout@v4 with: github-server-url: http://gitea:3000 # --- Build & Tests ----------------------------------------------- # Laeuft vor dem Deploy: ein roter Bundle-Build darf den Server nicht # anfassen. Der Docker-Build wiederholt die Schritte spaeter im Image. - uses: actions/setup-node@v4 with: node-version: '22' - name: Abhaengigkeiten installieren working-directory: app run: npm ci - name: Frontend-Bundles bauen working-directory: app run: npm run build - name: Server-Syntax pruefen working-directory: app run: node --check server.js # ------------------------------------------------------------------ - name: Tag ermitteln run: echo "IMAGE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV # Ein einziges Repo-Secret DOTENV mit dem kompletten .env-Inhalt # (mehrzeilig). Ueber env: statt direkter Interpolation, damit # Anfuehrungszeichen, Backticks und $ in den Werten unangetastet bleiben. - name: .env aus Secret erzeugen env: DOTENV: ${{ secrets.DOTENV }} run: | if [ -z "$DOTENV" ]; then echo "Secret DOTENV ist leer oder nicht gesetzt." exit 1 fi umask 077 echo "$DOTENV" > .env - name: Deployen run: docker compose up -d --build --remove-orphans --wait --wait-timeout 180 - name: Alte Layer aufraeumen run: docker image prune -f