Chaque workflow se déclenchait sur push (toutes branches) et sur pull_request : chaque commit de PR jouait tout deux fois. sonarqube.yml reconstruisait et retestait front, back et ML en parallèle des workflows qui le faisaient déjà, et son test backend tournait sans uv sync. ci.yml devient le seul point d'entrée (pull_request, push sur dev et main) : - paths-filter choisit les composants à jouer sur une PR, tout est rejoué sur dev et main ; - backend, frontend, ml, airflow et infra passent en workflow_call ; - le job sonar reprend les couvertures versées par ces jobs au lieu de tout rejouer ; - « CI ok » agrège le résultat, seul check à exiger dans les règles de branche. Au passage : - npm run test:ci au lieu de npm test --watch=false, option que npm gardait pour lui ; - uv sync --locked au lieu de --frozen, pour qu'un verrou périmé casse la CI ; - setup-uv et sonarqube-scan-action épinglés sur un SHA (règle S7637), timeout sur chaque job ; - frontend : un seul npm ci pour la construction et les tests ; - infra : validation des fichiers Compose et actionlint sur les workflows ; - exclusions Sonar en globs, doublon apps/frontend/sonar-project.properties supprimé.
71 lines
1.9 KiB
YAML
71 lines
1.9 KiB
YAML
name: Frontend
|
|
|
|
# Pourquoi : aucun déclencheur propre. ci.yml appelle ce workflow quand le frontend change, et
|
|
# Sonar y reprend la couverture versée par le job `verification` (ADR 0014).
|
|
|
|
on:
|
|
workflow_call:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
# Un seul `npm ci` pour la construction et les tests : un job de plus ne ferait que le rejouer.
|
|
verification:
|
|
name: Construction et tests
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
defaults:
|
|
run:
|
|
working-directory: apps/frontend
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Installe Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: 26
|
|
cache: npm
|
|
cache-dependency-path: apps/frontend/package-lock.json
|
|
|
|
- name: Installe les dépendances
|
|
run: npm ci
|
|
|
|
- name: Construit l'application
|
|
run: npm run build
|
|
|
|
# Piège : `npm test --watch=false` garde l'option pour npm, `ng test` ne la reçoit jamais.
|
|
# La couverture lcov vient d'angular.json (`coverage: true`).
|
|
- name: Tests et couverture
|
|
run: npm run test:ci
|
|
|
|
- name: Verse la couverture pour Sonar
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: frontend-coverage
|
|
path: apps/frontend/coverage/frontend/lcov.info
|
|
if-no-files-found: error
|
|
|
|
security-audit:
|
|
name: Audit des dépendances
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
defaults:
|
|
run:
|
|
working-directory: apps/frontend
|
|
|
|
steps:
|
|
- name: Récupère le dépôt
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Installe Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: 26
|
|
|
|
# Seuil high : une vulnérabilité moderate de devDependency ne doit pas bloquer une livraison.
|
|
- name: Audite le verrou
|
|
run: npm audit --audit-level=high --package-lock-only
|