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 - uses: actions/setup-node@v4 with: node-version: '24' - run: npm ci - run: npm run build # Gate: rote Tests -> kein Deploy. Die Tests sichern die beiden # nicht verhandelbaren Punkte ab (UTC statt TZID, kein RRULE). - run: npm test - name: Tag ermitteln run: echo "IMAGE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV # Das Repo-Secret DOTENV enthaelt den kompletten .env-Inhalt (mehrzeilig). # Ueber env: statt direkter Interpolation, damit Anfuehrungszeichen, # Backticks und $ in den Werten nicht vom Shell-Parser angefasst werden. - 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 # --wait: bricht ab, wenn der Container nicht healthy wird. Ohne das # waere der Lauf gruen, obwohl der Container in einer Crash-Schleife # haengt - z. B. weil ein Wert in .env fehlt. - name: Deployen run: docker compose up -d --build --remove-orphans --wait --wait-timeout 180 - name: Alte Layer aufraeumen run: docker image prune -f