Les enseignants ont besoin de moyennes à jour immédiatement après la publication ou modification des notes, sans attendre un batch nocturne. Le système recalcule via Domain Events synchrones : statistiques d'évaluation (min/max/moyenne/médiane), moyennes matières pondérées (normalisation /20), et moyenne générale par élève. Les résultats sont stockés dans des tables dénormalisées avec cache Redis (TTL 5 min). Trois endpoints API exposent les données avec contrôle d'accès par rôle. Une commande console permet le backfill des données historiques au déploiement.
130 lines
5.0 KiB
Groovy
130 lines
5.0 KiB
Groovy
// Jenkinsfile CI/CD Pipeline for Test Execution
|
|
// Generated by BMad TEA Agent - Test Architect Module
|
|
// Optimized for: Parallel Sharding, Burn-In Loop
|
|
// Stack: {test_stack_type} | Framework: {test_framework}
|
|
//
|
|
// Variables to customize per project:
|
|
// INSTALL_CMD - dependency install command (e.g., npm ci, pnpm install --frozen-lockfile)
|
|
// TEST_CMD - main test command (e.g., npm run test:e2e, npm test, npx vitest)
|
|
// LINT_CMD - lint command (e.g., npm run lint)
|
|
// BROWSER_INSTALL - browser install command (frontend/fullstack only; omit for backend)
|
|
//
|
|
// Node.js version management — choose one:
|
|
// Option A (recommended): Configure NodeJS Plugin in Jenkins Global Tool Configuration,
|
|
// then add to pipeline: tools { nodejs 'NodeJS-24' }
|
|
// Option B: Use nvm (pre-installed on agent) — this template uses nvm as the default
|
|
// Option C: Use a Docker agent — agent { docker { image 'node:24' } }
|
|
|
|
pipeline {
|
|
agent any
|
|
|
|
environment {
|
|
CI = 'true'
|
|
}
|
|
|
|
options {
|
|
timeout(time: 45, unit: 'MINUTES')
|
|
disableConcurrentBuilds()
|
|
}
|
|
|
|
stages {
|
|
stage('Checkout') {
|
|
steps {
|
|
checkout scm
|
|
}
|
|
}
|
|
|
|
stage('Install') {
|
|
steps {
|
|
// Detect and apply Node.js version from .nvmrc (falls back to v24)
|
|
// If using NodeJS Plugin instead, remove this block and add: tools { nodejs 'NodeJS-24' }
|
|
sh '''
|
|
export NVM_DIR="$HOME/.nvm"
|
|
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
|
NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "24")
|
|
nvm install "$NODE_VERSION" 2>/dev/null || true
|
|
nvm use "$NODE_VERSION" 2>/dev/null || true
|
|
node --version
|
|
npm ci
|
|
''' // Replace npm ci with INSTALL_CMD
|
|
// Stash installed dependencies so parallel shards can restore them
|
|
stash includes: 'node_modules/**', name: 'deps'
|
|
}
|
|
}
|
|
|
|
stage('Lint') {
|
|
steps {
|
|
sh 'npm run lint' // Replace with LINT_CMD
|
|
}
|
|
}
|
|
|
|
// Test stage - Parallel execution with sharding
|
|
// Each shard restores dependencies via unstash for workspace safety
|
|
stage('Test') {
|
|
parallel {
|
|
stage('Shard 1') {
|
|
steps {
|
|
unstash 'deps'
|
|
// Frontend/Fullstack only — remove browser install for backend-only stacks
|
|
sh 'npx playwright install --with-deps chromium' // Replace with BROWSER_INSTALL
|
|
sh 'npm run test:e2e -- --shard=1/4' // Replace with TEST_CMD + shard args
|
|
}
|
|
}
|
|
stage('Shard 2') {
|
|
steps {
|
|
unstash 'deps'
|
|
sh 'npx playwright install --with-deps chromium' // Replace with BROWSER_INSTALL
|
|
sh 'npm run test:e2e -- --shard=2/4' // Replace with TEST_CMD + shard args
|
|
}
|
|
}
|
|
stage('Shard 3') {
|
|
steps {
|
|
unstash 'deps'
|
|
sh 'npx playwright install --with-deps chromium' // Replace with BROWSER_INSTALL
|
|
sh 'npm run test:e2e -- --shard=3/4' // Replace with TEST_CMD + shard args
|
|
}
|
|
}
|
|
stage('Shard 4') {
|
|
steps {
|
|
unstash 'deps'
|
|
sh 'npx playwright install --with-deps chromium' // Replace with BROWSER_INSTALL
|
|
sh 'npm run test:e2e -- --shard=4/4' // Replace with TEST_CMD + shard args
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Burn-in stage - Flaky test detection
|
|
// Note: Burn-in targets UI flakiness. For backend-only stacks, remove this stage entirely.
|
|
stage('Burn-In') {
|
|
when {
|
|
anyOf {
|
|
changeRequest()
|
|
triggeredBy 'TimerTrigger'
|
|
}
|
|
}
|
|
steps {
|
|
sh '''
|
|
echo "Starting burn-in loop - detecting flaky tests"
|
|
for i in $(seq 1 10); do
|
|
echo "Burn-in iteration $i/10"
|
|
npm run test:e2e || exit 1
|
|
done
|
|
echo "Burn-in complete - no flaky tests detected"
|
|
''' // Replace npm run test:e2e with TEST_CMD
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
always {
|
|
// Archive test results and reports
|
|
archiveArtifacts artifacts: 'test-results/**,playwright-report/**', allowEmptyArchive: true
|
|
junit testResults: 'test-results/**/*.xml', allowEmptyResults: true
|
|
}
|
|
failure {
|
|
echo 'Pipeline failed - check test results and artifacts'
|
|
}
|
|
}
|
|
}
|