Add release/dev build scripts and branch-based deploy workflow

- scripts/release.sh: build from main, tag :latest + short SHA, push
  both. Aborts if not on main or working tree is dirty; warns on
  unpushed commits. Prevents dev states from becoming :latest.
- scripts/dev-build.sh: local dev image (tagged per branch), never
  pushed -- keeps development builds off the registry.
- docs/deployment.md: document branch/PR workflow, replace manual
  build/push steps with the scripts, SHA-based rollback now standard.
- .gitattributes: force LF on *.sh so the shebang works on Windows.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
tleiningerandClaude Opus 4.8 committed 2026-09-21 07:58:46 +02:00
1 parent 99dd052929
commit 94d9cac77b
4 files changed
+119 -30

No files matched your search

+39 -30
View File
@@ -35,35 +35,44 @@ eingegeben werden muss.
---
## Arbeitsweise: Branches, nie direkt auf main
`main` ist der **veröffentlichte** Stand — nur daraus wird `:latest` gebaut, und
nur `:latest` zieht Unraid. Deshalb wird nie direkt auf `main` committet:
1. Feature-Branch anlegen: `git switch -c <bereich>/<kurz>` (z.B.
`deployment/sha-tagging`, `content/pipeline`).
2. Dort committen, Branch pushen: `git push -u origin <branch>`.
3. In Gitea einen **Pull Request** gegen `main` öffnen und dort mergen.
4. Erst danach aus `main` das Release-Image bauen (unten).
**Dev-Images bleiben lokal.** Zum Ausprobieren auf dem eigenen Rechner:
```bash
scripts/dev-build.sh # baut elternbeirat-web:dev-<branch>, pusht NICHTS
```
So kann ein Entwicklungsstand nie versehentlich als `:latest` in der Registry
landen.
## Neuen Stand ausrollen (Handbetrieb)
Alle Befehle auf dem Entwicklungsrechner (Docker installiert), im Repo-Root.
### 1. Image bauen
Voraussetzung: einmalig an der Registry angemeldet (siehe unten). Dann, **auf
main** und mit sauberem Arbeitsverzeichnis:
```bash
docker build -t gitea.anticarnist.de/tom/elternbeirat:latest .
scripts/release.sh
```
Der Image-Pfad ist **kleingeschrieben** — Container-Registries verlangen das im
Pfad, obwohl Benutzer (`Tom`) und Repo (`Elternbeirat`) großgeschrieben sind.
Das Skript baut das Image, taggt es mit `:latest` **und** dem Commit-Kurz-SHA
(für Rollback) und pusht beide. Es **bricht ab**, wenn du nicht auf `main` bist
oder uncommittete Änderungen hast, und warnt bei ungepushten Commits.
### 2. An der Registry anmelden (einmalig, bis das Token wechselt)
> Der Image-Pfad `gitea.anticarnist.de/tom/elternbeirat` ist **kleingeschrieben**
> — Container-Registries verlangen das im Pfad, obwohl Benutzer (`Tom`) und Repo
> (`Elternbeirat`) großgeschrieben sind.
```bash
docker login gitea.anticarnist.de
```
- **Username:** `Tom`
- **Password:** das `package`-Token (nicht das Kontopasswort).
### 3. Image in die Registry pushen
```bash
docker push gitea.anticarnist.de/tom/elternbeirat:latest
```
### 4. Unraid einmalig an der Registry anmelden
### Unraid einmalig an der Registry anmelden
Das Image ist **privat**, deshalb muss Unraid sich einmal anmelden, bevor es
ziehen kann. Das **Compose Manager Plus**-Plugin hat dafür kein UI-Feld — der
@@ -90,7 +99,7 @@ wechselt. Zwei erfahrungsgemäße Stolpersteine:
`/root/.docker/config.json`. Auf dem eigenen Server für den Anfang okay.
*Später sauberer:* einen Credential-Helper einrichten (→ offener Punkt unten).
### 5. Auf Unraid neu ziehen und starten
### Auf Unraid neu ziehen und starten
Im **Compose Manager Plus**-Plugin (Unraid-Weboberfläche):
@@ -150,17 +159,17 @@ networks:
## Rollback
`:latest` allein macht Rollback unmöglich — deshalb sobald wir auf Gitea Actions
umstellen (Schritt 10) **immer auch mit dem Commit-SHA taggen** und pushen:
`scripts/release.sh` taggt jeden Release zusätzlich mit dem Commit-Kurz-SHA, der
sich — anders als das wandernde `:latest` — nie verschiebt. Zum Zurückrollen in
der Unraid-`compose.yaml` `:latest` durch `:<sha>` des letzten funktionierenden
Stands ersetzen und neu hochfahren:
```bash
docker build -t gitea.anticarnist.de/tom/elternbeirat:latest \
-t gitea.anticarnist.de/tom/elternbeirat:<sha> .
docker push gitea.anticarnist.de/tom/elternbeirat --all-tags
```yaml
image: gitea.anticarnist.de/tom/elternbeirat:99dd052 # statt :latest
```
Zum Zurückrollen in der Unraid-`compose.yaml` `:latest` durch `:<sha>` des
letzten funktionierenden Stands ersetzen und neu hochfahren.
Welche SHA-Tags in der Registry liegen, zeigt Gitea unter
`Tom/-/packages` → `elternbeirat`.
---