Les 4 étapes incontournables
stages:
- lint
- test
- build
- deploy
image: node:20-alpine
cache:
paths:
- node_modules/
lint:
stage: lint
script:
- npm ci
- npm run lint
test:
stage: test
script:
- npm ci
- npm run test:ci
coverage: '/Lines\s*:\s*([0-9.]+)%/'
build:
stage: build
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 week
deploy:
stage: deploy
only:
- main
script:
- npm run deploy
Les optimisations qui changent tout
Cache intelligent
Au lieu de réinstaller node_modules à chaque job, partage le cache :
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .npm/
Parallélisation
Tests unitaires et e2e en parallèle :
test:unit:
stage: test
script: npm run test:unit
test:e2e:
stage: test
script: npm run test:e2e
Variables sensibles
Jamais en clair. GitLab Settings → CI/CD → Variables (masked + protected).
Le piège que tout le monde fait
npm install au lieu de npm ci. Le premier modifie package-lock.json, le second échoue si le lock n'est pas synchro. En CI, toujours npm ci.
Bilan
Une pipeline propre, c'est 20 lignes de YAML. Tout le reste, c'est de l'optimisation. Commence simple, itère.