Files
Lucas Orth 208aadc9bc Tests im Dockerfile statt über setup-python
actions/setup-python@v5 lädt seine Runtime von GitHub-Releases und
scheitert auf dem Gitea-Runner - der Lauf brach vor dem Deploy ab.

Die Tests laufen jetzt in einer eigenen Dockerfile-Stufe, die der
Workflow mit --target test aufruft. Damit gilt für sie dieselbe
Python-Version und derselbe Paketstand wie für die Produktion, und der
Schritt braucht nichts außer dem Docker-Daemon, den der Runner ohnehin
nutzt. Ein Bind-Mount des Workspace wäre keine Option gewesen: der liegt
im Job-Container, der Pfad zeigt auf dem Host ins Leere.

Die Teststufe hängt nicht am finalen Image und wird beim Deploy-Build
übersprungen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 12:13:42 +02:00

49 lines
1.6 KiB
YAML

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).
- uses: actions/checkout@v4
with:
github-server-url: http://gitea:3000
# Kein setup-python: die Action laedt ihre Runtime von GitHub-Releases
# und scheitert auf dem Gitea-Runner. Stattdessen laufen die Tests in
# einer eigenen Stufe des Dockerfiles - gegen dieselbe Python-Version
# und dieselben Pakete wie die Produktion. Ein roter Lauf bricht hier
# ab, bevor irgendetwas auf dem Server angefasst wird.
- name: Tests
run: docker build --target test .
- name: Tag ermitteln
run: echo "IMAGE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
# Ein einziges Repo-Secret DOTENV mit dem kompletten .env-Inhalt.
# 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 300
- name: Alte Layer aufraeumen
run: docker image prune -f