---
# System prepended metadata

title: Étapes d'execution de la CI/CD Fabrique

---

# Étapes d'execution de la CI/CD Fabrique

```mermaid
stateDiagram
    NotifMattermost: Notifications Mattermost (repo, branche, statut)
    NotifGithub: Notifications Github (statut, ingress, doc, grafana)
    Deploy: Déploiement de l'app
    DeployKonti: Application des manifests de déploiement
    BuildJobsCreate: Création des jobs de build
    BuildJobsCreateKonti: Application des manifests de build
    NamespaceCreate: Création du namespace
    NamespaceCreateKonti: Application des manifests namespace
    HarborPush: Stockage des images dans Harbor
    BuildApp: Build des images docker
    SocketSecurity: Socket Security
    Hadolint: Lint du Dockerfile (Hadolint)
    TestApp: Tests de l'app et générat (Jest/ RTL/Cypress)
    LintApp: Lint du code (EsLint/Prettier)
    GithubActions: Github Actions
    GenerationManifests: Génération des manifests (build & déploy)
    Github: Github CI
    Kubernetes: Kubernetes CD
    Local: Développement local

    state Local {
        Commit --> Talisman
        Talisman --> Push
        Push --> GithubActions
    }

    state Github {
        GithubActions --> Kontinuous
        GithubActions --> Tests
        GithubActions --> Scan

        state Tests {
            direction LR
            [*] --> LintApp
            [*] --> TestApp
            [*] --> Hadolint
        }
        state Kontinuous {
            GenerationManifests --> NamespaceCreateKonti
            NamespaceCreateKonti --> BuildJobsCreateKonti
            BuildJobsCreateKonti --> DeployKonti
            NamespaceCreateKonti --> NamespaceCreate
            NamespaceCreate --> NamespaceCreateKonti
            BuildJobsCreateKonti --> BuildJobsCreate: exec
            BuildJobsCreate --> BuildJobsCreateKonti: wait
            DeployKonti --> Deploy
            Deploy --> DeployKonti
            note right of DeployKonti : Allez/retour entre buid et deploy (gestion des dépendances des build)
            DeployKonti --> NotifMattermost
            DeployKonti --> NotifGithub
        }
        state Scan {
            direction LR
            [*] --> SonarCloud
            [*] --> SocketSecurity
            [*] --> Trivy
        }
    }

    state Kubernetes {
        NamespaceCreate
        BuildJobsCreate --> BuildApp
        BuildApp --> HarborPush
        Deploy
    }
```

[Full screen version](https://mermaid.live/view#pako:eNqVVktu2zAQvcpAi9YpHHivRYHULtrmhyD2rs6ClsY2W4kU-EnrBj6Qz-GLdfhRJDmy62pFzbw3Mxw-jvSSZDLHJE20YQYnnK0UK-cC6LmXhi_vmDGoSqlNGgw8Y4ZLoaHxwEBhJYewUExkaxyCi2XNRSvMF27WdnEYIlhhEPBD4GKlUOsh5DIbAlWyZILFMBOsCrlJYbLf0YJjicJAjlC8Z1XVhtxIYXgKV1VVxEQE01AywZeojXakvBUkcD9ZXuTXcqHHCqkRKYzVftewf5DHERcO1ss4J22Lfc9K1BXLsCefBVF7e8H_THVA_8rUQqoHq9cpTI3MfrIVegYvaUWVMTqLAGptjcKnYdXBEh0jbOrWZoqZVdzQ0YR3qA118lwWXJB8brk7MQsTH2LJC4RB7Y2HPKPyfd5Z3TJ_vEBRV_ud2O8UI7Vdk3MEj7Pb0XhTOcFEtkvg2XUmJ20YfNbuffSg0BiOKoKD9q4yr8S0lmJ8jxAUqHx_7-rWErCu423bB_584V2U16aT6TXF-Fsw39gFKoEGKWizhvEkbkZmrPByf8ZCVlUQfOGscxEg_soGILwEk3vGsiy5gcvLjzBjBddUYOOsLd7tJNG43Js3d1oT_NtuzriVVtIOx0fxKhVWWn0K5Q_6FGCaufIbRCgg6KOV3z05V-iZcPvY9Xz_8OSDRYX0O6P4-p21UBvv9rCmZsOHhfUIyQftu9ddZh_CU_umT5fah_DU1pg8M9mB4yTrzI0dre7NIMbfmJ3kHu1HCr8YN11ua_OtZvRhTvdKSEqs-GptQC47UWkwFwX-GdG4kVYB3VrlJ3_uplgeQg9olL4OEDctUNAQzrD5SlycLvvg23wGONysE_J1F-3_b9RUCqbGhbT5MX_7G3Hk4in-vHlT2cHIaY3IVpFHlXlUI50bXlviFa8_kw2gLY9tMkxK6jfjOf0v-SLmiVnTYJ4nKS1zXDJbmHkyFw7KrJHTjciSdMkKjcPEVnnzixWt27-ZvgwJ)

### Texte:
1. Développement
  a. Talisman ==> scan du code pour repérer des tokens/passwords avant le `push`
  b. Git push ==> authetification aupres de Github par clé ssh
2. Build
  a. Sementic PR == Controle de la sémentique de la PR
  b. Déclenchement des actions Github
    1. Déclenchement de Kontinuous:
      a. Generation des manifests Kubernetes de jobs de build des packages de l'app
      a. Envoi des manifests à Kubernetes ==> build des images docker sur le cluster (dev ou prod), dans le namespace de la SE (si build fail, pas de déploiement)
      b. stream des logs de build dans Github
      c. enregistrement des images dans Harbor
    2. Exécution des tests d'intégration:
      a. Jest, RTL, Cypres ==> Exucution des tests mis en place par les développeurs de l'app
      b. Eslint, Prettier ==> Formatage du code et mise à la norme automatique
      d. Hadolint ==> Lint du Dockerfile
      b. Génération du coverage
    3. Scan du code:
      a. SonarCloud ==> analyse de qualité du code (coverage, sécurité, best practices...)
      b. Socket Security ou CodeQL ==> analyse de sécurité du code et de toutes ses dépendences
    4. Trivy ==> Scan des images Docker
3. Deploiement
  a. Kontinuous:
    1. Generation des manifests Kubernetes de déploiements packages des l'app
    2. Envoi des manifests à Kubernetes ==> déploiement des packages de l'app et de toutes leurs ressources

### Notes:
1. Interpretation des needs, application des parties du manifest en fonction des needs.
2. Rollout Status (participation au repo): wait des jobs Kube (avec retour du status: fail/success)
3. Stern: Récupération des logs depuis github vers Kube, avec retour sur Github
4. Pas de statut global sur le déploiement, retour d'erreur package par package
5. Notifications sur Mattermost: statut + environnement URL
6. Notification dans la PR avec: les ingress, les artefacts, un lien vers la doc et un lien vers le monitoring Grafana

### Cahier des charges:
- portabilité
- abstraction des GAFAM
- souveraineté

### Avantages de la solution:


- Interdépences entre les jobs/packages
- Meilleure intégration des jobs (CI) que des solution spécialisées dans la CD (ex: Jobs de restore de BD dans notre Kube)
- Kontinuous remplace le besoin de mobiliser des devops pour élaborer une implémentation complète et explicite pour chaque startup (contrairement à une approche full ArgoCD par exemple)
- Capacité de couvrir une grande variété de cas hétéroclites (système de plugins modulaire)
- Ajout de plugins pour les cas d'infra spécifiques
- Superset de HELM (outil standard des déploiements Kube, pas de limitation artificielles: tout ce qui est possible avec helm est possible avec kontinuous)
- Capacité de suivre l'état d'avancement du déploiement des différent composant et de remonter simplement le succès ou l'échec d'un déploiement (rollout-status développé par les SRE en Golang)
- Knowledge abstraction (permet à des dev ne maitrisant pas kubernetes de déployer simplement)
- First class support for JS developers (ex: POC Vault sidecar, easy plugin generation with [chatGPT](https://chat.openai.com/share/39b4cd5b-6749-4d9a-b2a8-886f3f8904b5) [voir le cas d'usage](https://mattermost.fabrique.social.gouv.fr/default/pl/8ifqay5ndfgd7gje7okdyr64wy))

> **Kontinuous**: Framework d'une plateforme as a service
