Azure DevOps pipeline verwijderd
Wordt niet gebruikt. azure-pipelines.yml is weg, en de verwijzingen ernaar in README.md, BEHEER.md (sectie CI/CD), Changelog.md en .dockerignore zijn opgeruimd. De testsuite draait onveranderd lokaal via test.ps1 / test.sh. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
1c0eed61f6
commit
9566e17f90
@@ -15,4 +15,3 @@ release.ps1
|
|||||||
release.sh
|
release.sh
|
||||||
test.ps1
|
test.ps1
|
||||||
test.sh
|
test.sh
|
||||||
azure-pipelines.yml
|
|
||||||
|
|||||||
@@ -97,21 +97,6 @@ tag op een Raspberry Pi en op een x86-server werkt.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CI/CD (Azure DevOps)
|
|
||||||
|
|
||||||
`azure-pipelines.yml` doet in drie stages hetzelfde als de lokale scripts:
|
|
||||||
|
|
||||||
| Stage | Wat |
|
|
||||||
|---|---|
|
|
||||||
| `Test` | `docker build --target test` + `docker run` → backend-tests |
|
|
||||||
| `Build` | productie-image bouwen en smoketesten tegen een postgres-container |
|
|
||||||
| `Publish` | multi-arch image (amd64 + arm64) pushen naar de registry |
|
|
||||||
|
|
||||||
`Publish` loopt alleen op `main`/`master` of een tag. Vul vóór het eerste gebruik
|
|
||||||
de variabele `dockerRegistryServiceConnection` in met de naam van je Docker
|
|
||||||
Registry service connection in Azure DevOps.
|
|
||||||
|
|
||||||
---
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
+1
-3
@@ -41,14 +41,12 @@
|
|||||||
API-routes, SPA-fallback, cache-headers en security-headers
|
API-routes, SPA-fallback, cache-headers en security-headers
|
||||||
- `test.ps1` / `test.sh`: backend-tests, productiebuild en smoketest op de
|
- `test.ps1` / `test.sh`: backend-tests, productiebuild en smoketest op de
|
||||||
echte 2-container stack
|
echte 2-container stack
|
||||||
- `azure-pipelines.yml`: CI/CD met stages Test → Build (incl. smoketest) →
|
|
||||||
Publish (multi-arch push, alleen op main/master of een tag)
|
|
||||||
- `.env.example`, `.dockerignore` en `.gitignore`
|
- `.env.example`, `.dockerignore` en `.gitignore`
|
||||||
- `STATIC_DIR` als omgevingsvariabele (map met de frontend-build)
|
- `STATIC_DIR` als omgevingsvariabele (map met de frontend-build)
|
||||||
- Dependency-check als eerste stap van de testsuite: `docker/check-updates.mjs`
|
- Dependency-check als eerste stap van de testsuite: `docker/check-updates.mjs`
|
||||||
vergelijkt beide `package.json`'s met het npm-register, met bewuste
|
vergelijkt beide `package.json`'s met het npm-register, met bewuste
|
||||||
uitzonderingen in `docker/update-exceptions.json` (`-Strict` om te falen,
|
uitzonderingen in `docker/update-exceptions.json` (`-Strict` om te falen,
|
||||||
`-SkipDeps` om over te slaan). Draait ook informatief in de pipeline
|
`-SkipDeps` om over te slaan)
|
||||||
- ESLint flat configs (`frontend/eslint.config.js`, `backend/eslint.config.js`) —
|
- ESLint flat configs (`frontend/eslint.config.js`, `backend/eslint.config.js`) —
|
||||||
`npm run lint` werkte voorheen niet, er was geen configuratie
|
`npm run lint` werkte voorheen niet, er was geen configuratie
|
||||||
- Lockfiles voor beide packages (`backend/package-lock.json` was er niet)
|
- Lockfiles voor beide packages (`backend/package-lock.json` was er niet)
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ vibefinance/
|
|||||||
├── .dockerignore
|
├── .dockerignore
|
||||||
├── docker-compose.yml # Productie: app + postgres
|
├── docker-compose.yml # Productie: app + postgres
|
||||||
├── docker-compose.dev.yml # Dev: app (API + Vite) + postgres
|
├── docker-compose.dev.yml # Dev: app (API + Vite) + postgres
|
||||||
├── azure-pipelines.yml # CI/CD: test → build+smoketest → publish
|
|
||||||
├── .env.example # Kopieer naar .env en vul in
|
├── .env.example # Kopieer naar .env en vul in
|
||||||
├── package.json # Versienummer — single source of truth
|
├── package.json # Versienummer — single source of truth
|
||||||
├── dev.ps1 / dev.sh # Dev script (bouwen, starten, logs, pushen)
|
├── dev.ps1 / dev.sh # Dev script (bouwen, starten, logs, pushen)
|
||||||
@@ -269,12 +268,11 @@ Het schema wordt bij het starten van de app aangemaakt/bijgewerkt via
|
|||||||
|
|
||||||
| Laag | Wat | Commando |
|
| Laag | Wat | Commando |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| Dependencies | Staan `package.json`'s op de laatste versies | `.\test.ps1 -Unit` |
|
||||||
| Backend | API-routes, SPA-fallback, cache- en security-headers | `.\test.ps1 -Unit` |
|
| Backend | API-routes, SPA-fallback, cache- en security-headers | `.\test.ps1 -Unit` |
|
||||||
| Build | Vite-build + productie-image | `.\test.ps1 -NoSmoke` |
|
| Build | Vite-build + productie-image | `.\test.ps1 -NoSmoke` |
|
||||||
| Integratie | Smoketest op de echte app + postgres stack | `.\test.ps1` |
|
| Integratie | Smoketest op de echte app + postgres stack | `.\test.ps1` |
|
||||||
|
|
||||||
In CI draaien dezelfde stappen via `azure-pipelines.yml`.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🛠️ Beheer
|
## 🛠️ Beheer
|
||||||
|
|||||||
@@ -1,203 +0,0 @@
|
|||||||
# ╔══════════════════════════════════════════════════════════════════════════╗
|
|
||||||
# ║ VibeFinance CI/CD — 2-container opzet ║
|
|
||||||
# ║ ║
|
|
||||||
# ║ Eén app-image (Express API + gebouwde Vite-frontend) + postgres. ║
|
|
||||||
# ║ ║
|
|
||||||
# ║ Stages: ║
|
|
||||||
# ║ Test backend-tests (Dockerfile target 'test') ║
|
|
||||||
# ║ Build productie-image bouwen + smoketest op de echte stack ║
|
|
||||||
# ║ Publish multi-arch image (amd64 + arm64) naar de registry pushen ║
|
|
||||||
# ║ ║
|
|
||||||
# ║ Vereist in Azure DevOps: ║
|
|
||||||
# ║ - Service connection (type: Docker Registry) naar de registry; vul ║
|
|
||||||
# ║ de naam in bij variabele dockerRegistryServiceConnection ║
|
|
||||||
# ║ - Agent met Docker en buildx (ubuntu-latest heeft dit) ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- main
|
|
||||||
- master
|
|
||||||
- feature/*
|
|
||||||
tags:
|
|
||||||
include:
|
|
||||||
- "*"
|
|
||||||
|
|
||||||
pr:
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- main
|
|
||||||
- master
|
|
||||||
|
|
||||||
variables:
|
|
||||||
# ── Aanpassen per omgeving ──────────────────────────────────────────────
|
|
||||||
dockerRegistryServiceConnection: "vibefinance-registry"
|
|
||||||
registryHost: "vibehoogie.duckdns.org/vibe"
|
|
||||||
imageName: "vibefinance-app"
|
|
||||||
# ── Afgeleid ────────────────────────────────────────────────────────────
|
|
||||||
imageRepo: "$(registryHost)/$(imageName)"
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: ubuntu-latest
|
|
||||||
|
|
||||||
stages:
|
|
||||||
|
|
||||||
# ── Stage 1: tests ──────────────────────────────────────────────────────
|
|
||||||
- stage: Test
|
|
||||||
displayName: Tests
|
|
||||||
jobs:
|
|
||||||
- job: BackendTests
|
|
||||||
displayName: Backend-tests (node --test)
|
|
||||||
steps:
|
|
||||||
- checkout: self
|
|
||||||
fetchDepth: 1
|
|
||||||
|
|
||||||
# Informatief: meldt dependencies die niet op de laatste versie staan.
|
|
||||||
# Bewuste uitzonderingen staan in docker/update-exceptions.json.
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
node docker/check-updates.mjs
|
|
||||||
displayName: Dependency-check (informatief)
|
|
||||||
continueOnError: true
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
docker build --target test -t vibefinance/app:test .
|
|
||||||
docker run --rm vibefinance/app:test
|
|
||||||
displayName: npm test (in Docker, zonder database)
|
|
||||||
|
|
||||||
# ── Stage 2: image bouwen en smoketesten ────────────────────────────────
|
|
||||||
- stage: Build
|
|
||||||
displayName: Build en smoketest
|
|
||||||
dependsOn: Test
|
|
||||||
jobs:
|
|
||||||
- job: BuildImage
|
|
||||||
displayName: Productie-image + smoketest
|
|
||||||
steps:
|
|
||||||
- checkout: self
|
|
||||||
fetchDepth: 1
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
APP_VERSION=$(node -p "require('./package.json').version")
|
|
||||||
echo "##vso[task.setvariable variable=appVersion]$APP_VERSION"
|
|
||||||
echo "Versie: $APP_VERSION"
|
|
||||||
displayName: Versienummer uit package.json
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
docker build --target production \
|
|
||||||
--build-arg APP_VERSION=$(appVersion) \
|
|
||||||
--build-arg VITE_APP_VERSION=$(appVersion) \
|
|
||||||
--build-arg VITE_API_URL=/api \
|
|
||||||
-t vibefinance/app:ci .
|
|
||||||
displayName: Productie-image bouwen (incl. Vite-build)
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
docker network create vibefinance-ci
|
|
||||||
|
|
||||||
docker run -d --name ci-postgres --network vibefinance-ci \
|
|
||||||
-e POSTGRES_DB=vibefinance \
|
|
||||||
-e POSTGRES_USER=vibefinance \
|
|
||||||
-e POSTGRES_PASSWORD=cipassword \
|
|
||||||
postgres:18-alpine
|
|
||||||
|
|
||||||
for i in $(seq 1 30); do
|
|
||||||
if docker exec ci-postgres pg_isready -U vibefinance >/dev/null 2>&1; then break; fi
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
docker run -d --name ci-app --network vibefinance-ci \
|
|
||||||
-e NODE_ENV=production \
|
|
||||||
-e JWT_SECRET=ci-secret \
|
|
||||||
-e UPDATE_CHECK_URL= \
|
|
||||||
-e DATABASE_URL=postgresql://vibefinance:cipassword@ci-postgres:5432/vibefinance \
|
|
||||||
-p 3001:3001 \
|
|
||||||
vibefinance/app:ci
|
|
||||||
|
|
||||||
gezond=0
|
|
||||||
for i in $(seq 1 30); do
|
|
||||||
if curl -fsS http://localhost:3001/api/health | grep -q ok; then gezond=1; break; fi
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
if [ "$gezond" -ne 1 ]; then
|
|
||||||
echo "App werd niet gezond. Logs:"
|
|
||||||
docker logs ci-app
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "/api/health : ok"
|
|
||||||
|
|
||||||
curl -fsS http://localhost:3001/ | grep -q root
|
|
||||||
echo "/ : index.html"
|
|
||||||
|
|
||||||
curl -fsS http://localhost:3001/voortgang | grep -q root
|
|
||||||
echo "/voortgang : index.html (SPA-fallback)"
|
|
||||||
|
|
||||||
code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3001/api/bestaat-niet)
|
|
||||||
test "$code" = "404"
|
|
||||||
echo "/api/... : 404 JSON"
|
|
||||||
displayName: Smoketest op app + postgres
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
docker logs ci-app || true
|
|
||||||
docker rm -f ci-app ci-postgres || true
|
|
||||||
docker network rm vibefinance-ci || true
|
|
||||||
displayName: Opruimen
|
|
||||||
condition: always()
|
|
||||||
|
|
||||||
# ── Stage 3: publiceren ─────────────────────────────────────────────────
|
|
||||||
# Alleen vanaf main/master of een tag; feature-branches en PRs stoppen na Build.
|
|
||||||
- stage: Publish
|
|
||||||
displayName: Publiceren naar registry
|
|
||||||
dependsOn: Build
|
|
||||||
condition: |
|
|
||||||
and(succeeded(),
|
|
||||||
or(eq(variables['Build.SourceBranch'], 'refs/heads/main'),
|
|
||||||
eq(variables['Build.SourceBranch'], 'refs/heads/master'),
|
|
||||||
startsWith(variables['Build.SourceBranch'], 'refs/tags/')))
|
|
||||||
jobs:
|
|
||||||
- job: PushImage
|
|
||||||
displayName: Multi-arch image pushen
|
|
||||||
steps:
|
|
||||||
- checkout: self
|
|
||||||
fetchDepth: 1
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
APP_VERSION=$(node -p "require('./package.json').version")
|
|
||||||
echo "##vso[task.setvariable variable=appVersion]$APP_VERSION"
|
|
||||||
displayName: Versienummer bepalen
|
|
||||||
|
|
||||||
- task: Docker@2
|
|
||||||
displayName: Inloggen op de registry
|
|
||||||
inputs:
|
|
||||||
command: login
|
|
||||||
containerRegistry: $(dockerRegistryServiceConnection)
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
docker run --privileged --rm tonistiigi/binfmt --install arm64
|
|
||||||
docker buildx create --name vibefinance --use
|
|
||||||
docker buildx inspect --bootstrap
|
|
||||||
displayName: buildx voor arm64 (Raspberry Pi) klaarzetten
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -euo pipefail
|
|
||||||
docker buildx build \
|
|
||||||
--platform linux/amd64,linux/arm64 \
|
|
||||||
--target production \
|
|
||||||
--build-arg APP_VERSION=$(appVersion) \
|
|
||||||
--build-arg VITE_APP_VERSION=$(appVersion) \
|
|
||||||
--build-arg VITE_API_URL=/api \
|
|
||||||
-t $(imageRepo):$(appVersion) \
|
|
||||||
-t $(imageRepo):latest \
|
|
||||||
--push .
|
|
||||||
displayName: Bouwen en pushen (amd64 + arm64)
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
echo "Gepubliceerd:"
|
|
||||||
echo " $(imageRepo):$(appVersion)"
|
|
||||||
echo " $(imageRepo):latest"
|
|
||||||
displayName: Samenvatting
|
|
||||||
Reference in New Issue
Block a user