{"id":55870,"date":"2020-01-30T00:00:00","date_gmt":"2020-01-29T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian"},"modified":"2020-02-18T14:04:02","modified_gmt":"2020-02-18T11:04:02","slug":"ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLors de RIT 2019, notre coll\u00e8gue Alexandre Korotkov a pr\u00e9sent\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">rapport<\/a><\/noindex> sur l'automatisation du d\u00e9veloppement chez CIAN : pour simplifier la vie et le travail, nous utilisons notre propre plateforme Integro. Elle suit le cycle de vie des t\u00e2ches, d\u00e9charge les d\u00e9veloppeurs des op\u00e9rations r\u00e9p\u00e9titives et r\u00e9duit consid\u00e9rablement le nombre de bugs en production. Dans cet article, nous compl\u00e9terons la pr\u00e9sentation d'Alexandre et raconterons comment nous sommes pass\u00e9s de simples scripts \u00e0 l'int\u00e9gration de produits open source via notre plateforme et ce qu'une \u00e9quipe d'automatisation fait chez nous.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Niveau z\u00e9ro<\/h2>\n<p>\n<i><b>\u00ab Le niveau z\u00e9ro n'existe pas, je ne sais pas ce que c'est \u00bb<\/b><br \/>\nMa\u00eetre Shifu du film \u00ab Kung Fu Panda \u00bb<\/i><\/p>\n<p>L'automatisation chez CIAN a commenc\u00e9 14 ans apr\u00e8s la cr\u00e9ation de l'entreprise. \u00c0 l'\u00e9poque, l'\u00e9quipe de d\u00e9veloppement comptait 35 personnes. C'est difficile \u00e0 croire, non ? Bien s\u00fbr, d'une certaine mani\u00e8re, l'automatisation existait d\u00e9j\u00e0, mais une direction distincte pour l'int\u00e9gration continue et la livraison de code a commenc\u00e9 \u00e0 se former pr\u00e9cis\u00e9ment en 2015.\u00a0<\/p>\n<p>\u00c0 ce moment-l\u00e0, nous avions un \u00e9norme monolithe en Python, C# et PHP, d\u00e9ploy\u00e9 sur des serveurs Linux\/Windows. Pour d\u00e9ployer ce monstre, nous avions un ensemble de scripts que nous ex\u00e9cutions manuellement. Il y avait aussi la construction du monolithe, qui causait douleur et souffrance \u00e0 cause des conflits lors de la fusion des branches, des corrections de d\u00e9fauts et de la reconstruction \u00ab avec un autre ensemble de t\u00e2ches dans le build \u00bb. Globalement, le processus ressemblait \u00e0 cela :<\/p>\n<p><img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCela ne nous convenait pas, et nous voulions construire un processus de construction et de d\u00e9ploiement r\u00e9p\u00e9table, automatis\u00e9 et contr\u00f4l\u00e9. Pour cela, nous avions besoin d'un syst\u00e8me CI\/CD, et nous h\u00e9sitions entre la version gratuite de Teamcity et Jenkins gratuit, car nous avions d\u00e9j\u00e0 travaill\u00e9 avec eux et les deux satisfaisaient nos besoins en termes de fonctionnalit\u00e9s. Nous avons choisi Teamcity comme produit plus r\u00e9cent. \u00c0 l'\u00e9poque, nous n'utilisions pas encore une architecture microservices et ne pr\u00e9voyions pas un grand nombre de t\u00e2ches et de projets.<\/p>\n<h2>Nous arrivons \u00e0 l'id\u00e9e d'un syst\u00e8me propre.<\/h2>\n<p>\nLa mise en \u0153uvre de Teamcity a \u00e9limin\u00e9 une partie du travail manuel : il reste encore \u00e0 cr\u00e9er des Pull Requests, \u00e0 faire avancer les t\u00e2ches dans Jira et \u00e0 choisir les t\u00e2ches pour les versions. Avec \u00e7a, Teamcity ne pouvait d\u00e9j\u00e0 plus g\u00e9rer. Il fallait choisir la voie d'une automatisation suppl\u00e9mentaire. Nous avons envisag\u00e9 des options de scripts dans Teamcity ou le passage \u00e0 des syst\u00e8mes d'automatisation tiers. Mais au final, nous avons d\u00e9cid\u00e9 qu'il fallait la flexibilit\u00e9 maximale, que seule une solution interne pouvait offrir. C'est ainsi qu'est n\u00e9e la premi\u00e8re version de notre syst\u00e8me d'automatisation interne appel\u00e9 Integro.<\/p>\n<p>Teamcity s'occupe de l'automatisation au niveau du lancement des processus de construction et de d\u00e9ploiement, tandis qu'Integro s'est concentr\u00e9 sur l'automatisation de haut niveau des processus de d\u00e9veloppement. Il fallait combiner le travail sur les t\u00e2ches dans Jira avec le traitement du code source associ\u00e9 dans Bitbucket. \u00c0 ce stade, des workflows sp\u00e9cifiques ont commenc\u00e9 \u00e0 appara\u00eetre au sein d'Integro pour travailler avec diff\u00e9rents types de t\u00e2ches.\u00a0<\/p>\n<p>Avec l'augmentation de l'automatisation dans les processus commerciaux, le nombre de projets et d'ex\u00e9cutions dans Teamcity a augment\u00e9. Cela a engendr\u00e9 un nouveau probl\u00e8me : un seul instance gratuite de Teamcity ne suffisait plus (3 agents et 100 projets), nous avons ajout\u00e9 une autre instance (encore 3 agents et 100 projets), puis une autre. Au final, nous avons obtenu un syst\u00e8me compos\u00e9 de plusieurs clusters, difficile \u00e0 g\u00e9rer :<\/p>\n<p><img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLorsque la question d'une quatri\u00e8me instance s'est pos\u00e9e, nous avons compris qu'il ne pouvait plus \u00eatre question de continuer ainsi, car les co\u00fbts cumul\u00e9s de maintenance de 4 instances d\u00e9passaient largement les limites acceptables. Il fallait envisager l'achat d'une Teamcity payante ou opter pour la gratuite Jenkins. Nous avons effectu\u00e9 des calculs sur les instances et les plans d'automatisation et avons d\u00e9cid\u00e9 que nous allions vivre avec Jenkins. Apr\u00e8s quelques semaines, nous avons migr\u00e9 vers Jenkins et nous nous sommes d\u00e9barrass\u00e9s d'une partie des tracas li\u00e9s \u00e0 la maintenance de plusieurs instances de Teamcity. Cela nous a permis de nous concentrer sur le d\u00e9veloppement d'Integro et d'adapter Jenkins \u00e0 nos besoins.<\/p>\n<p>Avec l'augmentation de l'automatisation de base (sous la forme de la cr\u00e9ation automatique de Pull Requests, de la collecte et de la publication de la couverture de code et d'autres v\u00e9rifications), il est devenu imp\u00e9ratif de s'\u00e9loigner des publications manuelles et de confier ce travail aux robots. De plus, l'entreprise a commenc\u00e9 sa transition vers des microservices, n\u00e9cessitant des publications fr\u00e9quentes, chacune s\u00e9par\u00e9ment. Ainsi, nous avons progressivement adopt\u00e9 les publications automatiques de nos microservices (le monolithe est encore publi\u00e9 manuellement en raison de la complexit\u00e9 du processus). Mais, comme c'est souvent le cas, une nouvelle complexit\u00e9 est apparue.\u00a0<\/p>\n<h2>Automatisons les tests<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn raison de l'automatisation des publications, les processus de d\u00e9veloppement se sont acc\u00e9l\u00e9r\u00e9s, en partie gr\u00e2ce au passage de certaines \u00e9tapes de test. Cela a entra\u00een\u00e9 une perte temporaire de qualit\u00e9. Cela peut sembler banal, mais avec l'acc\u00e9l\u00e9ration des publications, il fallait \u00e9galement changer la m\u00e9thodologie de d\u00e9veloppement du produit. Il \u00e9tait n\u00e9cessaire de r\u00e9fl\u00e9chir \u00e0 l'automatisation des tests, \u00e0 l'instauration d'une responsabilit\u00e9 personnelle (il s'agit de \u00ab l'acceptation d'une id\u00e9e dans la t\u00eate \u00bb, pas de sanctions financi\u00e8res) des d\u00e9veloppeurs pour le code publi\u00e9 et les bugs qu'il contient, ainsi qu'\u00e0 une d\u00e9cision sur la publication ou non d'une t\u00e2che via le d\u00e9ploiement automatique.\u00a0<\/p>\n<p>En r\u00e9solvant les probl\u00e8mes de qualit\u00e9, nous avons pris deux d\u00e9cisions importantes : nous avons commenc\u00e9 \u00e0 r\u00e9aliser des tests canari et avons mis en place une surveillance automatique des erreurs avec une r\u00e9ponse automatique en cas de d\u00e9passement. La premi\u00e8re solution a permis de rep\u00e9rer des erreurs \u00e9videntes avant que le code n'atteigne pleinement la production, la seconde a diminu\u00e9 le temps de r\u00e9action aux probl\u00e8mes en production. Des erreurs, bien s\u00fbr, il y en a, mais nous passons une plus grande partie de notre temps et de nos efforts non pas \u00e0 corriger, mais \u00e0 minimiser.\u00a0<\/p>\n<h2>\u00c9quipe d'automatisation<\/h2>\n<p>\nNous avons actuellement une \u00e9quipe de 130 d\u00e9veloppeurs, et nous continuons <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">\u00e0 cro\u00eetre<\/a><\/noindex>. L'\u00e9quipe d'int\u00e9gration et de livraison continues de code (ci-apr\u00e8s d\u00e9nomm\u00e9e \u00e9quipe CI\/CD) se compose de 7 personnes et travaille dans 2 directions : le d\u00e9veloppement de la plateforme d'automatisation Integro et DevOps.\u00a0<\/p>\n<p>Le DevOps est responsable des environnements Dev\/Beta du site CIAN, de l'environnement Integro, aide les d\u00e9veloppeurs \u00e0 r\u00e9soudre des probl\u00e8mes et \u00e9labore de nouvelles approches pour l'extension des environnements. La direction du d\u00e9veloppement Integro s\u2019occupe \u00e0 la fois d\u2019Integro elle-m\u00eame et de services connexes, tels que des plugins pour Jenkins, Jira, Confluence, et d\u00e9veloppe \u00e9galement des utilitaires et des applications pour les \u00e9quipes de d\u00e9veloppeurs.\u00a0<\/p>\n<p>L'\u00e9quipe DI travaille en collaboration avec l'\u00e9quipe Plateforme, qui s'occupe de l'architecture, des biblioth\u00e8ques et des approches de d\u00e9veloppement au sein de l'entreprise. De plus, tout d\u00e9veloppeur au sein de CIAN peut contribuer \u00e0 l'automatisation, par exemple en r\u00e9alisant de la micro-automatisation selon les besoins de l'\u00e9quipe ou en partageant une id\u00e9e innovante pour am\u00e9liorer encore l'automatisation.<\/p>\n<h2>Le g\u00e2teau \u00e0 plusieurs couches de l'automatisation chez CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTous les syst\u00e8mes impliqu\u00e9s dans l'automatisation peuvent \u00eatre divis\u00e9s en plusieurs couches :<\/p>\n<ol>\n<li>Syst\u00e8mes externes (Jira, Bitbucket, etc.). Ils sont utilis\u00e9s par les \u00e9quipes de d\u00e9veloppement.\n<\/li>\n<li>Plateforme Integro. Les d\u00e9veloppeurs n'y travaillent g\u00e9n\u00e9ralement pas directement, mais elle soutient le bon fonctionnement de l'ensemble de l'automatisation.\n<\/li>\n<li>Services de d\u00e9ploiement, d'orchestration et de d\u00e9couverte (par exemple, Jenkins, Consul, Nomad). Gr\u00e2ce \u00e0 eux, nous d\u00e9ployons le code sur les serveurs et garantissons la collaboration entre les services.\n<\/li>\n<li>Niveau physique (serveurs, syst\u00e8mes d'exploitation, logiciels connexes). Notre code fonctionne \u00e0 ce niveau. Cela peut \u00eatre un serveur physique ou virtuel (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nSur la base de ce concept, nous d\u00e9limitons les zones de responsabilit\u00e9 au sein de l'\u00e9quipe DI. Les deux premiers niveaux rel\u00e8vent de la direction du d\u00e9veloppement Integro, tandis que les deux derniers niveaux rel\u00e8vent de la responsabilit\u00e9 de DevOps. Cette r\u00e9partition permet de se concentrer sur les t\u00e2ches sans interf\u00e9rer avec la collaboration, car nous sommes proches les uns des autres et \u00e9changeons constamment des connaissances et des exp\u00e9riences.<\/p>\n<h2>Integro<\/h2>\n<p>\nFocalisons-nous sur Integro et commen\u00e7ons par la pile technologique :<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (l'ancien monolithe Integro restera sur Java 8)\n<\/li>\n<li>Spring Boot 2.X + Spring Cloud Config\n<\/li>\n<li>PostgreSql 11\n<\/li>\n<li>RabbitMQ\u00a0\n<\/li>\n<li>Apache Ignite\n<\/li>\n<li>Camunda (embedd\u00e9)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>UI Web : React (CSR) + MobX\n<\/li>\n<li>SSO : Keycloak\n<\/li>\n<\/ul>\n<p>\nNous nous en tenons au principe du d\u00e9veloppement microservices, bien que nous ayons \u00e9galement un h\u00e9ritage sous la forme d'un monolithe de l'ancienne version d'Integro. Chaque microservice fonctionne dans son propre conteneur Docker, les services communiquent entre eux via des requ\u00eates HTTP et des messages RabbitMQ. Les microservices se trouvent mutuellement via Consul et envoient une requ\u00eate \u00e0 celui-ci, en passant par une autorisation via SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrenons un exemple concret de l'interaction avec Jenkins, qui se compose des \u00e9tapes suivantes :<\/p>\n<ol>\n<li>Le microservice de gestion des workflows (ci-apr\u00e8s le microservice Flow) souhaite d\u00e9clencher une build dans Jenkins. Pour cela, il trouve via Consul l'IP:PORT du microservice d'int\u00e9gration avec Jenkins (ci-apr\u00e8s le microservice Jenkins) et lui envoie une requ\u00eate asynchrone pour lancer la build dans Jenkins.\n<\/li>\n<li>Le microservice Jenkins, apr\u00e8s avoir re\u00e7u la requ\u00eate, g\u00e9n\u00e8re et renvoie un Job ID, par lequel il sera possible d'identifier le r\u00e9sultat du travail. En m\u00eame temps, il d\u00e9clenche la build dans Jenkins en appelant l'API REST.\n<\/li>\n<li>Jenkins ex\u00e9cute la build et, une fois termin\u00e9e, envoie un webhook avec les r\u00e9sultats d'ex\u00e9cution au microservice Jenkins.\n<\/li>\n<li>Le microservice Jenkins, ayant re\u00e7u le webhook, forme un message sur la fin du traitement de la requ\u00eate et y joint les r\u00e9sultats d'ex\u00e9cution. Le message ainsi form\u00e9 est envoy\u00e9 dans la file RabbitMQ.\n<\/li>\n<li>Via RabbitMQ, le message publi\u00e9 atteint le microservice Flow, qui prend connaissance du r\u00e9sultat du traitement de sa t\u00e2che en associant le Job ID de la requ\u00eate au message re\u00e7u.\n<\/li>\n<\/ol>\n<p>\nNous avons actuellement environ 30 microservices, que l'on peut diviser en plusieurs groupes :<\/p>\n<ol>\n<li>Gestion des configurations.\n<\/li>\n<li>Information et interaction avec les utilisateurs (messageries, e-mails).\n<\/li>\n<li>Travail avec le code source.\n<\/li>\n<li>Int\u00e9gration avec les outils de d\u00e9ploiement (Jenkins, Nomad, Consul, etc.).\n<\/li>\n<li>Surveillance (des releases, des erreurs, etc.).\n<\/li>\n<li>Outils web (interface pour g\u00e9rer les environnements de test, collecter des statistiques, etc.).\n<\/li>\n<li>Int\u00e9gration avec des gestionnaires de t\u00e2ches et des syst\u00e8mes similaires.\n<\/li>\n<li>Gestion des workflows pour diff\u00e9rentes t\u00e2ches.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow de t\u00e2ches<\/h2>\n<p>\nIntegro automatise les actions li\u00e9es au cycle de vie d'une t\u00e2che. De mani\u00e8re simplifi\u00e9e, nous entendons par cycle de vie d'une t\u00e2che le workflow d'une t\u00e2che dans Jira. Dans nos processus de d\u00e9veloppement, il existe plusieurs variations de workflow en fonction du projet, du type de t\u00e2che et des options choisies dans une t\u00e2che sp\u00e9cifique.\u00a0<\/p>\n<p>Examinons le workflow que nous utilisons le plus souvent :<\/p>\n<p><img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans le sch\u00e9ma, l'engrenage indique que la transition est d\u00e9clench\u00e9e automatiquement par Integro, tandis que la figure humaine signifie que la transition est initi\u00e9e manuellement par un utilisateur. Examinons plusieurs chemins par lesquels une t\u00e2che peut avancer dans ce workflow.<\/p>\n<p>Tests totalement manuels sur DEV+BETA sans tests canary (c'est g\u00e9n\u00e9ralement ainsi que nous d\u00e9ployons le monolithe) :<\/p>\n<p><img decoding=\"async\" alt=\"Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD'autres combinaisons de transitions peuvent \u00e9galement exister. Parfois, le chemin que prendra la t\u00e2che peut \u00eatre choisi via des options dans Jira.<\/p>\n<h2>D\u00e9placement de la t\u00e2che<\/h2>\n<p>\nExaminons les \u00e9tapes principales r\u00e9alis\u00e9es lors du d\u00e9placement d'une t\u00e2che \u00e0 travers le workflow \u00ab Testing on DEV + tests canaries \u00bb :<\/p>\n<p>1. Le d\u00e9veloppeur ou le PM cr\u00e9e une t\u00e2che.<\/p>\n<p>2. Le d\u00e9veloppeur prend la t\u00e2che en charge. Une fois termin\u00e9e, elle est transf\u00e9r\u00e9e au statut IN REVIEW.<\/p>\n<p>3. Jira envoie un Webhook vers le microservice Jira (responsable de l'int\u00e9gration avec Jira).<\/p>\n<p>4. Le microservice Jira envoie une demande au service Flow (responsable des workflows internes o\u00f9 le travail est effectu\u00e9) pour d\u00e9clencher le workflow.<\/p>\n<p>5. \u00c0 l'int\u00e9rieur du service Flow :<\/p>\n<ul>\n<li>Des r\u00e9viseurs sont assign\u00e9s \u00e0 la t\u00e2che (microservice Users, qui conna\u00eet tout sur les utilisateurs + microservice Jira).<\/li>\n<li>Via le microservice Source (qui conna\u00eet les d\u00e9p\u00f4ts et les branches, mais ne travaille pas avec le code lui-m\u00eame), une recherche est effectu\u00e9e dans les d\u00e9p\u00f4ts o\u00f9 se trouve la branche de notre t\u00e2che (pour simplifier la recherche, le nom de la branche correspond au num\u00e9ro de la t\u00e2che dans Jira). Dans la plupart des cas, une t\u00e2che n'a qu'une seule branche dans un seul d\u00e9p\u00f4t, ce qui simplifie la gestion de la file d'attente pour le d\u00e9ploiement et r\u00e9duit l'interd\u00e9pendance entre les d\u00e9p\u00f4ts.<\/li>\n<li>Pour chaque branche trouv\u00e9e, la s\u00e9quence d'actions suivante est ex\u00e9cut\u00e9e :\n<p> i) Fusion de la branche master (microservice Git pour travailler avec le code).<br \/>\n ii) La branche est verrouill\u00e9e contre les modifications par le d\u00e9veloppeur (microservice Bitbucket).<br \/>\n iii) Une Pull Request est cr\u00e9\u00e9e sur cette branche (microservice Bitbucket).<br \/>\n iv) Un message concernant la nouvelle Pull Request est envoy\u00e9 dans les chats des d\u00e9veloppeurs (microservice Notify pour les notifications).<br \/>\n v) La construction, les tests et le d\u00e9ploiement de la t\u00e2che sur DEV sont lanc\u00e9s (microservice Jenkins pour travailler avec Jenkins).<br \/>\n vi) Si toutes les \u00e9tapes pr\u00e9c\u00e9dentes se sont bien pass\u00e9es, Integro donne son approbation sur la Pull Request (microservice Bitbucket).<\/li>\n<li>Integro attend l'approbation sur la Pull Request de la part des r\u00e9viseurs d\u00e9sign\u00e9s.<\/li>\n<li>D\u00e8s que toutes les approbations n\u00e9cessaires sont obtenues (y compris les tests automatis\u00e9s ayant r\u00e9ussi), Integro d\u00e9place la t\u00e2che vers le statut Test on Dev (microservice Jira).<\/li>\n<\/ul>\n<p>\n6. Les testeurs effectuent des tests sur la t\u00e2che. S'il n'y a pas de probl\u00e8mes, la t\u00e2che est transf\u00e9r\u00e9e au statut Ready For Build.<\/p>\n<p>7. Integro \u00ab voit \u00bb que la t\u00e2che est pr\u00eate pour le d\u00e9ploiement et lance son d\u00e9ploiement en mode canari (microservice Jenkins). La readiness pour le d\u00e9ploiement est d\u00e9termin\u00e9e par un ensemble de r\u00e8gles. Par exemple, la t\u00e2che doit \u00eatre dans le bon statut, il ne doit pas y avoir de blocages sur d'autres t\u00e2ches, il n'y a pas de d\u00e9ploiements actifs de ce microservice, etc.<\/p>\n<p>8. La t\u00e2che est transf\u00e9r\u00e9e au statut Canary (microservice Jira).<\/p>\n<p>9. Jenkins lance, via Nomad, le d\u00e9ploiement de la t\u00e2che en mode canari (g\u00e9n\u00e9ralement 1 \u00e0 3 instances) et informe le service de surveillance des d\u00e9ploiements (microservice DeployWatch) du d\u00e9ploiement.<\/p>\n<p>10. Le microservice DeployWatch collecte le niveau d'erreur et y r\u00e9agit si n\u00e9cessaire. Si le niveau d'erreur d\u00e9passe le seuil (la norme est calcul\u00e9e automatiquement), une notification est envoy\u00e9e aux d\u00e9veloppeurs via le microservice Notify. Si, apr\u00e8s 5 minutes, le d\u00e9veloppeur ne r\u00e9agit pas (en appuyant sur Revert ou Stay), un rollback automatique des instances canaries est effectu\u00e9. Si le niveau d'erreur n'est pas d\u00e9pass\u00e9, le d\u00e9veloppeur doit manuellement lancer le d\u00e9ploiement de la t\u00e2che en Production (en appuyant sur un bouton dans l'interface utilisateur). Si, dans les 60 minutes, le d\u00e9veloppeur n'a pas lanc\u00e9 le d\u00e9ploiement en Production, les instances canaries seront \u00e9galement retir\u00e9es par mesure de s\u00e9curit\u00e9.<\/p>\n<p>11. Apr\u00e8s le lancement du d\u00e9ploiement en Production :<\/p>\n<ul>\n<li>La t\u00e2che est transf\u00e9r\u00e9e au statut Production (microservice Jira).<\/li>\n<li>Le microservice Jenkins lance le processus de d\u00e9ploiement et informe le microservice DeployWatch du d\u00e9ploiement.<\/li>\n<li>Le microservice DeployWatch v\u00e9rifie que tous les conteneurs en Production ont \u00e9t\u00e9 mis \u00e0 jour (il y a eu des cas o\u00f9 ce n'\u00e9tait pas le cas).<\/li>\n<li>Une notification sur les r\u00e9sultats du d\u00e9ploiement en Production est envoy\u00e9e via le microservice Notify.<\/li>\n<\/ul>\n<p>\n12. Les d\u00e9veloppeurs disposeront de 30 minutes pour lancer un rollback de la t\u00e2che en Production en cas de comportement anormal du microservice. Pass\u00e9 ce d\u00e9lai, la t\u00e2che sera automatiquement int\u00e9gr\u00e9e dans master (microservice Git).<\/p>\n<p>13. Apr\u00e8s un merge r\u00e9ussi dans master, le statut de la t\u00e2che sera chang\u00e9 en Closed (microservice Jira).<\/p>\n<p>Ce sch\u00e9ma ne pr\u00e9tend pas \u00e0 une exhaustivit\u00e9 (il y a en r\u00e9alit\u00e9 plus d'\u00e9tapes), mais permet d'\u00e9valuer le degr\u00e9 d'int\u00e9gration dans les processus. Nous ne consid\u00e9rons pas ce sch\u00e9ma comme parfait et nous am\u00e9liorons les processus d'automatisation de la gestion des d\u00e9ploiements et des sorties.<\/p>\n<h2>Que faire ensuite<\/h2>\n<p>\nNous avons de grands projets pour d\u00e9velopper l'automatisation, tels que l'abandon des op\u00e9rations manuelles lors des sorties du monolithe, l'am\u00e9lioration du suivi lors du d\u00e9ploiement automatique, et l'optimisation de l'interaction avec les d\u00e9veloppeurs.<\/p>\n<p>Mais nous nous arr\u00eaterons ici pour le moment. Nous avons survol\u00e9 de nombreux sujets dans l'examen de l'automatisation, et certains n'ont m\u00eame pas \u00e9t\u00e9 abord\u00e9s, donc nous serons heureux de r\u00e9pondre aux questions. Nous attendons vos suggestions sur ce qu'il serait bon de traiter en d\u00e9tail, n'h\u00e9sitez pas \u00e0 \u00e9crire dans les commentaires.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/cian\/blog\/486056\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55870","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-29T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Des scripts \u00e0 notre propre plateforme : comment nous avons automatis\u00e9 le d\u00e9veloppement chez CIAN | ProHoster","description":"\u00c0 RIT 2019.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster","og:description":"\u041d\u0430 \u0420\u0418\u0422 2019.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-29T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55870","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:35:40","updated":"2022-09-30 17:42:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}