Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Um RIT 2019 huet eise Kolleg Alexander Korotkov gemaach de Bericht iwwer d'Automatiséierung vun der Entwécklung am CIAN: fir d'Liewen an d'Aarbecht ze vereinfachen, benotze mir eis eegen Integro Plattform. Et verfollegt de Liewenszyklus vun Aufgaben, entléisst Entwéckler vu Routine Operatiounen a reduzéiert d'Zuel vu Bugs an der Produktioun wesentlech. An dësem Post wäerte mir dem Alexander säi Bericht ergänzen an Iech soen wéi mir vun einfache Scripte gaange sinn fir Open Source Produkter duerch eis eege Plattform ze kombinéieren a wat eis separat Automatisatiounsteam mécht.
 

Null Niveau

"Et gëtt net sou eppes wéi en Nullniveau, ech weess net sou eppes"
Master Shifu aus dem Film "Kung Fu Panda"

D'Automatisatioun am CIAN huet 14 Joer no der Grënnung vun der Firma ugefaang. Zu där Zäit hat d'Entwécklungsteam 35 Leit. Schwéier ze gleewen, richteg? Natierlech huet d'Automatisatioun an iergendenger Form existéiert, awer eng separat Richtung fir kontinuéierlech Integratioun a Code Liwwerung huet ugefaang am Joer 2015 Form ze huelen. 

Zu där Zäit hate mir e grousse Monolith vu Python, C # a PHP, op Linux / Windows Serveren ofgesat. Fir dëst Monster z'installéieren, hu mir e Set vu Scripten déi mir manuell lafen. Et war och d'Versammlung vum Monolith, deen Péng a Leed wéinst Konflikter bruecht huet beim Fusioun vu Branchen, Korrigéiere vu Mängel a Rekonstruktioun "mat enger anerer Set vun Aufgaben am Bau." E vereinfachte Prozess huet esou ausgesinn:

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Mir waren net zefridden mat dësem, a mir wollten e widderhuelenden, automatiséierten a handhabbare Bau- an Deploymentprozess bauen. Fir dëst hu mir e CI / CD System gebraucht, a mir hunn tëscht der gratis Versioun vun Teamcity an der gratis Versioun vum Jenkins gewielt, well mir mat hinnen geschafft hunn a béid eis wat d'Set vu Funktiounen ugepasst hunn. Mir hunn Teamcity als méi rezent Produkt gewielt. Zu där Zäit hu mir nach keng Mikroservicearchitektur benotzt an hunn net eng grouss Zuel vun Aufgaben a Projeten erwaart.

Mir kommen op d'Iddi vun eisem eegene System

D'Ëmsetzung vun Teamcity huet nëmmen en Deel vun der manueller Aarbecht ewechgeholl: wat bleift ass d'Schafung vu Pull Requests, Promotioun vun Themen no Status an Jira, a Selektioun vun Themen fir d'Verëffentlechung. De System vun Teamcity konnt dëst net méi ausgoen. Et war néideg de Wee vun der weiderer Automatisatioun ze wielen. Mir betruecht Optiounen fir mat Scripten an Teamcity ze schaffen oder op Drëtt-Partei Automatisatiounssystemer ze wiesselen. Mä um Enn hu mir décidéiert, datt mir maximal Flexibilitéit brauche, déi nëmmen eis eege Léisung ubidden. Dëst ass wéi déi éischt Versioun vum internen Automatisatiounssystem mam Numm Integro erschéngt.

Teamcity beschäftegt sech mat Automatisatioun um Niveau vum Start vun de Bau- an Deploymentprozesser, während Integro sech op Top-Level Automatiséierung vun Entwécklungsprozesser konzentréiert. Et war néideg fir d'Aarbecht mat Themen an Jira mat der Veraarbechtung vum assoziéierten Quellcode am Bitbucket ze kombinéieren. Op dëser Etapp huet Integro ugefaang seng eege Workflows ze hunn fir mat Aufgaben vu verschiddenen Typen ze schaffen. 

Wéinst der Erhéijung vun der Automatisatioun an de Geschäftsprozesser ass d'Zuel vu Projeten a Runen an Teamcity eropgaang. Also koum en neie Problem: eng gratis Teamcity Instanz war net genuch (3 Agenten an 100 Projeten), mir hunn eng aner Instanz bäigefüügt (3 méi Agenten an 100 Projeten), dann eng aner. Als Resultat hu mir e System vu verschiddene Cluster opgehalen, wat schwéier ze verwalten war:

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Wéi d'Fro vun enger 4. Instanz gestallt gouf, hu mir gemierkt, datt mir net esou weider kënne liewen, well d'Gesamtkäschte fir 4 Instanz ze ënnerstëtzen net méi a Grenzen leien. D'Fro ass opgestan iwwer bezuelte Teamcity ze kafen oder gratis Jenkins ze wielen. Mir hunn Berechnungen iwwer Instanzen an Automatisatiounspläng gemaach an decidéiert datt mir op Jenkins liewen. No e puer Wochen hu mir op Jenkins gewiesselt an e puer vun de Kappwéi eliminéiert, déi mat der Erhalen vu verschidde Teamcity Instanzen verbonne sinn. Dofir konnte mir eis fokusséieren op Integro z'entwéckelen an Jenkins fir eis selwer ze personaliséieren.

Mat dem Wuesstum vun der Basisautomatiséierung (a Form vun der automatescher Schafung vu Pull Requests, Sammlung a Verëffentlechung vu Codedeckung an aner Kontrollen), gëtt et e staarke Wonsch fir manuell Verëffentlechungen sou vill wéi méiglech opzeginn an dës Aarbecht un Roboteren ze ginn. Zousätzlech huet d'Firma ugefaang op Mikroservicer bannent der Firma ze plënneren, déi heefeg Verëffentlechungen erfuerderen, a separat vuneneen. Dëst ass wéi mir lues a lues op automatesch Verëffentlechunge vun eise Mikroservicer komm sinn (mir verëffentlechen de Moment de Monolith manuell wéinst der Komplexitéit vum Prozess). Awer, wéi normalerweis geschitt, ass eng nei Komplexitéit entstanen. 

Mir automatiséieren Testen

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Wéinst der Automatiséierung vu Verëffentlechungen hunn d'Entwécklungsprozesser beschleunegt, deelweis wéinst dem Iwwersprangen vun e puer Teststadien. An dëst huet zu engem temporäre Qualitéitsverloscht gefouert. Et kléngt trivial, awer zesumme mat der Beschleunegung vu Verëffentlechungen war et néideg fir d'Produktentwécklungsmethodologie z'änneren. Et war néideg iwwer d'Automatiséierung vum Test ze denken, d'perséinlech Verantwortung z'installéieren (hei schwätze mir iwwer "d'Iddi am Kapp akzeptéieren", net monetär Geldstrofen) vum Entwéckler fir de verëffentlechte Code a Käferen dran, wéi och d'Entscheedung fir Fräisetzung / net fräiginn eng Aufgab duerch automatesch Détachement. 

D'Eliminatioun vun Qualitéitsproblemer, hu mir op zwou wichteg Entscheedungen komm: mir hunn ugefaang Kanaresch Tester ze maachen an hunn automatesch Iwwerwaachung vum Feelerhannergrond mat enger automatescher Äntwert op seng Iwwerschoss agefouert. Déi éischt Léisung huet et méiglech offensichtlech Feeler ze fannen ier de Code komplett an d'Produktioun verëffentlecht gouf, déi zweet reduzéiert d'Äntwertzäit op Probleemer an der Produktioun. Feeler geschéien natierlech, awer mir verbréngen déi meescht vun eiser Zäit an Effort net fir se ze korrigéieren, mee fir se ze minimiséieren. 

Team Automation

Mir hunn am Moment e Personal vun 130 Entwéckler, a mir weider wuessen. Déi kontinuéierlech Integratioun a Code Liwwerung Team (nodréiglech als Deploy and Integration oder DI Team bezeechent) besteet aus 7 Leit a schafft an 2 Richtungen: Entwécklung vun der Integro Automatisatiounsplattform an DevOps. 

DevOps ass verantwortlech fir den Dev / Beta Ëmfeld vum CIAN Site, dem Integro Ëmfeld, hëlleft Entwéckler Probleemer ze léisen an entwéckelt nei Approche fir Skaléierungsëmfeld. D'Integro Entwécklungsrichtung beschäftegt sech mat Integro selwer a verbonne Servicer, zum Beispill Plugins fir Jenkins, Jira, Confluence, an entwéckelt och Hëllefs-Utilities an Uwendungen fir Entwécklungsteams. 

D'DI Team schafft kollaborativ mat der Plattform Team, déi d'Architektur, d'Bibliothéiken an d'Entwécklung Approche intern entwéckelt. Zur selwechter Zäit kann all Entwéckler bannent CIAN zur Automatiséierung bäidroen, zum Beispill, Mikroautomatiséierung maachen fir d'Bedierfnesser vum Team ze passen oder eng cool Iddi ze deelen wéi d'Automatisatioun nach besser ze maachen.

Layer Kuch vun Automatisatioun um CIAN

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

All Systemer, déi an der Automatioun involvéiert sinn, kënnen an e puer Schichten opgedeelt ginn:

  1. Extern Systemer (Jira, Bitbucket, etc.). Entwécklungsteams schaffen mat hinnen.
  2. Integro Plattform. Déi meescht Oft schaffen d'Entwéckler net direkt domat, awer et ass dat wat all Automatiséierung leeft.
  3. Liwwerung, Orchestratioun an Entdeckung Servicer (Zum Beispill, Jeknins, Consul, Nomad). Mat hirer Hëllef deployéiere mir Code op Serveren a suergen datt Servicer matenee schaffen.
  4. Kierperlech Schicht (Server, OS, verbonne Software). Eise Code funktionnéiert op dësem Niveau. Dëst kann entweder e kierperleche Server oder e virtuelle sinn (LXC, KVM, Docker).

Baséierend op dësem Konzept verdeele mir Verantwortungsberäicher am DI Team. Déi éischt zwee Niveaue sinn am Beräich vun der Verantwortung vun der Integro Entwécklungsrichtung, an déi lescht zwee Niveaue si schonn am Beräich vun der Verantwortung vun DevOps. Dës Trennung erlaabt eis op Aufgaben ze fokusséieren a stéiert net mat der Interaktioun, well mir no beienee sinn a stänneg Wëssen an Erfahrung austauschen.

Intakt

Loosst eis op Integro fokusséieren a mam Technologiestack ufänken:

  • CentOS 7
  • Docker + Nomad + Consul + Vault
  • Java 11 (den alen Integro Monolith bleift op Java 8)
  • Fréijoer Boot 2.X + Fréijoer Cloud Config
  • PostgreSql 11
  • Kanéngchen MQ 
  • Apache Ignite
  • Camunda (Embedded)
  • Grafana + Graphite + Prometheus + Jaeger + ELK
  • Web UI: React (CSR) + MobX
  • SSO: Keycloak

Mir halen de Prinzip vun der Mikroservice Entwécklung, obwuel mir Legacy an der Form vun engem Monolith vun enger fréier Versioun vum Integro hunn. All Mikroservice leeft an engem eegenen Docker Container, an d'Servicer kommunizéieren mateneen iwwer HTTP-Ufroen a RabbitMQ Messagen. Mikroservicer fanne sech duerch de Consul a maachen eng Ufro un, andeems d'Autorisatioun duerch SSO (Keycloak, OAuth 2 / OpenID Connect) passéiert.

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Als richtegt Beispill, betruecht d'Interaktioun mam Jenkins, deen aus de folgende Schrëtt besteet:

  1. De Workflow Management Mikroservice (nodréiglech de Flow Microservice bezeechent) wëll e Build am Jenkins lafen. Fir dëst ze maachen, benotzt hien de Consul fir den IP: PORT vum Mikroservice fir d'Integratioun mat Jenkins ze fannen (nodréiglech als Jenkins Microservice bezeechent) a schéckt eng asynchron Ufro un et fir de Bau an Jenkins unzefänken.
  2. Nodeems Dir eng Ufro kritt hutt, generéiert de Jenkins Mikroservice a reagéiert mat enger Job ID, déi dann benotzt ka ginn fir d'Resultat vun der Aarbecht z'identifizéieren. Zur selwechter Zäit ausléist et de Bau an Jenkins iwwer e REST API Uruff.
  3. De Jenkins mécht de Bau aus a schéckt no der Fäerdegstellung e Webhook mat den Ausféierungsresultater un de Jenkins Mikroservice.
  4. De Jenkins Mikroservice, deen de Webhook kritt huet, generéiert e Message iwwer d'Fäerdegstellung vun der Ufroveraarbechtung an befestegt d'Ausféierungsresultater. De generéierte Message gëtt an d'RabbitMQ Schlaang geschéckt.
  5. Duerch RabbitMQ erreecht de publizéierte Message de Flow-Mikroservice, deen iwwer d'Resultat vun der Veraarbechtung vun hirer Aufgab léiert andeems d'Job ID vun der Ufro an der kritt Message passt.

Elo hu mir ongeféier 30 Mikroservicer, déi an e puer Gruppen opgedeelt kënne ginn:

  1. Configuratioun Gestioun.
  2. Informatioun an Interaktioun mat Benotzer (Messenger, Mail).
  3. Schafft mat Quellcode.
  4. Integratioun mat Deployment Tools (Jenkins, Nomad, Konsul, etc.).
  5. Iwwerwaachung (Verëffentlechungen, Feeler, etc.).
  6. Web Utilities (UI fir Testëmfeld ze managen, Statistiken ze sammelen, asw.).
  7. Integratioun mat Task Tracker an ähnleche Systemer.
  8. Workflow Management fir verschidden Aufgaben.

Workflow Aufgaben

Integro automatiséiert Aktivitéiten am Zesummenhang mam Aufgabeliewenszyklus. A vereinfachte Begrëffer gëtt de Liewenszyklus vun enger Aufgab als Workflow vun enger Aufgab am Jira verstane. Eis Entwécklungsprozesser hu verschidde Workflow Variatiounen ofhängeg vum Projet, der Aart vun der Aufgab an den Optiounen, déi an enger bestëmmter Aufgab ausgewielt ginn. 

Loosst eis de Workflow kucken, dee mir am meeschten benotzen:

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Am Diagramm weist d'Ausrüstung un datt den Iwwergang automatesch vun Integro genannt gëtt, während d'mënschlech Figur weist datt den Iwwergang manuell vun enger Persoun genannt gëtt. Loosst eis e puer Weeër kucken, déi eng Aufgab an dësem Workflow kann huelen.

Komplett manuell Testen op DEV + BETA ouni Kanaresch Tester (normalerweis ass dëst wéi mir e Monolith erausginn):

Vun Scripten op eis eege Plattform: wéi mir d'Entwécklung am CIAN automatiséiert hunn

Et kann aner Iwwergangs Kombinatioune ginn. Heiansdo kann de Wee deen en Thema wäert huelen duerch Optiounen am Jira ausgewielt ginn.

Aufgab Bewegung

Loosst eis d'Haaptschrëtt kucken, déi ausgefouert ginn wann eng Aufgab duerch den "DEV Testing + Canary Tests" Workflow beweegt:

1. Den Entwéckler oder PM kreéiert d'Aufgab.

2. Den Entwéckler hëlt d'Aufgab fir ze schaffen. Nom Fäerdegstellung wiesselt et op IN REVIEW Status.

3. Jira schéckt e Webhook un de Jira Mikroservice (verantwortlech fir d'Integratioun mat Jira).

4. De Jira Mikroservice schéckt eng Ufro un de Flow Service (verantwortlech fir intern Workflows an deenen d'Aarbecht gemaach gëtt) fir de Workflow ze starten.

5. Bannen am Flow Service:

  • Rezensoren ginn op d'Aufgab zougewisen (Benotzer Mikroservice déi alles iwwer Benotzer weess + Jira Mikroservice).
  • Duerch de Source-Mikroservice (et weess iwwer Repositories a Filialen, awer funktionnéiert net mam Code selwer), gëtt eng Sich no Repositories gemaach, déi eng Filial vun eisem Thema enthalen (fir d'Sich ze vereinfachen, den Numm vun der Branche entsprécht dem Thema Zuel an Jira). Meeschtens huet eng Aufgab nëmmen eng Branche an engem Repository; dëst vereinfacht d'Gestioun vun der Deployment Queue a reduzéiert d'Konnektivitéit tëscht Repositories.
  • Fir all fonnt Branche gëtt déi folgend Sequenz vun Aktiounen ausgefouert:

    i) D'Meeschtesch Branche aktualiséieren (Git Microservice fir mam Code ze schaffen).
    ii) D'Branche ass blockéiert vun Ännerungen vum Entwéckler (Bitbucket Microservice).
    iii) Eng Pull Request gëtt fir dës Branche erstallt (Bitbucket Microservice).
    iv) E Message iwwer eng nei Pull Request gëtt un Entwéckler Chats geschéckt (Notify Microservice fir mat Notifikatiounen ze schaffen).
    v) Build, Test an Deploy Aufgaben ginn op DEV gestart (Jenkins Mikroservice fir mat Jenkins ze schaffen).
    vi) Wann all virdrun Schrëtt erfollegräich ofgeschloss sinn, da setzt Integro seng Genehmegung an der Pull Request (Bitbucket Microservice).

  • Integro waart op Approve in Pull Request vun designéierte Rezensiounen.
  • Soubal all néideg Genehmegunge kritt goufen (inklusiv automatiséiert Tester si positiv passéiert), iwwerdréit Integro d'Aufgab op Test op Dev (Jira Microservice) Status.

6. Tester Test der Aufgab. Wann et keng Problemer gëtt, da gëtt d'Aufgab op de Status Ready For Build transferéiert.

7. Integro "gesinn" datt d'Aufgab prett ass fir d'Verëffentlechung a fänkt seng Deployment am Kanaresch Modus un (Jenkins Microservice). D'Bereetschaft fir d'Verëffentlechung gëtt vun enger Rei vu Reegele festgeluegt. Zum Beispill ass d'Aufgab am erfuerderleche Status, et gi keng Spären op aner Aufgaben, et gi momentan keng aktive Eropluede vun dësem Mikroservice, etc.

8. D'Aufgab gëtt op Kanaresch Status transferéiert (Jira microservice).

9. Jenkins lancéiert eng Détachement Aufgab duerch Nomad am Kanaresch Modus (normalerweis 1-3 Instanzen) an informéiert de Verëffentlechungsiwwerwaachungsservice (DeployWatch Microservice) iwwer d'Deployment.

10. Den DeployWatch Mikroservice sammelt de Feelerhannergrond a reagéiert drop, wann néideg. Wann de Feelerhannergrond iwwerschratt ass (d'Hannergrondnorm gëtt automatesch berechent), ginn d'Entwéckler iwwer den Notify Mikroservice informéiert. Wann no 5 Minutten den Entwéckler net geäntwert huet (geklickt op Revert or Stay), da gëtt eng automatesch Rollback vun de Kanaresch Instanzen gestart. Wann den Hannergrond net iwwerschratt ass, da muss den Entwéckler d'Task-Deployment manuell op d'Produktioun lancéieren (andeems Dir op e Knäppchen an der UI klickt). Wann den Entwéckler den Détachement net an d'Produktioun bannent 60 Minutten lancéiert huet, da ginn d'Kanaresch Instanzen och aus Sécherheetsgrënn zréckgezunn.

11. Nom Start vun der Deployment op d'Produktioun:

  • D'Aufgab gëtt op d'Produktiounsstatus transferéiert (Jira Microservice).
  • De Jenkins Mikroservice fänkt den Deploymentprozess un an informéiert den DeployWatch Mikroservice iwwer d'Deployment.
  • Den DeployWatch Mikroservice kontrolléiert datt all Container op der Produktioun aktualiséiert goufen (et waren Fäll wou net all aktualiséiert goufen).
  • Duerch den Notify Mikroservice gëtt eng Notifikatioun iwwer d'Resultater vun der Deployment un d'Produktioun geschéckt.

12. D'Entwéckler hunn 30 Minutte fir eng Aufgab vun der Produktioun zréckzebréngen wann falsch Mikroserviceverhalen festgestallt gëtt. No dëser Zäit gëtt d'Aufgab automatesch a Master (Git Microservice) fusionéiert.

13. No enger erfollegräicher Fusioun a Meeschter gëtt d'Aufgabstatus op Zougemaach geännert (Jira microservice).

D'Diagramm mécht net wéi wann et komplett detailléiert ass (a Wierklechkeet ginn et nach méi Schrëtt), awer et erlaabt Iech de Grad vun der Integratioun an de Prozesser ze bewäerten. Mir betruechten dëse Schema net ideal a verbesseren d'Prozesser vun der automatescher Verëffentlechung an der Deployment Support.

Wat ass Next

Mir hu grouss Pläng fir d'Entwécklung vun der Automatisatioun, zum Beispill, d'Eliminatioun vun manuelle Operatiounen während Monolith Verëffentlechungen, d'Iwwerwaachung während der automatescher Deployment verbesseren an d'Interaktioun mat Entwéckler verbesseren.

Mee loosst eis elo hei ophalen. Mir hunn vill Themen an der Automatisatiounsrevisioun iwwerflächlech ofgedeckt, e puer goufen guer net beréiert, also wäerte mir frou Froen ze beäntweren. Mir waarden op Suggestiounen iwwer wat am Detail ze decken, schreift an de Kommentaren.

Source: will.com

Setzt e Commentaire