Skip to content

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