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