{"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\/sv\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 RIT 2019 gjorde v\u00e5r kollega Alexander Korotkov <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">en presentation<\/a><\/noindex> ett f\u00f6redrag om automatisering av utvecklingen p\u00e5 CIAN: f\u00f6r att f\u00f6renkla livet och arbetet anv\u00e4nder vi v\u00e5r egen plattform Integro. Den f\u00f6ljer upp livscykeln f\u00f6r uppgifter, tar bort rutinoperationer fr\u00e5n utvecklarna och minskar betydligt antalet buggar i produktion. I det h\u00e4r inl\u00e4gget kommer vi att komplettera Alexanders presentation och ber\u00e4tta hur vi gick fr\u00e5n enkla skript till att sammanfoga open source-produkter genom v\u00e5r egen plattform och vad v\u00e5rt separata automat team arbetar med.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nollniv\u00e5<\/h2>\n<p>\n<i><b>\"Det finns ingen nollniv\u00e5, jag k\u00e4nner inte till n\u00e5got s\u00e5dant\"<\/b><br \/>\nM\u00e4stare Shifu fr\u00e5n filmen \"Kung Fu Panda\"<\/i><\/p>\n<p>Automatiseringen p\u00e5 CIAN b\u00f6rjade 14 \u00e5r efter f\u00f6retagets grundande. D\u00e5 fanns det 35 personer i utvecklingsteamet. Det \u00e4r sv\u00e5rt att tro, eller hur? Sj\u00e4lvklart fanns automatisering i n\u00e5gon form, men ett separat sp\u00e5r f\u00f6r kontinuerlig integration och kodleverans b\u00f6rjade formas f\u00f6rst 2015.\u00a0<\/p>\n<p>Vid den tidpunkten hade vi en stor monolit av Python, C# och PHP, som var distribuerad p\u00e5 Linux-\/Windows-servrar. F\u00f6r att distribuera detta monster hade vi en upps\u00e4ttning skript som vi k\u00f6rde manuellt. Det fanns ocks\u00e5 en byggprocess f\u00f6r monoliten, som skapade mycket sm\u00e4rta och lidande p\u00e5 grund av konflikter vid sammanslagning av grenar, buggfixar och nybyggnad \"med en annan upps\u00e4ttning uppgifter i bygget\". F\u00f6renklat s\u00e5g processen ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet h\u00e4r var inte tillfredsst\u00e4llande f\u00f6r oss, och vi ville bygga en upprepbar, automatiserad och styrd bygg- och distributionsprocess. F\u00f6r detta beh\u00f6vde vi ett CI\/CD-system och vi valde mellan den kostnadsfria versionen av Teamcity och den kostnadsfria Jenkins, eftersom vi hade arbetat med dem och b\u00e5da uppfyllde v\u00e5ra funktionskrav. Vi valde Teamcity som en nyare produkt. D\u00e5 anv\u00e4nde vi fortfarande inte mikrotj\u00e4nstarkitektur och r\u00e4knade inte med ett stort antal uppgifter och projekt.<\/p>\n<h2>Vi kom d\u00e5 p\u00e5 id\u00e9n om ett eget system<\/h2>\n<p>\nImplementeringen av Teamcity eliminera bara en del av det manuella arbetet: det \u00e5terstod fortfarande skapandet av pull requests, befordran av uppgifter genom statusar i Jira, val av uppgifter f\u00f6r release. Systemet Teamcity hanterade inte detta. Det beh\u00f6vdes en v\u00e4g f\u00f6r fortsatt automatisering. Vi \u00f6verv\u00e4gde alternativ f\u00f6r att arbeta med skript i Teamcity eller att g\u00e5 \u00f6ver till externa automatiseringssystem. Men till slut beslutade vi att vi beh\u00f6vde maximal flexibilitet, som endast en egen l\u00f6sning kan ge. S\u00e5 f\u00f6ddes den f\u00f6rsta versionen av det interna automatiseringssystemet kallat Integro.<\/p>\n<p>Teamcity hanterar automatiseringen p\u00e5 niv\u00e5n f\u00f6r att starta bygg- och deployprocesser, medan Integro fokuserade p\u00e5 \u00f6vergripande automatisering av utvecklingsprocesser. Det beh\u00f6vdes en sammanslagning av arbetet med uppgifter i Jira med bearbetningen av den relaterade koden i Bitbucket. Vid detta stadie b\u00f6rjade Integro utveckla sina egna arbetsfl\u00f6den f\u00f6r att hantera uppgifter av olika typer.\u00a0<\/p>\n<p>P\u00e5 grund av den \u00f6kade automatiseringen i aff\u00e4rsprocesserna v\u00e4xte antalet projekt och k\u00f6rningar i Teamcity. S\u00e5 kom ett nytt problem: en gratis instans av Teamcity r\u00e4ckte inte l\u00e4ngre (3 agenter och 100 projekt), vi la till en till instans (ytterligare 3 agenter och 100 projekt), sedan \u00e4nnu en. Totalt fick vi ett system best\u00e5ende av flera kluster som var sv\u00e5rt att hantera.<\/p>\n<p><img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4r fr\u00e5gan om en fj\u00e4rde instans kom upp ins\u00e5g vi att vi inte kunde forts\u00e4tta s\u00e5 h\u00e4r, eftersom de totala kostnaderna f\u00f6r att supporta 4 instanser redan inte passade inom n\u00e5gra ramar. Fr\u00e5gan om att k\u00f6pa en betalversion av Teamcity eller att v\u00e4lja gratis Jenkins d\u00f6k upp. Vi gjorde ber\u00e4kningar kring instanser och automatiseringsplaner och beslutade att vi skulle anv\u00e4nda Jenkins. Efter ett par veckor bytte vi till Jenkins och blev av med en del av huvudv\u00e4rken kopplad till att st\u00f6dja flera instanser av Teamcity. D\u00e4rf\u00f6r kunde vi fokusera p\u00e5 utvecklingen av Integro och anpassningen av Jenkins efter v\u00e5ra behov.<\/p>\n<p>Med den \u00f6kande grundautomatiseringen (i form av automatisk skapande av Pull Request, insamling och publicering av kodt\u00e4ckning och andra kontroller) uppstod en stark \u00f6nskan att maximalt \u00f6verge manuella releaser och \u00f6verl\u00e4mna detta arbete till robotar. Dessutom p\u00e5b\u00f6rjades en flytt till mikrotj\u00e4nster inom f\u00f6retaget, vilket kr\u00e4vde frekventa releaser, dessutom separerade fr\u00e5n varandra. S\u00e5 vi har gradvis kommit fram till automatiserade releaser av v\u00e5ra mikrotj\u00e4nster (monoliten sl\u00e4pper vi fortfarande manuellt p\u00e5 grund av processens komplexitet). Men, som det ofta \u00e4r, uppstod en ny sv\u00e5righet.\u00a0<\/p>\n<h2>Automatiserar testning<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGenom automatiseringen av releaser har utvecklingsprocesserna accelererat, delvis genom att hoppa \u00f6ver vissa teststeg. Detta ledde till en tillf\u00e4llig f\u00f6rlust av kvalitet. Det l\u00e5ter banalt, men tillsammans med accelerationen av releaser var det n\u00f6dv\u00e4ndigt att \u00e4ndra \u00e4ven metodologin f\u00f6r produktutveckling. Det var dags att t\u00e4nka p\u00e5 automatisering av testning, fr\u00e4mjande av personlig ansvarighet (h\u00e4r handlar det om \"att ta id\u00e9n i huvudet\", inte monet\u00e4ra b\u00f6ter) av utvecklaren f\u00f6r den kod som sl\u00e4pps och buggar i den, samt att beslutet om att sl\u00e4ppa \/ inte sl\u00e4ppa uppgiften skulle fattas genom automatisk distribution.\u00a0<\/p>\n<p>Genom att \u00e5tg\u00e4rda kvalitetsproblem kom vi fram till tv\u00e5 viktiga beslut: vi b\u00f6rjade genomf\u00f6ra kanarietester och inf\u00f6rde automatisk \u00f6vervakning av bakgrundsfel med automatisk respons p\u00e5 dess \u00f6verskridande. Den f\u00f6rsta l\u00f6sningen gjorde det m\u00f6jligt att identifiera uppenbara fel innan koden helt hamnade i produktion, den andra minskade svarstiden p\u00e5 problem i produktion. Fel f\u00f6rekommer s\u00e5klart, men vi l\u00e4gger st\u00f6rre delen av tiden och energin inte p\u00e5 att r\u00e4tta till, utan p\u00e5 att minimera.\u00a0<\/p>\n<h2>Automatiseringsteamet<\/h2>\n<p>\nJust nu har vi en personalstyrka p\u00e5 130 utvecklare, och vi forts\u00e4tter <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">v\u00e4xa<\/a><\/noindex>. Teamet f\u00f6r kontinuerlig integration och kodleverans (h\u00e4danefter kallat Deploy and Integration-teamet eller DI) best\u00e5r av 7 personer och arbetar i 2 riktningar: utveckling av automatiseringsplattformen Integro och DevOps.\u00a0<\/p>\n<p>DevOps ansvarar f\u00f6r Dev\/Beta-milj\u00f6erna f\u00f6r CIAN, integro-milj\u00f6erna och hj\u00e4lper utvecklare att l\u00f6sa problem och utveckla nya strategier f\u00f6r att skala milj\u00f6erna. Utvecklingsinriktningen f\u00f6r Integro arbetar b\u00e5de med sj\u00e4lva Integro och relaterade tj\u00e4nster, som exempelvis plugins f\u00f6r Jenkins, Jira och Confluence, samt utvecklar hj\u00e4lpprogram och applikationer f\u00f6r utvecklarteam.\u00a0<\/p>\n<p>DI-teamet arbetar tillsammans med plattformsteamet, som ansvarar f\u00f6r att utveckla arkitektur, bibliotek och utvecklingsmetoder inom f\u00f6retaget. Dessutom kan varje utvecklare inom CIAN bidra till automatisering, till exempel genom att skapa mikroautomatisering f\u00f6r teamets behov eller dela med sig av en bra id\u00e9 f\u00f6r hur automatiseringen kan f\u00f6rb\u00e4ttras.<\/p>\n<h2>T\u00e5rtperspektiv p\u00e5 automatisering i CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlla system som involveras i automatiseringen kan delas in i flera lager:<\/p>\n<ol>\n<li>Externa system (Jira, Bitbucket, etc.). Dessa anv\u00e4nds av utvecklarteam.\n<\/li>\n<li>Integro-plattformen. Oftast jobbar inte utvecklarna direkt med den, men det \u00e4r den som underst\u00f6der hela automatiseringen.\n<\/li>\n<li>Leveranstj\u00e4nster, orkestrering och uppt\u00e4ckning (till exempel Jenkins, Consul, Nomad). Med hj\u00e4lp av dessa implementerar vi koden p\u00e5 servrar och ser till att tj\u00e4nsterna fungerar tillsammans.\n<\/li>\n<li>Den fysiska niv\u00e5n (servrar, operativsystem, relaterad programvara). P\u00e5 denna niv\u00e5 k\u00f6rs v\u00e5r kod. Det kan vara b\u00e5de en fysisk server och en virtuell (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nUtifr\u00e5n detta koncept delar vi upp ansvarsomr\u00e5den inom DI-teamet. De tv\u00e5 f\u00f6rsta niv\u00e5erna faller under utvecklingsinriktningen f\u00f6r Integro, medan de tv\u00e5 sista niv\u00e5erna faller under DevOps-ansvaret. Denna uppdelning g\u00f6r det m\u00f6jligt att fokusera p\u00e5 uppgifter och st\u00f6r inte samarbetet, eftersom vi \u00e4r n\u00e4ra varandra och kontinuerligt delar kunskap och erfarenhet.<\/p>\n<h2>Integro<\/h2>\n<p>\nL\u00e5t oss fokusera p\u00e5 Integro och b\u00f6rja med teknologistacken:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (den gamla monoliten av Integro kvarst\u00e5r p\u00e5 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 (inb\u00e4ddad)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>Web UI: React (CSR) + MobX\n<\/li>\n<li>SSO: Keycloak\n<\/li>\n<\/ul>\n<p>\nVi f\u00f6ljer principen f\u00f6r mikrotj\u00e4nstutveckling, \u00e4ven om vi har en legacy i form av en monolitisk tidig version av Integro. Varje mikrotj\u00e4nst k\u00f6rs i sin egen Docker-container, och tj\u00e4nsterna kommunicerar med varandra via HTTP-f\u00f6rfr\u00e5gningar och RabbitMQ-meddelanden. Mikrotj\u00e4nsterna hittar varandra via Consul och g\u00f6r en f\u00f6rfr\u00e5gan till den, d\u00e4r de autentiserar via SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom ett verkligt exempel kan vi titta p\u00e5 interaktionen med Jenkins, som best\u00e5r av f\u00f6ljande steg:<\/p>\n<ol>\n<li>Mikrotj\u00e4nsten f\u00f6r workflow-hantering (h\u00e4danefter Flow-mikrotj\u00e4nsten) vill starta en byggprocess i Jenkins. F\u00f6r detta hittar den via Consul IP:PORT f\u00f6r mikrotj\u00e4nsten som integrerar med Jenkins (h\u00e4danefter Jenkins-mikrotj\u00e4nsten) och skickar en asynkron f\u00f6rfr\u00e5gan f\u00f6r att starta bygget i Jenkins.\n<\/li>\n<li>Jenkins-mikrotj\u00e4nsten, efter att ha mottagit f\u00f6rfr\u00e5gan, formar och returnerar ett Job ID, som senare kan anv\u00e4ndas f\u00f6r att identifiera resultatet av arbetet. Samtidigt startar den bygget i Jenkins via anrop av REST API.\n<\/li>\n<li>Jenkins genomf\u00f6r bygget och efter avslutandet skickar en webhook med resultatet av exekveringen till Jenkins-mikrotj\u00e4nsten.\n<\/li>\n<li>Jenkins-mikrotj\u00e4nsten, som mottar webhooken, formar ett meddelande om att behandlingen av f\u00f6rfr\u00e5gan \u00e4r klar och bifogar resultatet av exekveringen. Det formade meddelandet skickas till RabbitMQ-k\u00f6n.\n<\/li>\n<li>Genom RabbitMQ n\u00e5r det publicerade meddelandet Flow-mikrotj\u00e4nsten, som f\u00e5r veta resultatet av sin uppgiftsbehandling genom att matcha Job ID fr\u00e5n f\u00f6rfr\u00e5gan med det mottagna meddelandet.\n<\/li>\n<\/ol>\n<p>\nJust nu har vi runt 30 mikrotj\u00e4nster som kan delas upp i flera grupper:<\/p>\n<ol>\n<li>Konfigurationshantering.\n<\/li>\n<li>Informationsspridning och interaktion med anv\u00e4ndare (meddelandeapplikationer, e-post).\n<\/li>\n<li>Arbete med k\u00e4llkod.\n<\/li>\n<li>Integration med distributionsverktyg (Jenkins, Nomad, Consul etc.).\n<\/li>\n<li>\u00d6vervakning (avsl\u00e4pp, fel etc.).\n<\/li>\n<li>Webbverktyg (UI f\u00f6r att hantera testmilj\u00f6er, samla in statistik etc.).\n<\/li>\n<li>Integration med uppgiftssp\u00e5rare och liknande system.\n<\/li>\n<li>Hantering av workflow f\u00f6r olika uppgifter.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow f\u00f6r uppgift.<\/h2>\n<p>\nIntegro automatiserar \u00e5tg\u00e4rder relaterade till livscykeln f\u00f6r en uppgift. F\u00f6renklat definierar vi livscykeln f\u00f6r en uppgift som workflow i Jira. I v\u00e5ra utvecklingsprocesser finns det flera varianter av workflow beroende p\u00e5 projekt, uppgiftstyp och valda alternativ i den aktuella uppgiften.\u00a0<\/p>\n<p>L\u00e5t oss titta p\u00e5 det workflow som vi anv\u00e4nder oftast:<\/p>\n<p><img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI schemat visar kugghjulet att \u00f6verg\u00e5ngen triggas automatiskt av Integro, medan m\u00e4nsklig figuren indikerar att \u00f6verg\u00e5ngen triggas manuellt av en person. L\u00e5t oss titta p\u00e5 n\u00e5gra v\u00e4gar som uppgiften kan ta i denna arbetsfl\u00f6de.<\/p>\n<p>Helt manuell testning p\u00e5 DEV+BETA utan kanarietester (vi sl\u00e4pper vanligtvis monoliten s\u00e5 h\u00e4r):<\/p>\n<p><img decoding=\"async\" alt=\"Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet kan finnas andra kombinationer av \u00f6verg\u00e5ngar. Ibland kan v\u00e4gen som uppgiften tar v\u00e4ljas genom alternativ i Jira.<\/p>\n<h2>Uppgiftens r\u00f6relse<\/h2>\n<p>\nL\u00e5t oss titta p\u00e5 de viktigaste stegen som utf\u00f6rs n\u00e4r uppgiften r\u00f6r sig genom arbetsfl\u00f6det \"Testning p\u00e5 DEV + kanarietester\":<\/p>\n<p>1. Utvecklare eller PM skapar uppgiften.<\/p>\n<p>2. Utvecklaren tar uppgiften i arbete. Efter slutf\u00f6randet flyttar de den till statusen IN REVIEW.<\/p>\n<p>3. Jira skickar Webhook mot Jira-mikrotj\u00e4nsten (ansvarar f\u00f6r integrationen med Jira).<\/p>\n<p>4. Jira-mikrotj\u00e4nsten skickar en beg\u00e4ran till Flow-tj\u00e4nsten (ansvarar f\u00f6r interna arbetsfl\u00f6den d\u00e4r arbetet utf\u00f6rs) f\u00f6r att starta arbetsfl\u00f6det.<\/p>\n<p>5. Inom Flow-tj\u00e4nsten:<\/p>\n<ul>\n<li>Granskare tilldelas uppgiften (Users-mikrotj\u00e4nsten, som vet allt om anv\u00e4ndare + Jira-mikrotj\u00e4nsten).<\/li>\n<li>Genom Source-mikrotj\u00e4nsten (som k\u00e4nner till f\u00f6rr\u00e5d och grenar men inte arbetar med sj\u00e4lva koden) g\u00f6rs s\u00f6kningen av f\u00f6rr\u00e5d d\u00e4r det finns en gren f\u00f6r v\u00e5r uppgift (f\u00f6r att f\u00f6renkla s\u00f6kningen matchar grenens namn uppgiftsnumret i Jira). Vanligtvis har uppgiften bara en gren i ett f\u00f6rr\u00e5d, vilket f\u00f6renklar hanteringen av k\u00f6 f\u00f6r deploy och minskar kopplingen mellan f\u00f6rr\u00e5den.<\/li>\n<li>F\u00f6r varje hittad gren utf\u00f6rs f\u00f6ljande sekvens av \u00e5tg\u00e4rder:\n<p> i) Sl\u00e5 samman med master-grenen (Git-mikrotj\u00e4nst f\u00f6r att arbeta med koden).<br \/>\n ii) Grenen blockeras fr\u00e5n f\u00f6r\u00e4ndringar av utvecklaren (Bitbucket-mikrotj\u00e4nst).<br \/>\n iii) En Pull Request skapas f\u00f6r denna gren (Bitbucket-mikrotj\u00e4nst).<br \/>\n iv) Ett meddelande om den nya Pull Request skickas till utvecklarchattarna (Notify-mikrotj\u00e4nst f\u00f6r att arbeta med meddelanden).<br \/>\n v) Byggnationen, testningen och deployeringen av uppgiften p\u00e5 DEV startas (Jenkins-mikrotj\u00e4nst f\u00f6r att arbeta med Jenkins).<br \/>\n vi) Om alla tidigare punkter avslutas framg\u00e5ngsrikt, s\u00e4tter Integro sitt godk\u00e4nnande i Pull Request (Bitbucket-mikrotj\u00e4nst).<\/li>\n<li>Integro v\u00e4ntar p\u00e5 godk\u00e4nnande i Pull Request fr\u00e5n de tilldelade granskare.<\/li>\n<li>S\u00e5 snart alla n\u00f6dv\u00e4ndiga godk\u00e4nnanden har erh\u00e5llits (inklusive positiva resultat fr\u00e5n automatiserade tester), flyttar Integro uppgiften till statusen Test on Dev (Jira-mikrotj\u00e4nst).<\/li>\n<\/ul>\n<p>\n6. Testare utf\u00f6r tester av uppgiften. Om det inte finns n\u00e5gra problem, flyttas uppgiften till statusen Ready For Build.<\/p>\n<p>7. Integro \"ser\" att uppgiften \u00e4r redo f\u00f6r release och startar dess deployment i kanarietillst\u00e5nd (Jenkins-mikrotj\u00e4nst). Beredskapen f\u00f6r release best\u00e4ms av en upps\u00e4ttning regler. Till exempel, uppgiften \u00e4r i r\u00e4tt status, inga blockerande uppgifter finns, inga aktiva utrullningar av denna mikrotj\u00e4nst just nu, osv.<\/p>\n<p>8. Uppgiften flyttas till statusen Canary (Jira-mikrotj\u00e4nst).<\/p>\n<p>9. Jenkins startar deployment av uppgiften i kanarietillst\u00e5nd via Nomad (vanligtvis 1-3 instanser) och meddelar release-monitoreringstj\u00e4nsten (DeployWatch-mikrotj\u00e4nst) om utrullningen.<\/p>\n<p>10. DeployWatch-mikrotj\u00e4nst samlar in felbakgrund och reagerar p\u00e5 den om n\u00f6dv\u00e4ndigt. Om felbakgrunden \u00f6verskrids (normalt bakgrund ber\u00e4knas automatiskt) informeras utvecklarna genom Notify-mikrotj\u00e4nst. Om utvecklaren inte har reagerat inom 5 minuter (tryckt Revert eller Stay) startas en automatisk \u00e5terst\u00e4llning av kanarien instanser. Om bakgrunden inte \u00f6verskrids, m\u00e5ste utvecklaren manuellt starta deployment av uppgiften p\u00e5 Production (genom att trycka p\u00e5 knappen i UI). Om utvecklaren inte har startat deployment p\u00e5 Production inom 60 minuter, kommer kanarien instanser \u00e4ven av s\u00e4kerhetssk\u00e4l att tas bort.<\/p>\n<p>11. Efter att deployments har startats p\u00e5 Production:<\/p>\n<ul>\n<li>Uppgiften flyttas till statusen Production (Jira-mikrotj\u00e4nst).<\/li>\n<li>Jenkins-mikrotj\u00e4nst startar deploymentsprocessen och meddelar DeployWatch-mikrotj\u00e4nst om utrullningen.<\/li>\n<li>DeployWatch-mikrotj\u00e4nst kontrollerar att alla containrar p\u00e5 Production har uppdaterats (det har funnits fall d\u00e4r inte allt har uppdaterats).<\/li>\n<li>Genom Notify-mikrotj\u00e4nst skickas en avisering om resultaten av deployment p\u00e5 Production.<\/li>\n<\/ul>\n<p>\n12. Utvecklarna har 30 minuter p\u00e5 sig att initiera \u00e5terst\u00e4llning av uppgiften fr\u00e5n Production vid uppt\u00e4ckten av felaktigt beteende hos mikrotj\u00e4nsten. Efter denna tid kommer uppgiften automatiskt att sl\u00e5s samman i master (Git-mikrotj\u00e4nst).<\/p>\n<p>13. Efter en lyckad merge i master kommer uppgiftens status att \u00e4ndras till Closed (Jira-mikrotj\u00e4nst).<\/p>\n<p>Schemat p\u00e5st\u00e5r inte att vara helt\u00e4ckande (i verkligheten finns det fler steg), men det m\u00f6jligg\u00f6r en bed\u00f6mning av integrationsgraden i processerna. Vi anser inte att detta schema \u00e4r perfekt och f\u00f6rb\u00e4ttrar processerna f\u00f6r automatisk hantering av releaser och deployment.<\/p>\n<h2>Vad h\u00e4nder h\u00e4rn\u00e4st<\/h2>\n<p>\nVi har stora planer f\u00f6r att utveckla automatisering, som att \u00f6verge manuella operationer vid releaser av monoliter, f\u00f6rb\u00e4ttra \u00f6vervakningen vid automatisk distribution och f\u00f6rb\u00e4ttra samarbetet med utvecklarna.<\/p>\n<p>Men vi stannar h\u00e4r f\u00f6r nu. Vi har ber\u00f6rt m\u00e5nga \u00e4mnen i v\u00e5r \u00f6versikt \u00f6ver automatisering ytligt, och vissa har vi helt missat, s\u00e5 vi svarar g\u00e4rna p\u00e5 fr\u00e5gor. Vi ser fram emot f\u00f6rslag p\u00e5 vad vi ska belysa mer ing\u00e5ende, skriv g\u00e4rna i kommentarerna.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Fr\u00e5n skript till egen plattform: hur vi automatiserade utvecklingen p\u00e5 CIAN | ProHoster","description":"P\u00e5 RIT 2019.","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/55870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}