{"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\/da\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 RIT 2019 pr\u00e6senterede vores kollega Alexander Korotkov <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">en rapport<\/a><\/noindex> om automatisering af udvikling i CIAN: for at forenkle livet og arbejdet, bruger vi vores egen platform Integro. Den sporer livscyklussen for opgaver, fjerner rutineopgaver fra udviklerne og reducerer betydeligt antallet af fejl i produktionen. I dette indl\u00e6g vil vi supplere Alexanders rapport og fort\u00e6lle, hvordan vi gik fra simple scripts til integration af open source-produkter gennem vores egen platform, og hvad vores dedikerede automatiseringsteam arbejder med.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nulniveau<\/h2>\n<p>\n<i><b>\u00bbDer findes ikke noget nulniveau, jeg kender ikke til det\u00ab<\/b><br \/>\nMester Shifu fra animationsfilmen \u00abKung Fu Panda\u00bb<\/i><\/p>\n<p>Automatisering i CIAN begyndte 14 \u00e5r efter virksomhedens grundl\u00e6ggelse. P\u00e5 det tidspunkt var der 35 personer i udviklingsteamet. Det er sv\u00e6rt at tro, ikke? Selvf\u00f8lgelig eksisterede automatisering p\u00e5 en eller anden m\u00e5de, men et s\u00e6rskilt fokus p\u00e5 kontinuerlig integration og levering af kode begyndte f\u00f8rst at tage form i 2015.\u00a0<\/p>\n<p>P\u00e5 det tidspunkt havde vi en k\u00e6mpe monolit best\u00e5ende af Python, C# og PHP, der var implementeret p\u00e5 Linux-\/Windows-servere. For at deployere dette monster havde vi et s\u00e6t scripts, som vi k\u00f8rte manuelt. Der var ogs\u00e5 opbygningen af monolitten, som medf\u00f8rte smerte og lidelse p\u00e5 grund af konflikter ved sammensmeltning af grene, fejlrettelser og genopbygning med \u00bben anden samling opgaver i builden\u00ab. Forenklet s\u00e5 processen s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDette tilfredsstillede os ikke, og vi \u00f8nskede at skabe en gentagelig, automatiseret og kontrolleret proces for opbygning og deployment. Til dette havde vi brug for et CI\/CD-system, og vi overvejede mellem den gratis version af Teamcity og den gratis Jenkins, da vi allerede havde arbejdet med dem, og begge opfyldte vores funktionsm\u00e6ssige behov. Vi valgte Teamcity som et mere moderne produkt. P\u00e5 det tidspunkt brugte vi endnu ikke mikroservicearkitektur og forventede ikke et stort antal opgaver og projekter.<\/p>\n<h2>Vi n\u00e5r frem til ideen om vores eget system<\/h2>\n<p>\nImplementeringen af Teamcity fjernede kun en del af det manuelle arbejde: der var stadig behov for at oprette Pull Requests, fremme opgaver gennem statusser i Jira og v\u00e6lge opgaver til releaser. Dette var noget, Teamcity-systemet ikke kunne h\u00e5ndtere. Vi skulle v\u00e6lge vejen for yderligere automatisering. Vi overvejede at arbejde med scripts i Teamcity eller skifte til eksterne automatiseringssystemer. Men i sidste ende besluttede vi, at vi havde brug for den maksimale fleksibilitet, som kun en egen l\u00f8sning kan give. S\u00e5ledes opstod den f\u00f8rste version af vores interne automatiseringssystem kaldet Integro.<\/p>\n<p>Teamcity besk\u00e6ftiger sig med automatisering p\u00e5 niveauet til start af bygge- og deploy-processer, mens Integro fokuserede p\u00e5 overordnet automatisering af udviklingsprocesser. Det var n\u00f8dvendigt at kombinere arbejdet med opgaver i Jira med behandlingen af den relaterede kildekode i Bitbucket. P\u00e5 dette tidspunkt begyndte Integro at udvikle sine egne workflows til h\u00e5ndtering af opgaver af forskellige typer.\u00a0<\/p>\n<p>P\u00e5 grund af den stigende automatisering i forretningsprocesserne er antallet af projekter og runs i Teamcity steget. Her opstod et nyt problem: \u00e9n gratis instans af Teamcity var ikke l\u00e6ngere tilstr\u00e6kkelig (3 agenter og 100 projekter), vi tilf\u00f8jede endnu en instans (yderligere 3 agenter og 100 projekter), og derefter endnu en. I sidste ende endte vi med et system best\u00e5ende af flere klynger, som var sv\u00e6re at administrere:<\/p>\n<p><img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDa sp\u00f8rgsm\u00e5let om en fjerde instans opstod, inds\u00e5 vi, at det ikke kunne forts\u00e6tte s\u00e5dan, da de samlede omkostninger ved at underst\u00f8tte 4 instanser ikke l\u00e6ngere kunne forsvares. Der opstod sp\u00f8rgsm\u00e5let om at k\u00f8be en betalt version af Teamcity eller v\u00e6lge den gratis Jenkins. Vi lavede beregninger vedr\u00f8rende instanser og automatiseringsplaner og besluttede, at vi ville overg\u00e5 til Jenkins. Efter et par uger skiftede vi til Jenkins og slap for en del af hovedpinen i forbindelse med underst\u00f8ttelsen af flere instanser af Teamcity. P\u00e5 den m\u00e5de kunne vi fokusere p\u00e5 udviklingen af Integro og tilpasningen af Jenkins til vores behov.<\/p>\n<p>Med stigningen i grundl\u00e6ggende automatisering (i form af automatisk oprettelse af Pull Requests, indsamling og publicering af Code coverage og andre kontroller) opstod der et st\u00e6rkt \u00f8nske om at maksimere afgivelsen fra manuelle udgivelser og overlade dette arbejde til robotter. Derudover begyndte virksomheden at flytte til mikrotjenester, som kr\u00e6vede hyppige udgivelser, der blev udf\u00f8rt separat fra hinanden. P\u00e5 denne m\u00e5de kom vi gradvist til automatiserede udgivelser af vores mikrotjenester (monolitten udgiver vi stadig manuelt p\u00e5 grund af kompleksiteten i processen). Men som det ofte sker, opstod der en ny udfordring.\u00a0<\/p>\n<h2>Vi automatiserer testning<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 grund af automatiseringen af udgivelser er udviklingsprocesserne blevet hurtigere, delvist p\u00e5 bekostning af at springe nogle testfaser over. Dette har f\u00f8rt til midlertidigt tab af kvalitet. Det lyder banalt, men sammen med accelerationen af udgivelserne var det n\u00f8dvendigt ogs\u00e5 at \u00e6ndre produktudviklingsmetodologien. Vi skulle overveje automatisering af testning, indf\u00f8re personlig ansvarlighed (her taler vi om \"at tage ideen til sig\", ikke \u00f8konomiske b\u00f8der) for udviklerne for den kode, de udgiver, og fejlene i den, samt tage beslutning om udgivelse\/ikke udgivelse af opgaver gennem automatisk deployment.\u00a0<\/p>\n<p>Ved at l\u00f8se kvalitetsproblemerne kom vi til to vigtige beslutninger: vi begyndte at udf\u00f8re kanarietestning og implementerede automatisk overv\u00e5gning af baggrundsfejl med automatisk respons ved overskridelser. Den f\u00f8rste beslutning gjorde det muligt at finde \u00e5benlyse fejl, f\u00f8r koden reelt kom i produktion, mens den anden reducerede responstiden p\u00e5 problemer i produktion. Der opst\u00e5r selvf\u00f8lgelig fejl, men vi bruger det meste af tiden og ressourcerne ikke p\u00e5 at rette dem, men p\u00e5 at minimere dem.\u00a0<\/p>\n<h2>Automatiseringsteamet<\/h2>\n<p>\nVi har nu et team p\u00e5 130 udviklere, og vi forts\u00e6tter <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">med at vokse<\/a><\/noindex>. Teamet for kontinuerlig integration og levering af kode (herefter kaldet Deploy and Integration eller DI-teamet) best\u00e5r af 7 personer og arbejder inden for 2 omr\u00e5der: udvikling af automatiseringsplatformen Integro og DevOps.\u00a0<\/p>\n<p>DevOps er ansvarlig for Dev\/Beta-milj\u00f8er af CIAN-webstedet, Integro-milj\u00f8er, hj\u00e6lper udviklerne med at l\u00f8se problemer og udvikler nye tilgange til skalering af milj\u00f8er. Integro udviklingsretning arbejder b\u00e5de med Integro selv og med tilknyttede tjenester, s\u00e5som plugins til Jenkins, Jira, Confluence, og udvikler ogs\u00e5 nyttige v\u00e6rkt\u00f8jer og applikationer til udviklerteams.\u00a0<\/p>\n<p>DI-teamet arbejder sammen med Platform-teamet, der er ansvarlig for udviklingen af arkitektur, biblioteker og udviklingstilgange inden for virksomheden. Derudover kan enhver udvikler inden for CIAN bidrage til automatiseringen, for eksempel ved at lave mikroautomatisering til teamets behov eller dele et godt id\u00e9 om, hvordan man kan g\u00f8re automatiseringen endnu bedre.<\/p>\n<h2>Lagkage af automatisering i CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlle systemer involveret i automatiseringen kan opdeles i flere lag:<\/p>\n<ol>\n<li>Eksterne systemer (Jira, Bitbucket osv.). Disse bruges af udviklerteamene.\n<\/li>\n<li>Integro-platformen. Oftest arbejder udviklerne ikke direkte med den, men det er den, der underst\u00f8tter hele automatiseringen.\n<\/li>\n<li>Leveringstjenester, orkestrering og opdagelse (for eksempel Jenkins, Consul, Nomad). Ved hj\u00e6lp af dem implementerer vi kode p\u00e5 serverne og sikrer, at tjenesterne fungerer sammen.\n<\/li>\n<li>Det fysiske niveau (servere, OS, ledsagende software). P\u00e5 dette niveau k\u00f8rer vores kode. Det kan v\u00e6re b\u00e5de en fysisk server og en virtuel (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nBaseret p\u00e5 dette koncept deler vi ansvarsomr\u00e5derne inden for DI-teamet. De to f\u00f8rste lag falder ind under Integro udviklingsretning, mens de to sidste lag er under DevOps. Denne opdeling muligg\u00f8r fokus p\u00e5 opgaver og forstyrrer ikke samarbejdet, da vi er t\u00e6t p\u00e5 hinanden og konstant deler viden og erfaring.<\/p>\n<h2>Integro<\/h2>\n<p>\nLad os fokusere p\u00e5 Integro og starte med teknologistakken:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (den gamle monolit Integro forbliver 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 (indlejret)\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\u00f8lger princippet om mikrotjenesteudvikling, selvom vi stadig har legacy i form af monoliten fra den tidlige version af Integro. Hver mikrotjeneste k\u00f8rer i sin egen Docker-container, og tjenesterne kommunikere med hinanden via HTTP-anmodninger og RabbitMQ-beskeder. Mikrotjenesterne finder hinanden gennem Consul og sender foresp\u00f8rgsler til det, idet de autoriserer via SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom et konkret eksempel vil vi overveje interaktionen med Jenkins, som best\u00e5r af f\u00f8lgende trin:<\/p>\n<ol>\n<li>Workflow-mikrotjenesten \u00f8nsker at starte en bygning i Jenkins. For at g\u00f8re dette finder den via Consul IP:PORT for mikrotjenesten, der integrerer med Jenkins (Jenkins-mikrotjenesten), og sender en asynkron foresp\u00f8rgsel til den for at starte bygningen i Jenkins.\n<\/li>\n<li>Jenkins-mikrotjenesten, efter at have modtaget anmodningen, genererer og returnerer et Job ID, som senere kan bruges til at identificere resultatet af arbejdet. Samtidig starter den bygningen i Jenkins via REST API-opkaldet.\n<\/li>\n<li>Jenkins udf\u00f8rer bygningen, og efter dens afslutning sender den en webhook med resultaterne af udf\u00f8relsen til Jenkins-mikrotjenesten.\n<\/li>\n<li>Jenkins-mikrotjenesten, efter at have modtaget webhooken, genererer en meddelelse om afslutningen af behandlingen af anmodningen og vedh\u00e6fter resultaterne af udf\u00f8relsen. Den genererede meddelelse sendes til RabbitMQ-k\u00f8en.\n<\/li>\n<li>Gennem RabbitMQ n\u00e5r den publicerede meddelelse Flow-mikrotjenesten, som f\u00e5r kendskab til resultatet af behandlingen af sin opgave ved at sammenligne Job ID fra anmodningen og den modtagne meddelelse.\n<\/li>\n<\/ol>\n<p>\nI \u00f8jeblikket har vi omkring 30 mikrotjenester, som kan opdeles i flere grupper:<\/p>\n<ol>\n<li>H\u00e5ndtering af konfigurationer.\n<\/li>\n<li>Informering og interaktion med brugere (messenger, email).\n<\/li>\n<li>Arbejdet med kildekoden.\n<\/li>\n<li>Integration med deploy-v\u00e6rkt\u00f8jer (Jenkins, Nomad, Consul osv.).\n<\/li>\n<li>Overv\u00e5gning (af udgivelser, fejl osv.).\n<\/li>\n<li>Web-nyttigheder (UI til styring af testmilj\u00f8er, indsamling af statistik osv.).\n<\/li>\n<li>Integration med opgavestyringssystemer og lignende.\n<\/li>\n<li>Styring af workflow for forskellige opgaver.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Opgave workflow<\/h2>\n<p>\nIntegro automatiserer handlinger relateret til livscyklussen for en opgave. Forenklet, under livscyklussen for en opgave, forst\u00e5r vi workflow for opgaven i Jira. I vores udviklingsprocesser er der flere varianter af workflow afh\u00e6ngigt af projektet, opgavetype og de valgmuligheder, der er valgt i den specifikke opgave.\u00a0<\/p>\n<p>Lad os overveje det workflow, vi bruger oftest:<\/p>\n<p><img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI diagrammet peger gearhjulet p\u00e5, at overgangen (transition) kaldes automatisk af Integro, mens figuren af en person betyder, at overgangen kaldes manuelt af en person. Lad os se p\u00e5 nogle m\u00e5der, hvorp\u00e5 opgaven kan bev\u00e6ge sig gennem dette workflow.<\/p>\n<p>Fuldst\u00e6ndig manuel testning p\u00e5 DEV+BETA uden kanarietests (som vi normalt udgiver monoliter):<\/p>\n<p><img decoding=\"async\" alt=\"Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer kan v\u00e6re andre kombinationer af transitioner. Nogle gange kan vejen, som opgaven tager, v\u00e6lges gennem muligheder i Jira.<\/p>\n<h2>Opgavens bev\u00e6gelse<\/h2>\n<p>\nLad os se p\u00e5 de grundl\u00e6ggende trin, der udf\u00f8res, n\u00e5r opgaven bev\u00e6ger sig gennem workflow \"Test p\u00e5 DEV + kanarietests\":<\/p>\n<p>1. Udvikleren eller PM opretter en opgave.<\/p>\n<p>2. Udvikleren tager opgaven i arbejde. Efter afslutningen flytter han den til status IN REVIEW.<\/p>\n<p>3. Jira sender en Webhook til Jira-mikrotjenesten (som er ansvarlig for integrationen med Jira).<\/p>\n<p>4. Jira-mikrotjenesten sender en foresp\u00f8rgsel til Flow-tjenesten (som er ansvarlig for interne workflows, hvor arbejdet udf\u00f8res) for at starte workflowet.<\/p>\n<p>5. Inden i Flow-tjenesten:<\/p>\n<ul>\n<li>Anmeldere s\u00e6ttes til opgaven (Users-mikrotjenesten, som kender alt om brugerne + Jira-mikrotjenesten).<\/li>\n<li>Gennem Source-mikrotjenesten (som kender til repositoryer og grene, men ikke arbejder med selve koden) udf\u00f8res s\u00f8gningen efter repositoryer, hvor der er en gren for vores opgave (for at forenkle s\u00f8gningen, matcher grenens navn opgavens nummer i Jira). Oftest har opgaven kun \u00e9n gren i \u00e9t repository, hvilket forenkler k\u00f8styringen ved deployment og reducerer sammenh\u00e6ngen mellem repositoryerne.<\/li>\n<li>For hver fundet gren udf\u00f8res f\u00f8lgende r\u00e6kkef\u00f8lge af handlinger:\n<p> i) Sammenfletning med master-grenen (Git-mikrotjenesten til arbejde med kode).<br \/>\n ii) Grenen sp\u00e6rrer for \u00e6ndringer fra udvikleren (Bitbucket-mikrotjenesten).<br \/>\n iii) Der oprettes en Pull Request til denne gren (Bitbucket-mikrotjenesten).<br \/>\n iv) Der sendes en meddelelse om den nye Pull Request til udviklernes chats (Notify-mikrotjenesten til at h\u00e5ndtere underretninger).<br \/>\n v) Bygning, testning og deployment af opgaven p\u00e5 DEV startes (Jenkins-mikrotjenesten til arbejde med Jenkins).<br \/>\n vi) Hvis alle de foreg\u00e5ende punkter er afsluttet med succes, s\u00e6tter Integro sin godkendelse i Pull Request (Bitbucket-mikrotjenesten).<\/li>\n<li>Integro venter p\u00e5 godkendelse i Pull Request fra de udpegede anmeldere.<\/li>\n<li>N\u00e5r alle n\u00f8dvendige godkendelser er modtaget (inklusive positively best\u00e5ede automatiserede tests), flytter Integro opgaven til status Test on Dev (Jira-mikrotjenesten).<\/li>\n<\/ul>\n<p>\n6. Testere udf\u00f8rer test af opgaven. Hvis der ikke er problemer, overf\u00f8rer de opgaven til status Ready For Build.<\/p>\n<p>7. Integro \"ser\", at opgaven er klar til udgivelse, og starter dens deployment i kanarytilstand (Jenkins-mikrotjeneste). Udgivelsesparathed bestemmes af et s\u00e6t regler. For eksempel, opgaven er i den n\u00f8dvendige status, der er ingen blokeringer p\u00e5 andre opgaver, der er ingen aktive udrulninger af denne mikrotjeneste osv.<\/p>\n<p>8. Opgaven overf\u00f8res til status Canary (Jira-mikrotjeneste).<\/p>\n<p>9. Jenkins starter deployment af opgaven i kanarytilstand gennem Nomad (normalt 1-3 instanser) og underretter udrulningsmonitoreringstjenesten (DeployWatch-mikrotjeneste) om udrulningen.<\/p>\n<p>10. DeployWatch-mikrotjeneste indsamler fejlbaggrund og reagerer p\u00e5 den, hvis det er n\u00f8dvendigt. Ved overskridelse af fejlbaggrunden (normal baggrund beregnes automatisk) underrettes udviklerne gennem Notify-mikrotjeneste. Hvis udvikleren ikke reagerer inden for 5 minutter (trykker Revert eller Stay), starter den automatiske tilbagerulning af kanaryinstanserne. Hvis baggrunden ikke er overskredet, skal udvikleren manuelt starte deployment af opgaven til Production (ved at trykke p\u00e5 knappen i UI). Hvis udvikleren ikke har startet deployment til Production inden for 60 minutter, vil kanaryinstanserne ogs\u00e5 blive rullet tilbage af sikkerhedsm\u00e6ssige \u00e5rsager.<\/p>\n<p>11. Efter start af deployment til Production:<\/p>\n<ul>\n<li>Opgaven overf\u00f8res til status Production (Jira-mikrotjeneste).<\/li>\n<li>Jenkins-mikrotjeneste starter deploymentprocessen og underretter DeployWatch-mikrotjeneste om udrulningen.<\/li>\n<li>DeployWatch-mikrotjeneste tjekker, om alle containere p\u00e5 Production er blevet opdateret (der har v\u00e6ret tilf\u00e6lde, hvor ikke alt blev opdateret).<\/li>\n<li>Der sendes en meddelelse om resultaterne af deploymenten til Production via Notify-mikrotjeneste.<\/li>\n<\/ul>\n<p>\n12. Udviklerne har 30 minutter til at starte tilbagerulning af opgaven fra Production i tilf\u00e6lde af, at der opdages ukorrekt adf\u00e6rd fra mikrotjenesten. Efter denne tidsperiode vil opgaven automatisk blive flettet ind i master (Git-mikrotjeneste).<\/p>\n<p>13. Efter en vellykket sammenfletning i master vil opgavens status blive \u00e6ndret til Closed (Jira-mikrotjeneste).<\/p>\n<p>Skemaet g\u00f8r ikke krav p\u00e5 fuldst\u00e6ndig detaljeringsgrad (i virkeligheden er der flere trin), men giver mulighed for at vurdere graden af integration i processerne. Vi anser ikke dette skema for ideelt og forbedrer processerne for automatisk support af udgivelser og deployment.<\/p>\n<h2>vil v\u00e6re udsolgt<\/h2>\n<p>\nVi har store planer for udvikling af automatisering, s\u00e5som at opgive manuelle operationer ved udgivelser af monolitter, forbedre overv\u00e5gningen ved automatisk deployment og forbedre samarbejdet med udviklerne.<\/p>\n<p>Men vi stopper her for nu. Vi har ber\u00f8rt mange emner i vores oversigt over automatisering overfladisk, og nogle har slet ikke v\u00e6ret n\u00e6vnt, s\u00e5 vi svarer gerne p\u00e5 sp\u00f8rgsm\u00e5l. Vi ser frem til forslag til, hvad vi skal d\u00e6kke i detaljer, s\u00e5 skriv i kommentarerne.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Fra scripts til egen platform: hvordan vi automatiserede udviklingen i CIAN | ProHoster","description":"P\u00e5 RIT 2019.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/55870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}