Pipeline at a glance
flowchart LR
Dev["Developer"] -->|"npm run lint"| Lint
Dev --> Build["./deploy/build.sh"]
Lint --> Build
Build --> Docker["Docker buildx\nmulti-stage"]
Docker --> Image["registry.halla-aho.net/thalla/lomavuokraus-web"]
Image --> Push["./deploy/push.sh"]
Push --> DeployStg["./deploy/deploy-staging.sh"]
Push --> DeployProd["./deploy/deploy-prod.sh"]
DeployStg --> RolloutStg["kubectl apply + rollout\n(staging)"]
DeployProd --> RolloutProd["kubectl apply + rollout\n(prod)"]
Edit the Mermaid block to reflect pipeline changes; no external tooling required.
Build Inputs
- Source: Next.js app with TypeScript and Prisma.
- Env:
.env(local), K8s Secretlomavuokraus-web-secretsin cluster. - Prisma schema:
prisma/schema.prisma, migrations inprisma/migrations/.
NPM Scripts
npm run lint→next lintnpm run build→next build(used inside Docker and locally)
Docker Image
- Multi-stage Dockerfile:
- deps: npm ci
- builder: copy source,
npx prisma generate,npm run build - runner: Node 20 bookworm-slim, copy standalone + static
- Tags: numeric (git SHA-derived) +
:latest. - Scan: Trivy runs post-build if available.
Deploy Scripts
deploy/build.sh→ build image, writedeploy/.last-image.deploy/push.sh→ push image.deploy/deploy.sh→ envsubstk8s/app.yaml, kubectl apply, rollout.- Environment wrappers:
deploy/deploy-staging.shdeploy/deploy-prod.shdeploy/deploy-test.sh
- DNS helpers:
deploy/update-test-dns.shupdates test.lomavuokraus.fi + apitest.lomavuokraus.fi via Joker DYNDNS.
Config & Env Vars
- From ConfigMap (public):
NEXT_PUBLIC_SITE_URL,NEXT_PUBLIC_API_BASE,APP_ENV. - From Secret: DB URL, AUTH_SECRET, SMTP, DKIM, etc.
- App env resolution:
process.env.*in Next server code.