# É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