feat(betrieb): Abbild, Compose-Stapel und Betriebsskripte
Dreistufiges Dockerfile mit standalone-Ausgabe; im Laufzeitabbild liegen weder Quelltext noch Bauwerkzeuge, und es läuft unter einem eigenen Benutzer. Die Migrationen erledigt ein eigener Einmaldienst aus der Bau-Stufe. Der Versuch, nur die Prisma-CLI ins Laufzeitabbild zu kopieren, scheiterte an ihren transitiven Modulen; sie alle mitzunehmen hätte das Abbild aufgebläht. Der Dienst läuft vor der App und muss sauber durchlaufen. Zwei Stellen mussten faul werden, weil Next beim Bauen Seitendaten sammelt und dabei Module lädt, die es zur Bauzeit noch ohne Umgebungsvariablen gibt: - Der Prisma-Client entsteht erst beim ersten Zugriff, über einen Proxy. - Die Auth.js-Konfiguration wird als Funktion übergeben. Ebenso liest prisma.config.ts die URL über process.env statt über env(), das beim Bauen ohne Datenbank abbricht. Dazu backup.sh, update.sh mit Rückrollpfad und scripts/release.sh. Der Dump wurde nachweislich in eine Wegwerf-Datenbank zurückgespielt und stimmt zeilengenau mit dem Original überein. Alle Skripte sind shellcheck-sauber. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
126ad93301
commit
f91d015cc4
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env bash
|
||||
# Setzt eine neue Version: package.json, CHANGELOG, Commit und Tag.
|
||||
# Pusht bewusst nicht – das geschieht erst nach ausdrücklicher Freigabe.
|
||||
set -euo pipefail
|
||||
|
||||
WURZEL="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "$WURZEL"
|
||||
|
||||
meldung() { printf '▸ %s\n' "$1"; }
|
||||
fehler() {
|
||||
printf 'Fehler: %s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
hilfe() {
|
||||
cat <<'ENDE'
|
||||
Verwendung: scripts/release.sh <version>
|
||||
|
||||
<version> Semantische Version ohne führendes v, z. B. 0.1.0
|
||||
|
||||
Ablauf:
|
||||
1. Sauberen Arbeitsbaum und grüne Prüfungen sicherstellen
|
||||
2. Version in package.json setzen
|
||||
3. "Unveröffentlicht" im CHANGELOG in einen datierten Abschnitt überführen
|
||||
4. chore(release): <version> committen und Tag v<version> anlegen
|
||||
|
||||
Es wird nicht gepusht.
|
||||
ENDE
|
||||
}
|
||||
|
||||
VERSION="${1:-}"
|
||||
case "$VERSION" in
|
||||
''|--hilfe|-h) hilfe; [ -z "$VERSION" ] && exit 1; exit 0 ;;
|
||||
esac
|
||||
|
||||
printf '%s' "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$' \
|
||||
|| fehler "\"$VERSION\" sieht nicht nach einer semantischen Version aus (z. B. 0.1.0)."
|
||||
|
||||
TAG="v$VERSION"
|
||||
|
||||
# --- 1. Voraussetzungen ----------------------------------------------------
|
||||
meldung 'Arbeitsbaum prüfen.'
|
||||
[ -d .git ] || fehler 'Kein Git-Arbeitsbaum.'
|
||||
[ -z "$(git status --porcelain)" ] || fehler 'Der Arbeitsbaum ist nicht sauber.'
|
||||
|
||||
git rev-parse -q --verify "refs/tags/$TAG" >/dev/null \
|
||||
&& fehler "Den Tag $TAG gibt es schon."
|
||||
|
||||
[ -f CHANGELOG.md ] || fehler 'CHANGELOG.md fehlt.'
|
||||
grep -q '^## \[Unveröffentlicht\]' CHANGELOG.md \
|
||||
|| fehler 'Im CHANGELOG fehlt der Abschnitt "## [Unveröffentlicht]".'
|
||||
|
||||
INHALT="$(awk '
|
||||
/^## \[Unveröffentlicht\]/ { sammeln = 1; next }
|
||||
sammeln && /^## / { exit }
|
||||
sammeln { print }
|
||||
' CHANGELOG.md | grep -v '^[[:space:]]*$' || true)"
|
||||
[ -n "$INHALT" ] || fehler 'Der Abschnitt "Unveröffentlicht" ist leer.'
|
||||
|
||||
meldung 'Prüfungen laufen lassen.'
|
||||
npm run pruefen || fehler 'Die Prüfungen sind nicht grün.'
|
||||
|
||||
# --- 2. Version setzen -----------------------------------------------------
|
||||
meldung "Version auf $VERSION setzen."
|
||||
npm version "$VERSION" --no-git-tag-version --allow-same-version >/dev/null
|
||||
|
||||
# --- 3. CHANGELOG ----------------------------------------------------------
|
||||
meldung 'CHANGELOG fortschreiben.'
|
||||
HEUTE="$(date '+%Y-%m-%d')"
|
||||
TEMP="$(mktemp)"
|
||||
awk -v version="$VERSION" -v heute="$HEUTE" '
|
||||
/^## \[Unveröffentlicht\]/ {
|
||||
print "## [Unveröffentlicht]"
|
||||
print ""
|
||||
print "## [" version "] – " heute
|
||||
next
|
||||
}
|
||||
{ print }
|
||||
' CHANGELOG.md > "$TEMP"
|
||||
mv "$TEMP" CHANGELOG.md
|
||||
|
||||
npx prettier --write package.json CHANGELOG.md >/dev/null 2>&1 || true
|
||||
|
||||
# --- 4. Commit und Tag -----------------------------------------------------
|
||||
meldung "Commit und Tag $TAG anlegen."
|
||||
git add package.json package-lock.json CHANGELOG.md
|
||||
git commit -m "chore(release): $VERSION"
|
||||
git tag -a "$TAG" -m "Planer $VERSION"
|
||||
|
||||
meldung "Fertig. $TAG ist angelegt, aber nicht gepusht."
|
||||
printf '\nNach der Freigabe:\n'
|
||||
printf ' git push origin %s\n' "$(git rev-parse --abbrev-ref HEAD)"
|
||||
printf ' git push origin %s\n' "$TAG"
|
||||
Reference in New Issue
Block a user