Infrastructure as Code: comment nous Nous avons remanié notre processus de développement / de publication pour adopter léchelle de notre équipe

(11 décembre 2020)

Dans cet article, nous montrons comment nous avons géré notre processus de déploiement continu dans le passé, ce qui nous a poussé à changer ce que nous avons et les efforts que nous avons déployés pour rendre le processus aussi simple / efficace que possible.

Larticle peut donner un avant-goût aux devops, mais dans son essence, le processus de publication affecte toutes les équipes et comment elles fonctionnent toutes seules ou collaborer avec dautres équipes, nous montrerons comment les rôles sont déplacés simplement en modifiant le processus.

À propos de nous

Chez Halan, nous aidons à proposer des solutions de télé-assistance et de logistique à la demande ( versements, livraison, paiements en ligne, commerce électronique) pour la population sous-desservie par les technologies existantes dans les transports et autres services, vous pouvez consulter notre ap p ici ( android / iOS )

Donner lancien processus cest dû, le bien et le mal

Nous allons commencer par la façon dont nous avons géré notre processus dans le passé et comment cela nous a affectés positivement ou négativement.

Pour mon équipe, nous avons presque tout déployé sur AWS avec GitHub comme système de contrôle de version, nous devons donc trouver un moyen dexpédier les fonctionnalités de nos dépôts GitHub vers les services AWS.

Déploiements de contrôle de version

Nous en nous appuyant sur pipeline de code AWS , nous avons défini des déclencheurs pour démarrer un pipeline de déploiement chaque fois quun nouveau commit est fusionné dans lune des branches principales représentant les étapes connues: dev , prod et mise en scène environnements.

présentation de la façon dont les déploiements sont déclenchés

Ce flux signifie que toute fonctionnalité de la branche principale est sur production, qui fait sûrement fusionner pour maîtriser un sujet tabou à discuter et tout le monde navait pas que permission de fusionner votre PR sur master.

La même chose était pour les autres branches mais ce nétait pas le cas Cest vraiment un problème, car les environnements de développement et de préparation ne sont pas vraiment effrayants.

Notre QC a commencé à tester et à vérifier les fonctionnalités lorsquelles sont fusionnées lors de la mise en scène, ce qui signifie quelles testent dabord sur la préparation de lenvironnement, puis si elles sont vérifiées , la fonctionnalité sera fusionnée dans la branche master . cela semble bien fonctionner mais regardons les inconvénients dun tel processus.

Cela nous a permis de tester et de déployer plusieurs fonctionnalités en même temps à chaque étape (développement, mise en scène), ce qui est bon et mauvais pour en même temps parce que:

  • Cela signifie que les développeurs nont pas à attendre les uns les autres pour prendre le contrôle de lenvironnement de développement / de préparation.
  • Mais cela signifie que les fonctionnalités létape de développement pourrait par erreur provoquer lun lautre ne pas fonctionner ou work (faux positif), et ces deux cas sont vraiment mauvais et pourraient faire passer le code en production alors quil ne fonctionne pas vraiment.

Branches divergentes, rebasage inutile

Comme vous lavez peut-être déjà remarqué, nous avons dit que pour déployer sur dev env, vous devez fusionner votre code sur la branche dev. Eh bien, cette partie a malheureusement rapidement gâché la chronologie de notre branche car:

  • Toutes les fonctionnalités qui ont été testées sur le développement ne sont pas mises en production, nous avons donc eu des commits fantômes dans notre branche de développement unifiée .
  • Un laboratoire dexpérimentation sans aucun doute, les gens peuvent découvrir quils ont fait quelque chose de mal après un certain temps et décider de laisser tomber leur code / commits et en commencer un nouveau, mais cela nous laisse toujours avec leurs anciens commits fusionné sur la branche dev.

Ce type de comportement a produit ce que nous appelons une divergence entre les branches, pour fusionner une caractéristique branche dont le maître est base en dev, vous devez résoudre conflits ! ce qui est étrangement bizarre que vous soyez littéralement en conflit avec des fantômes et résolvez des choses qui ne seront plus jamais sur production , cela vous donne sûrement plus deux mauvaises options:

  • Construisez une nouvelle branche pour votre fonctionnalité dérivée de votre branche de fonctionnalité dorigine et résolvez les conflits dessus, puis une fois les tests terminés, fusionnez la branche dorigine dans master.
  • Résolvez les conflits sur votre branche puis choisissez vos commits dans la nouvelle branche lors de la fusion avec master.

Avec plus de développeurs rejoignant notre équipe, les choses commenceront à devenir plus difficiles et la divergence prendra sûrement une augmentation.

Réorganiser le processus de construction / déploiement

La première chose que nous avions à lesprit est de savoir comment nous débarrasser de ces branches divergentes, nous avons besoin dune nouvelle méthode pour fournir en toute sécurité des fonctionnalités à la production de manière transparente et contrôler le nombre de fonctionnalités déployées en production sans impliquer le contrôle de la source avec lactivité de déploiement.

Un petit examen sur AWS

Nous devons dabord identifier les principaux éléments qui joueront un rôle avec nous dans le processus:

  • Github : contrôle de source ayant des dépôts pour chaque micro-service disponible.
  • Amazon ECR : un registre dimages Docker qui est divisé en «repos», chaque repo représente également un micro-service et contient les images qui ont été poussées pour le service X et qui peuvent être utilisées ou déployées directement sur ce service pour le faire fonctionner.
  • Amazon ECS / EC2 / EKS : cest là que vivent nos micro-services, avec leurs environnements, ECS est divisé en clusters, chaque cluster contient un certain nombre de services chacun a une définition de tâche qui contient des informations comme des variables denvironnement , calcul des spécifications, réseau, etc.

Nous devons donc trouver un moyen de les relier afin de nous faciliter la tâche en tant quéquipe de développement pour fournir des fonctionnalités et pour le CQ de les contrôler et de les vérifier

Nous avons pensé que nous pourrions définir un service intermédiaire, un service responsable de déployer dautres services. Nous voulions que ce service gère deux commandes principales:

  • Commande de construction: nous souhaitez pouvoir créer une image et la pousser vers ECR à partir de nimporte quelle branche / commit que nous voulons dun certain dépôt GitHub vers un certain dépôt ECR.
  • Commande de déploiement: nous voulons pouvoir déployer une certaine image dun dépôt sur ECR vers tous les clusters contenant le service X.

Prenons chacune de ces commandes sous le microscope et voyez ce que chacune delles implique, nous commençons par la commande Build :

  • Tout dabord, nous devons cloner le dépôt au commit / branch spécifié.
  • Créer une image docker à laide du Dockerfile dans ce dépôt.
  • Poussez le image construite dans le référentiel ECR avec une nouvelle balise si nécessaire ou la plus récente.

Bien que toutes ces étapes soient certainement doab le dans notre nouveau service de déploiement, mais nous avons trouvé que cest fastidieux car la création dimages docker consomme beaucoup dimages ressources et cela limitera notre nouveau service à quelques simultanés déploiements ou le rendre si gigantesque en ressources.

Nous avons pensé que nous pourrions au lieu de faire tout ce travail sur le service lui-même, nous pourrions démarrer un nouveau workflow sur Github sur ce dépôt et transmettre à tout les détails de la tâche, tels que la branche à extraire et le dépôt ECR vers lequel pousser, une fois terminé, il signalera à lutilisateur de revenir en utilisant un crochet Web . Bien sûr, il existe dautres solutions pour cela, comme Jenkins pour une meilleure sécurité afin de vous assurer que votre code repose sur les machines que vous gérez.

Cela a changé le flux de travail que nous avons mentionné ci-dessus, cela se passe maintenant comme suit:

  • Recevoir les détails de compilation de lutilisateur.
  • Déclenchez une action Github sur le référentiel spécifié.
  • Les actions Github feront tourner une nouvelle machine qui nous informera de létat de la compilation lorsque fait, il marquera également le commit avec le Numéro de carte Jira sur lequel vous travaillez.

La deuxième commande est la commande Depoly , qui est bien plus simple que la commande build, nous navons ici quà:

  • Recevez les détails de déploiement de lutilisateur.
  • Démarrez une nouvelle tâche de déploiement sur chaque cluster qui contient le service et fournissez lURL de limage dans ECR.

workflow de déploiement

Cest vraiment tout pour le déploiement! juste un travail de facilitation entre deux produits AWS, comparons ce flux de travail à ce que nous avions auparavant et voyons comment notre stratégie de lancement a changé.

Lutilisation du nouveau processus pour déployer votre code sur lune des étapes (prod, dev, staging) ne nécessite aucun type de fusions , le code est totalement indépendant du déploiement , nous pourrions avoir 20 fonctionnalités prêtes sur la branche principale et choisissez uniquement de déployer 10 dentre eux.

Mais cela implique également que nous ne pouvons avoir quune seule fonctionnalité testé sur la branche dev, sauf si deux développeurs ont accepté de rebase lun sur lautre.

Historique de déploiement et balisage

Cela nous a également fourni un meilleur rollback stratégie contre les problèmes de production, nous avons maintenant une branche principale balisée pour chaque fonctionnalité / tâche , chaque fois que nous sommes confrontés à un problème de production et que nous voulons restaurer une fonctionnalité, nous pouvons facilement revenir à lendroit où cette fonctionnalité a commencé et revenir à la validation avant si possible.

Cela nous a également permis de fusionner toutes les fonctionnalités fonctionnelles sur la branche master, même si elles ne seront pas déployées, nous pouvons toujours les avoir sur master prêtes pour que le prochain lot de fonctionnalités soit en production lorsque cela sera nécessaire, ce qui aidera sûrement notre léquipe se concentre sur la livraison des tâches sans se soucier du moment où cette tâche sera fusionnée dans master pour être déployée, ici nous fusionnons dabord, puis nous nous inquiétons des déploiements.

Étapes suivantes

Nous travaillons actuellement à lautomatisation mieux notre processus, y compris les variables denvironnement et les spécifications de la machine, ils seront tous disponibles sous forme de code, chaque fois que nous modifierons ces spécifications, cela reflètera automatiquement ect sur nos machines sur AWS dans l Environnement respectif, pas besoin de coder manuellement ces valeurs à chaque fois sur AWS.

Avec cela, nous aurons un meilleur contrôle et visibilité sur toutes nos configurations de services, tout dans notre infrastructure sera en code et en un clic pour mettre à jour! Cela rend également la modification de notre infrastructure indépendante du fournisseur de services, nous pourrions passer dAWS au cloud Google par exemple et navons besoin de modifier que les commandes utilisées par le service de déploiement pour déployer notre infrastructure sur le nouveau fournisseur de services.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *