Skip to content

Build und CI/CD

Build-System mit Git-Metadaten, Multi-Arch Docker-Images und automatischem Deployment.

graph LR
    subgraph Build ["Build"]
        Info["build-info.sh<br/>Git-Metadaten"]
        Vite["Vite Build<br/>SvelteKit → Static"]
    end

    subgraph Docker ["Docker"]
        Stage1["Stage 1<br/>bun:alpine"]
        Stage2["Stage 2<br/>nginx:alpine"]
    end

    subgraph CI ["GitLab CI"]
        Assets["build-assets<br/>bun install + build"]
        Amd64["build:amd64<br/>Kaniko"]
        Arm64["build:arm64<br/>Kaniko"]
        Merge["merge-manifest<br/>Docker Manifest"]
        Deploy["deploy<br/>Flux Webhook"]
    end

    Info -->|"Env Vars"| Vite
    Vite -->|"build/"| Stage1
    Stage1 -->|"Static Assets"| Stage2
    Assets --> Amd64
    Assets --> Arm64
    Amd64 --> Merge
    Arm64 --> Merge
    Merge -->|"master"| Deploy

Extrahiert Git-Metadaten vor dem Build und exportiert als Umgebungsvariablen:

VariableQuelleBeschreibung
APP_NAMEDefault: “Janus Home”Anwendungsname
GIT_TAGgit describe --tagsLetzter Git-Tag
GIT_COMMIT_SHORTgit rev-parse --shortKurzer Commit-Hash
GIT_COMMIT_FULLgit rev-parse HEADVoller Commit-Hash
GIT_COMMIT_DATEgit log -1 --format='%ci'Commit-Datum
GIT_BRANCHgit rev-parse --abbrev-refBranch-Name
BUILD_DATEdate -uUTC Build-Zeitpunkt

Die Umgebungsvariablen werden zur Compile-Zeit in den Code injiziert:

define: {
__APP_VERSION__: process.env.npm_package_version,
__GIT_TAG__: process.env.GIT_TAG,
__GIT_COMMIT_SHORT__: process.env.GIT_COMMIT_SHORT,
__GIT_COMMIT_FULL__: process.env.GIT_COMMIT_FULL,
__GIT_COMMIT_DATE__: process.env.GIT_COMMIT_DATE,
__GIT_BRANCH__: process.env.GIT_BRANCH,
__BUILD_DATE__: process.env.BUILD_DATE,
__APP_NAME__: process.env.APP_NAME,
}

Stage 1 (Builder):

  • Basis: oven/bun:1-alpine
  • Installiert Dependencies mit --frozen-lockfile Führt build-info.sh und bun run build aus

Stage 2 (Runtime):

  • Basis: nginx:alpine
  • Kopiert statische Assets
  • Läuft als non-root User nginx (UID 101)
  • Port: 8080
EinstellungWert
Port8080
GzipAktiviert
Asset-Cache1 Jahr (immutable)
SW-Cacheno-cache
SPA-Fallbackindex.html
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
StageJobImageZweck
build-assetsbuild-assetsoven/bun:1-alpineBun install + build
buildbuild:amd64KanikoDocker Image (amd64)
buildbuild:arm64KanikoDocker Image (arm64)
mergemerge-manifestdocker:27-cliMulti-Arch Manifest
deploydeployalpine:latestFlux Webhook
  1. build-assets: Bun installiert Dependencies, führt Build aus
  2. build: Kaniko baut Docker-Images fur amd64 und arm64 parallel
  3. merge-manifest: Docker Manifest vereint beide Architekturen
  4. deploy: Triggered Flux Webhook (nur auf master Branch)
  • Alle Branches: build-assets, build, merge (kein MR)
  • Nur master: deploy via Flux Webhook
BefehlBeschreibung
just installDependencies installieren
just devDev-Server starten
just buildProduktions-Build mit Git-Metadaten
just previewBuild-Vorschau
just lintESLint + Prettier
just checkTypeScript Type-Check
just testVitest ausführen
just qalint + check + test
just docker-buildLokales Docker-Image bauen
just docker-runDocker-Container starten
just version X.Y.ZVersion bumpen (package.json + Chart.yaml)