From a6dff487d9016aadca67ae71eee0c3c5d4532d96 Mon Sep 17 00:00:00 2001 From: Olivier DOSSMANN Date: Wed, 29 Jan 2025 10:31:33 +0100 Subject: [PATCH] =?UTF-8?q?chore(content):=20Specs=20+=20d=C3=A9marche=20-?= =?UTF-8?q?=20Add=20more=20content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/30_specifications_techniques.md | 17 +++++++- content/40_demarche.md | 53 +++++++++++++++++------- media/article_schema_promotion.png | Bin 0 -> 10055 bytes media/schema_workflow_environnement.png | Bin 0 -> 27585 bytes 4 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 media/article_schema_promotion.png create mode 100644 media/schema_workflow_environnement.png diff --git a/content/30_specifications_techniques.md b/content/30_specifications_techniques.md index 64d7bc6..1e32cb3 100644 --- a/content/30_specifications_techniques.md +++ b/content/30_specifications_techniques.md @@ -58,7 +58,7 @@ La partie proxy utilise actuellement **Traefik comme outil**. Ce qui n'est pas u Ces trois parties ont une influence sur le choix de l'infrastructure à mettre en place. Il reste cependant une **marge de manœuvre sur la partie proxy**. -## Infrastructure d'accueil +## Infrastructure Afin d'accueillir l'application dans le Cloud, l'infrastructure de base va poser les fondations de l'environnement complet nécessaire à un usage quotidien. @@ -106,6 +106,21 @@ Dans le cluster pourra donc tourner, en plus des agents précédemment cités, l Afin de permettre une livraison régulière de l'application, il va falloir automatiser au maximum les étapes entre la publication d'une nouvelle version de l'application et sa livraison. Puis son déploiement en production via une intervention humaine. +### Environnements + +Nous parlons de production depuis un moment. À quoi cela correspond ? + +Afin de mener à bien le travail de DevOps, nous avons défini les différents environnements par lesquels nous allons passer pour toute notre chaîne de production logicielle. Ainsi nous avons 4 environnements : + +* l'environnement de **développement** : c'est l'environnement disponible sur chaque machine des développeurs à l'aide des outils fournis (Dockerfile, docker-compose du projet applicatif), +* l'environnement de test : il est composé de l'ensemble des Runner Gitlab utilisés à l'intérieur de la chaîne d'intégration continue, +* l'environnement de pré-production (appelé « staging ») : c'est l'infrastructure présentée ci-avant, appliquée dans AWS avec une configuration dite *plus légère* (moins de machines virtuelles EC2 par exemple), +* et l'environnement de production : c'est l'infrastructure finale ; celle qui est disponible aux usagers. + +[//]: # Cf. https://mermaid.live/view#pako:eNptkkFugzAQRa9izRoiAiUkLLrKtlKldtXShYUHYtXY1Nhp05AD5Ry5WAcCUSuVFR6_-X4e-QilEQg5VMp8ljtuHXveFprRJ3D_WvG84mGLtjM6FLKupa7Z9nLeozJtiw1q93alP_gE18gte8Zu3ugcH7qmXSU7F5Y7LN_Zo72cw9Ya4UsnjZ7woTCxpTJeEPaLuJmxMLxnvcCGa4FUYJXvCOnJY_a5Io5MOsa9Mw138sNj189Kf_yu9J4rKfhwGKNkj0phPyrNR8-xl_NwCTam94PQP2FSj3GX8wRAAA3ahktB8z4ODQW4HQ2xgJx-BVbcK1dAoU-EDspPB11C7qzHAKzx9Q5oLqqjlW9JE7eS15Y3M9Jy_WJMc4NoDfkRviCPo2SxSdZplEXrKMrWyziAA5Wz5SJJ0ihebrJ4la7i9BTA9xgRLVZJnCXZJrlL19S6CgCFdMY-XN_L-GxOP_j4v68 + +![Schéma des environnements utilisés](./media/schema_workflow_environnement.png){height=50%}\ + ### Livraison continue et déploiement Il est visé une CI/cd, c'est à dire une Intégration Continue (Continuous Integration) et une livraison continue (continuous delivery). **L'automatisation est donc essentielle.** diff --git a/content/40_demarche.md b/content/40_demarche.md index fe1efd0..9b3959a 100644 --- a/content/40_demarche.md +++ b/content/40_demarche.md @@ -81,7 +81,7 @@ Dans le cadre de la rédaction de message de commit pour chaque changement effec Cela se résume à peu près à cela : -```ini {.numberLines} +``` [étendue optionnelle]: [corps optionnel] @@ -171,20 +171,45 @@ Il permet à chaque membre de l'équipe de prendre connaissance des habitudes en Il est utile si jamais nous changerions de plateforme DevOps : il suffirait d'appliquer à nouveau le même workflow. -### Environnements - -* Développement : chez chaque DEV (Dockerfile + docker-compose du projet lui-même) -* Tests : dans chaque gitlab-runner utilisé, via une CI -* Pré-production (appelé « staging ») : AWS staging -* Production : AWS production - -TODO: donner schéma effectué - ## Cas d'une collaboration inter-équipe -TODO : compléter +Dans le cadre de nos diverses **réflexions** nous avons eu un contact **avec l'équipe** qui se nomme **« Team Matrix »** dont le sujet était le déploiement de serveurs Matrix en haute disponibilité. -* réunion avec l'équipe Matrix pour échanger sur nos problématiques principales et nos choix actuels -* échange au sujet de la promotion logicielle avec l'équipe Matrix (Maxime) +Nous avons échangé sur le sujet de la promotion des versions entre environnements. Maxime, de la Team Matrix, et moi avons principalement discuté autour de l'article suivant : [How to model your GitOps environments and promote releases between them](https://codefresh.io/blog/how-to-model-your-gitops-environments-and-promote-releases-between-them/). -TODO : expliquer en quelques lignes que ça a été le cas avec l'équipe Odoo de manière bien plus sporadique (irrégulière) +L'idée de l'article, en quelques mots, est de **favoriser l'utilisation d'un dossier par environnement** plutôt qu'utiliser une branche Git pour chaque environnement. Il ajoute également de faire la promotion des versions entre ces différents environnements/dossiers. Avec une procédure « humaine » pour limiter de trop nombreuses promotions. + +Pour reprendre le schéma de l'article : + +![Schéma extrait de l'article sur la promotion des versions](./media/article_schema_promotion.png){width=100%}\ + +Après moultes discussions, nous sommes tombés d'accord sur quelques points, parmi : + +* ne PAS utiliser une branche par environnement, +* essayer au maximum d'avoir des dépôts indépendants (favoriser la modularité), +* faire de la promotion logicielle par la CI plutôt que manuellement, +* et utiliser les particularités des outils que nous avons (Terragrunt dans le cas de Maxime). + +Notre réflexion a evolué suite à ces échanges. Et nous avons opté initialement pour utiliser un dossier par environnement dans un dépôt unique nommé **infra**. Puis nous avons adapté notre intégration continue pour copier les valeurs communes de l'environnement de pré-production (staging) vers l'environnement de production (prod). + +Mon idéal serait : + +* avoir des dépôts indépendants pour chaque application avec des tests de sécurité, des tests du code, vérification de la couverture de code et tests sur la compilation - éventuelle - de l'outil et/ou des images Docker puis publication sur un registre, +* avoir une gestion de chacun de ces dépôts d'un système de versionnement (les fameuses « releases »), +* avoir la même chose pour chaque module Terraform que nous avons fabriqué (par exemple notre module « networking »), +* puis utiliser, dans un dépôt **infra** par exemple, nos modules situés sur des registres avec une version donnée, +* de là on peut imaginer : + * soit de la promotion des versions par une intégration continue entre dépôts (pré-production vers production par exemple) OU entre dossiers représentant un environnement, + * soit de la promotion des versions par une validation manuelle entre la pré-production et la production, +* ajouter des tests de sécurité des images (comme le contrôle de somme) avant utilisation dans d'autres dépôts. + +À noter que Maxime et moi étions également arrivés sur le fait qu'il y a déjà 2 types de promotions dans tout cela : + +* la promotion des versions des logiciels/modules/charts utilisés, +* et la promotion des configurations de ces derniers au sein de nos infrastructures. + +C'est un autre sujet très intéressant que nous ne détaillerons pas ici. + +## Conclusion + +TODO : conclusion de la démarche diff --git a/media/article_schema_promotion.png b/media/article_schema_promotion.png new file mode 100644 index 0000000000000000000000000000000000000000..0e0a7cb101e2d9ea1b3d6cb14d41f0ad507c962c GIT binary patch literal 10055 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 literal 0 HcmV?d00001