Aller au contenu

📄 SPÉCIFICATION CANONIQUE CONTRACTUELLE


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 **SpĂ©cification** | *(ce document)* | | đŸ› ïž Plan d'implĂ©mentation | [PD-12-plan.md](PD-12-plan.md) | | ✅ CritĂšres d'acceptation | [PD-12-acceptability.md](PD-12-acceptability.md) | | 📝 Retour d'expĂ©rience | [PD-12-rex.md](PD-12-rex.md) | [← Retour Ă  infrastructure-souveraine](../PD-193-epic.md) · [↑ Index User Story](index.md)

PD-12 — Configuration GitLab Runner pour CI/CD

📌 Artefact produit
âžĄïž specifications/PD-12-spec.md


1. Objectif

DĂ©finir de maniĂšre formelle, complĂšte et testable les exigences nĂ©cessaires Ă  la mise en place d’un ou plusieurs GitLab Runner destinĂ©s Ă  l’exĂ©cution des pipelines CI/CD du projet ProbatioVault, hĂ©bergĂ©s sur une infrastructure OVH, avec des executors Docker, un mĂ©canisme de cache, et une gestion sĂ©curisĂ©e des secrets.

Cette spĂ©cification constitue une rĂ©fĂ©rence contractuelle : toute implĂ©mentation devra s’y conformer strictement.


2. PérimÚtre / Hors périmÚtre

2.1 PérimÚtre

La présente spécification couvre exclusivement :

  • l’enregistrement et la configuration de GitLab Runner ;
  • l’exĂ©cution des jobs CI/CD via des executors Docker ;
  • la gestion du cache de pipeline ;
  • l’accĂšs aux secrets nĂ©cessaires aux pipelines ;
  • l’intĂ©gration du Runner avec l’infrastructure OVH ;
  • les exigences de sĂ©curitĂ©, d’isolation et de traçabilitĂ© associĂ©es.

2.2 Hors périmÚtre

Les éléments suivants sont explicitement hors périmÚtre :

  • la dĂ©finition des pipelines CI/CD eux-mĂȘmes (.gitlab-ci.yml) ;
  • la logique mĂ©tier des jobs exĂ©cutĂ©s ;
  • la configuration interne des images Docker utilisĂ©es par les jobs ;
  • la gestion des permissions GitLab (groupes, projets, rĂŽles) ;
  • l’optimisation des performances CI/CD ;
  • la supervision applicative du Runner (monitoring dĂ©taillĂ©).

Tout besoin relevant de ces sujets devra faire l’objet d’une spĂ©cification distincte.


3. Définitions

Terme Définition
GitLab Runner Agent chargĂ© d’exĂ©cuter des jobs CI/CD pour GitLab.
Executor Docker Mode d’exĂ©cution des jobs CI/CD utilisant des conteneurs Docker Ă©phĂ©mĂšres.
Pipeline CI/CD Suite de jobs automatisés déclenchés par GitLab.
Secret Information sensible requise par un job CI/CD (clé, token, mot de passe).
Cache CI Mécanisme permettant de réutiliser des artefacts intermédiaires entre jobs ou pipelines.
Infrastructure OVH Ressources d’hĂ©bergement fournies par OVH Cloud, utilisĂ©es pour exĂ©cuter le Runner.

4. Invariants (non négociables)

Les rĂšgles suivantes sont non nĂ©gociables et doivent ĂȘtre respectĂ©es en toutes circonstances :

  1. Le Runner ne doit jamais exposer de secrets en clair dans les logs.
  2. Les jobs CI/CD doivent ĂȘtre exĂ©cutĂ©s dans un environnement isolĂ© les uns des autres.
  3. Aucun job ne doit pouvoir accĂ©der aux donnĂ©es persistantes d’un autre job sans mĂ©canisme explicitement prĂ©vu.
  4. Toute exĂ©cution de job doit ĂȘtre traçable (identifiable par pipeline, job, commit).
  5. Les secrets utilisĂ©s par les pipelines doivent ĂȘtre rĂ©vocables sans redĂ©ploiement du Runner.
  6. Le Runner ne doit exécuter que des jobs explicitement autorisés par GitLab.
  7. Toute rĂšgle ci-dessus doit ĂȘtre vĂ©rifiable par test ou audit.

5. Flux nominaux

5.1 Enregistrement du Runner

  1. Un Runner est enregistrĂ© auprĂšs d’une instance GitLab.
  2. Le Runner est associé à un périmÚtre défini (instance, groupe ou projet).
  3. Le Runner devient disponible pour l’exĂ©cution de pipelines autorisĂ©s.

5.2 ExĂ©cution d’un pipeline

  1. Un événement GitLab déclenche un pipeline CI/CD.
  2. GitLab assigne un job au Runner compatible.
  3. Le Runner instancie un environnement Docker dédié au job.
  4. Le job s’exĂ©cute dans cet environnement isolĂ©.
  5. Les résultats du job sont remontés à GitLab.
  6. L’environnement d’exĂ©cution est dĂ©truit Ă  la fin du job.

5.3 Utilisation du cache

  1. Un job dĂ©clare l’utilisation d’un cache.
  2. Le Runner tente de restaurer le cache associé.
  3. Le job s’exĂ©cute.
  4. Le cache est mis à jour selon les rÚgles définies.

5.4 AccĂšs aux secrets

  1. Un job nécessite un ou plusieurs secrets.
  2. Les secrets sont injectĂ©s dans l’environnement d’exĂ©cution du job.
  3. Les secrets sont utilisables uniquement pendant l’exĂ©cution du job.
  4. Les secrets ne persistent pas aprĂšs la fin du job.

5bis. Diagrammes

5bis.1 Diagramme d’états — Cycle de vie du Runner

Le Runner traverse plusieurs Ă©tats depuis son enregistrement jusqu’à son Ă©ventuelle dĂ©sinscription. Les invariants INV-6 (jobs explicitement autorisĂ©s) et INV-7 (vĂ©rifiabilitĂ©) s’appliquent Ă  chaque transition.

stateDiagram-v2
    [*] --> Unregistered
    Unregistered --> Registered : Enregistrement auprÚs de GitLab (§5.1.1-2)
    Registered --> Available : Association périmÚtre validée (§5.1.3)
    Available --> Executing : Job assigné par GitLab (§5.2.2)
    Executing --> Available : Job terminé, environnement détruit (§5.2.6) [INV-2, INV-3]
    Executing --> Error : Échec exĂ©cution Docker / secret manquant
    Error --> Available : Erreur remontée à GitLab (§6) [INV-4]
    Available --> Unavailable : Runner indisponible (réseau, ressources)
    Unavailable --> Available : Reprise de service
    Available --> Unregistered : Désinscription
    Unavailable --> Unregistered : Désinscription forcée

    note right of Executing
        INV-1 : Secrets jamais en clair dans les logs
        INV-2 : Isolation inter-jobs
        INV-3 : Pas de données persistantes partagées
    end note

5bis.2 Diagramme de sĂ©quence — ExĂ©cution d’un pipeline avec secrets

Ce diagramme dĂ©taille l’interaction entre GitLab, le Runner, Docker et le gestionnaire de secrets lors de l’exĂ©cution d’un job (§5.2 + §5.4). Les invariants rĂ©fĂ©rencĂ©s garantissent l’isolation (INV-2, INV-3), la non-persistance des secrets (INV-1, INV-5) et la traçabilitĂ© (INV-4).

sequenceDiagram
    participant GL as GitLab
    participant RN as GitLab Runner
    participant DK as Docker (executor)
    participant SC as Secret Store (Vault)
    participant CA as Cache Storage

    GL->>RN: Assigner job (pipeline, commit, job_id) [INV-4]
    activate RN

    RN->>DK: Créer conteneur éphémÚre isolé [INV-2, INV-3]
    activate DK

    RN->>SC: Récupérer secrets pour le job [INV-5]
    SC-->>RN: Secrets (durée de vie = job)

    RN->>DK: Injecter secrets dans l’environnement [INV-1]

    RN->>CA: Restaurer cache (si déclaré, §5.3.2)
    CA-->>DK: Données de cache

    DK->>DK: Exécuter le job

    DK-->>RN: Résultat du job (succÚs / échec)

    RN->>CA: Mettre à jour cache (§5.3.4)

    RN->>DK: Détruire conteneur + purger secrets [INV-2, INV-3]
    deactivate DK
    Note over DK: Aucun secret ne persiste [INV-1, INV-5]

    RN-->>GL: Remonter statut + logs (secrets masqués) [INV-1, INV-4]
    deactivate RN

5bis.3 Diagramme de sĂ©quence — RĂ©vocation de secret

Ce diagramme illustre le comportement attendu lors de la rĂ©vocation d’un secret (§5.4, scĂ©nario 3). L’invariant INV-5 (rĂ©vocabilitĂ© sans redĂ©ploiement) est central.

sequenceDiagram
    participant OP as Opérateur
    participant SC as Secret Store (Vault)
    participant GL as GitLab
    participant RN as GitLab Runner
    participant DK as Docker (executor)

    OP->>SC: Révoquer secret [INV-5]
    SC-->>OP: Confirmation révocation

    Note over SC: Secret invalidé immédiatement

    GL->>RN: Nouveau pipeline déclenché
    activate RN
    RN->>DK: Créer conteneur éphémÚre
    activate DK
    RN->>SC: Récupérer secrets pour le job
    SC-->>RN: Erreur : secret révoqué

    RN->>DK: Détruire conteneur [INV-2]
    deactivate DK
    RN-->>GL: Job Ă©chouĂ© — secret invalide [INV-4, INV-6]
    deactivate RN

    Note over GL: Statut d’échec explicite et traçable [INV-7]

6. Cas d’erreur

  • Échec d’enregistrement du Runner auprĂšs de GitLab.
  • Job assignĂ© Ă  un Runner indisponible.
  • Échec de crĂ©ation de l’environnement Docker.
  • Cache indisponible ou corrompu.
  • Secret manquant ou invalide.
  • Tentative d’accĂšs non autorisĂ©e Ă  un secret.
  • Échec de communication entre GitLab et le Runner.

Chaque cas d’erreur doit produire un retour explicite et traçable dans GitLab.


7. Critùres d’acceptation (testables)

  • Un pipeline simple peut ĂȘtre exĂ©cutĂ© de bout en bout via le Runner.
  • Deux jobs exĂ©cutĂ©s en parallĂšle ne partagent aucun Ă©tat persistant.
  • Un secret rĂ©voquĂ© devient immĂ©diatement inutilisable dans les pipelines.
  • Aucun secret n’apparaĂźt en clair dans les logs GitLab.
  • Le cache est correctement restaurĂ© et mis Ă  jour selon les rĂšgles dĂ©finies.
  • Un job Ă©chouant produit un statut d’échec explicite dans GitLab.

8. Scénarios de test (Given / When / Then)

ScĂ©nario 1 — ExĂ©cution nominale

Given un Runner enregistré et actif
When un pipeline CI/CD est déclenché
Then le job est exécuté avec succÚs et son statut est visible dans GitLab


ScĂ©nario 2 — Isolation des jobs

Given deux jobs exécutés en parallÚle
When chacun écrit dans son environnement
Then aucun job ne peut lire ou modifier les donnĂ©es de l’autre


ScĂ©nario 3 — RĂ©vocation de secret

Given un secret valide utilisé par un pipeline
When le secret est révoqué
Then tout nouveau pipeline Ă©choue explicitement lors de l’accĂšs au secret


ScĂ©nario 4 — Erreur d’exĂ©cution Docker

Given un environnement Docker non disponible
When un job est assigné au Runner
Then le job échoue avec une erreur explicite et traçable


9. HypothĂšses explicites

  • Une instance GitLab fonctionnelle est disponible.
  • Les ressources OVH sont accessibles et opĂ©rationnelles.
  • Les pipelines CI/CD sont correctement dĂ©finis en amont.
  • Les utilisateurs GitLab disposent des droits nĂ©cessaires pour dĂ©clencher des pipelines.

10. Points Ă  clarifier

Les éléments suivants nécessitent une clarification explicite avant implémentation :

  1. PérimÚtre exact du Runner (instance, groupe ou projet).
  2. Politique de durée de vie du cache CI.
  3. Volume maximal de cache autorisé.
  4. Politique de rotation des secrets.
  5. Niveau de journalisation attendu pour le Runner.
  6. Exigences spécifiques de conformité (ex. audit interne, normes).

Fin de la spécification canonique.