feat: Versionierung mit Changelog, Version 1.0.0
Bis jetzt stand nirgends, welcher Stand laeuft. Beim Aktualisieren auf einem Server ist das die erste Frage. CHANGELOG.md nach Keep a Changelog, Versionsnummern nach SemVer. Der Changelog sagt, was sich beim Arbeiten aendert - nicht, welche Datei angefasst wurde. Dazu eine Tabelle, was Major, Minor und Patch fuer den Betreiber praktisch bedeuten, und der Hinweis, dass sich eine Datenbank-Migration nicht zurueckrollen laesst. Die Version steht bewusst an zwei Stellen: package.json und src/lib/version.ts. Ein Import der package.json waere im Standalone-Build eine andere Datei als die des Projekts - die Zahl haenge dann an der Laufzeit. Ein Test haelt beide zusammen, und "npm run version" setzt sie gemeinsam samt Changelog-Abschnitt. Committet und getaggt wird nicht automatisch. Ein Changelog-Eintrag, den niemand gegengelesen hat, ist keinen Deut besser als keiner. Sichtbar wird die Version unten in der Seitenleiste und unter /api/gesundheit - dort mit Git-Stand, den der Docker-Build hineinreicht. Auf der Anmeldeseite steht sie nicht: wer nicht angemeldet ist, muss nicht wissen, welche Fassung hier laeuft. Etappe: 8 Phase: Haertung
This commit is contained in:
@@ -7,6 +7,7 @@ import { aktiveBetreute, erfordereBenutzer, erfordereZweitenFaktor, meineBetreut
|
||||
import { darf } from '@/lib/auth/rollen'
|
||||
import { ROLLEN_BESCHRIFTUNG } from '@/lib/auth/rollen'
|
||||
import { db, nichtGeloescht } from '@/lib/db'
|
||||
import { versionstext } from '@/lib/version'
|
||||
|
||||
/**
|
||||
* Rahmen aller Fachseiten.
|
||||
@@ -64,6 +65,7 @@ export default async function AppLayout({ children }: { children: React.ReactNod
|
||||
return (
|
||||
<AppHuelle
|
||||
navigation={navigation}
|
||||
version={versionstext()}
|
||||
kopfzeile={
|
||||
<BetreuteAuswahl
|
||||
aktiveId={aktive.id}
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
import { NextResponse } from 'next/server'
|
||||
import { db } from '@/lib/db'
|
||||
import { COMMIT, VERSION } from '@/lib/version'
|
||||
|
||||
/**
|
||||
* Betriebsbereitschaft fuer den Healthcheck in docker-compose.
|
||||
*
|
||||
* Bewusst ohne Anmeldung, aber auch ohne jede Auskunft ueber Inhalte:
|
||||
* geprueft wird nur, ob die Datenbank antwortet. Version und Datenbestand
|
||||
* gehen niemanden etwas an, der die Adresse errät.
|
||||
* Bewusst ohne Anmeldung, aber ohne jede Auskunft ueber Inhalte: geprueft
|
||||
* wird nur, ob die Datenbank antwortet.
|
||||
*
|
||||
* Die Version steht dabei: sie wird beim Aktualisieren gebraucht, um zu
|
||||
* sehen, ob der neue Stand tatsaechlich laeuft. Das ist keine Auskunft
|
||||
* ueber die betreuten Daten, und die Adresse ist ohnehin nur ueber den
|
||||
* eigenen Reverse Proxy erreichbar.
|
||||
*/
|
||||
export const runtime = 'nodejs'
|
||||
export const dynamic = 'force-dynamic'
|
||||
@@ -14,10 +19,13 @@ export const dynamic = 'force-dynamic'
|
||||
export async function GET() {
|
||||
try {
|
||||
await db.$queryRaw`SELECT 1`
|
||||
return NextResponse.json({ status: 'bereit' }, { headers: { 'Cache-Control': 'no-store' } })
|
||||
return NextResponse.json(
|
||||
{ status: 'bereit', version: VERSION, commit: COMMIT || undefined },
|
||||
{ headers: { 'Cache-Control': 'no-store' } },
|
||||
)
|
||||
} catch {
|
||||
return NextResponse.json(
|
||||
{ status: 'datenbank nicht erreichbar' },
|
||||
{ status: 'datenbank nicht erreichbar', version: VERSION },
|
||||
{ status: 503, headers: { 'Cache-Control': 'no-store' } },
|
||||
)
|
||||
}
|
||||
|
||||
@@ -21,12 +21,15 @@ export function AppHuelle({
|
||||
kopfzeile,
|
||||
schnellerfassung,
|
||||
benutzerbereich,
|
||||
version,
|
||||
children,
|
||||
}: {
|
||||
navigation: NavEintrag[]
|
||||
kopfzeile: React.ReactNode
|
||||
schnellerfassung?: React.ReactNode
|
||||
benutzerbereich: React.ReactNode
|
||||
/** Wird unten in der Seitenleiste angezeigt - hilft beim Aktualisieren. */
|
||||
version?: string
|
||||
children: React.ReactNode
|
||||
}) {
|
||||
const [menueOffen, setMenueOffen] = React.useState(false)
|
||||
@@ -73,7 +76,14 @@ export function AppHuelle({
|
||||
<Navigation eintraege={navigation} />
|
||||
</div>
|
||||
|
||||
<div className="border-t p-3">{benutzerbereich}</div>
|
||||
<div className="border-t p-3">
|
||||
{benutzerbereich}
|
||||
{version && (
|
||||
<p className="px-2 pt-2 text-xs text-muted-foreground">
|
||||
Version {version}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
{/* --- Kopfzeile am Handy ------------------------------------------- */}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Versionsangaben der Anwendung.
|
||||
*
|
||||
* VERSION wird vom Skript `npm run version` zusammen mit der package.json
|
||||
* gesetzt - es gibt also genau eine Quelle, aus der beide gespeist werden.
|
||||
* Ein Test (tests/version.test.ts) prueft, dass sie nicht auseinanderlaufen.
|
||||
*
|
||||
* Warum nicht einfach die package.json importieren? Im Standalone-Build
|
||||
* liegt eine andere package.json neben dem Server als die des Projekts.
|
||||
* Die Zahl waere dann je nach Laufzeit eine andere - genau das, was man
|
||||
* bei einer Versionsangabe nicht gebrauchen kann.
|
||||
*
|
||||
* Die Angabe ist kein Geheimnis, aber auch keine oeffentliche Auskunft:
|
||||
* sie steht in den Einstellungen und im Gesundheitsendpunkt, nicht auf
|
||||
* der Anmeldeseite. Wer nicht angemeldet ist, muss nicht wissen, welche
|
||||
* Fassung hier laeuft.
|
||||
*/
|
||||
|
||||
/** Muss zur "version" in der package.json passen. */
|
||||
export const VERSION = '1.0.0'
|
||||
|
||||
/**
|
||||
* Kurzer Git-Stand, beim Bauen hineingereicht:
|
||||
*
|
||||
* docker build --build-arg GIT_COMMIT=$(git rev-parse --short HEAD) .
|
||||
*
|
||||
* Fehlt die Angabe (etwa im Entwicklungsmodus), bleibt sie leer. Dann
|
||||
* zeigt die Oberflaeche nur die Version.
|
||||
*/
|
||||
export const COMMIT = process.env.NEXT_PUBLIC_GIT_COMMIT ?? ''
|
||||
|
||||
/** Zeitpunkt des Bauens, ebenfalls beim Bauen hineingereicht. */
|
||||
export const GEBAUT_AM = process.env.NEXT_PUBLIC_BUILD_ZEIT ?? ''
|
||||
|
||||
/** "1.0.0" oder "1.0.0 · 4b953e7" - fuer die Anzeige. */
|
||||
export function versionstext(): string {
|
||||
return COMMIT ? `${VERSION} · ${COMMIT}` : VERSION
|
||||
}
|
||||
Reference in New Issue
Block a user