ADR 005 â GitLab CI Build Pipeline â Lessons Apprises
Contexte
Sprint 3 â Ajout du stage build pour pusher les images Docker vers ECR AWS.
Décisions et problÚmes rencontrés
1. Docker-in-Docker abandonnĂ© â Kaniko â
ProblĂšme : Docker-in-Docker (docker:24-dind) + AWS CLI sur Alpine = incompatible. AWS CLI v2 nĂ©cessite glibc mais Alpine utilise musl libc. MĂȘme avec gcompat, Python 3.14 bundlĂ© dans AWS CLI v2 ne fonctionne pas.
Erreurs rencontrées :
Failed to load Python shared library libpython3.14.so.1.0:
dladdr1: symbol not found
Solution : Kaniko
image:
name: gcr.io/kaniko-project/executor:v1.23.2-debug
entrypoint: [""]
- Pas de Docker daemon nécessaire
- Pas d'AWS CLI nécessaire
- Authentification ECR native via variables AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY
- Pas de mode privilégié requis
2. Variables GitLab Protected â 401 ECR
ProblĂšme : Variables AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY marquĂ©es "Protected". Les branches feature/* ne sont pas protĂ©gĂ©es â variables non injectĂ©es â 401 Unauthorized.
Solution : Décocher "Protected", garder "Masked" uniquement.
Protected : â (bloque les pipelines feature/*)
Masked : â
(cache la valeur dans les logs)
RÚgle : Protected = uniquement pour les secrets de production (prod branch). Masked = suffisant pour la sécurité des logs CI.
3. Kaniko cache â vieilles couches servies
ProblĂšme : Avec --cache=true, Kaniko servait d'anciennes couches pip mĂȘme aprĂšs mise Ă jour de requirements.txt. Trivy dĂ©tectait les anciennes versions des packages.
Solution : Utiliser --cache=false pour forcer le rebuild complet.
--cache=false
Note : --no-cache n'existe pas dans Kaniko (flag Docker uniquement).
4. Trivy image scan â CVEs packages systĂšme Debian
ProblĂšme : python:3.10-slim (Debian 13.4) contient wheel et jaraco.context installĂ©s via apt dans /usr/lib/python3/dist-packages/. Trivy dĂ©tecte ces versions systĂšme mĂȘme quand pip installe des versions plus rĂ©centes dans /usr/local/lib/.
CVEs dĂ©tectĂ©s : - 14 CVEs OS Debian â Status "affected" (pas de fix disponible) - CVE-2026-23949 : jaraco.context â path traversal - CVE-2026-24049 : wheel â privilege escalation
Justification exclusion .trivyignore : Ces packages sont des outils de build pip, jamais utilisés à runtime par FastAPI. Les CVEs concernent le traitement de wheel files et tar archives malveillants que notre serveur web ne traite jamais.
Solution long terme : Multi-stage build + migration Python 3.12 (Sprint 4)
FROM python:3.12-slim AS builder
# installer toutes les dépendances
FROM python:3.12-slim AS runtime
# copier uniquement les packages nécessaires
# zĂ©ro outils de build â zĂ©ro CVE wheel/jaraco
5. Pattern Candidate / Scan / Promote â
Architecture finale adoptée :
build(candidate) â scan-image â promote(SHA+latest)
- build-candidate : image poussée avec tag SHA-candidate
- trivy-image-scan : scan depuis ECR avant promotion
- promote-image : si scan OK â tag SHA dĂ©finitif + latest
RÚgle DevSecOps : Jamais pousser une image non scannée vers le tag latest/prod.
Pipeline finale
Stages :
test â security â build â scan-image â promote
Sur feature/* + MR :
test â
security â
build â
scan-image â
promote âïž (skippĂ©)
Sur develop/main :
test â
security â
build â
scan-image â
promote â
Variables GitLab CI requises
| Variable | Protected | Masked | Description |
|---|---|---|---|
| SECRET_KEY | â | â | JWT secret |
| AWS_ACCESS_KEY_ID | â | â | IAM GitLab CI |
| AWS_SECRET_ACCESS_KEY | â | â | IAM GitLab CI |
| AWS_DEFAULT_REGION | â | â | eu-west-3 |
| ECR_REGISTRY | â | â | 199167114788.dkr.ecr.eu-west-3.amazonaws.com |
| ECR_REPOSITORY | â | â | fastapi-eks/fastapi |
Références
- Ticket : #23 ci: add build stage
- Date : 2026-05-11
- Kaniko version : v1.23.2-debug
- Trivy version : 0.70.0