Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Fl-RIT 2019, għamel il-kollega tagħna Alexander Korotkov tirrapporta dwar l-awtomazzjoni tal-iżvilupp f'CIAN: biex nissimplifikaw il-ħajja u x-xogħol, nużaw il-pjattaforma Integro tagħna stess. Huwa jsegwi ċ-ċiklu tal-ħajja tal-kompiti, jeħles lill-iżviluppaturi minn operazzjonijiet ta 'rutina u jnaqqas b'mod sinifikanti n-numru ta' bugs fil-produzzjoni. F'din il-kariga, aħna se nikkumplimentaw ir-rapport ta 'Alexander u ngħidulek kif morna minn skripts sempliċi biex nikkombinaw prodotti ta' sors miftuħ permezz tal-pjattaforma tagħna stess u x'jagħmel it-tim ta 'awtomazzjoni separat tagħna.
 

Livell żero

"M'hemm l-ebda ħaġa bħal livell żero, ma nafx ħaġa bħal din"
Master Shifu mill-film "Kung Fu Panda"

L-awtomazzjoni f'CIAN bdiet 14-il sena wara li twaqqfet il-kumpanija. Dak iż-żmien kien hemm 35 persuna fit-tim tal-iżvilupp. Diffiċli biex temmen, hux? Naturalment, l-awtomazzjoni kienet teżisti f'xi forma, iżda direzzjoni separata għall-integrazzjoni kontinwa u l-kunsinna tal-kodiċi bdiet tieħu forma fl-2015. 

Dak iż-żmien, kellna monolitu enormi ta 'Python, C# u PHP, skjerati fuq servers Linux/Windows. Biex niskjeraw dan il-mostru, kellna sett ta' skripts li ħadna manwalment. Kien hemm ukoll l-​assemblaġġ tal-​monolith, li ġabet uġigħ u tbatija minħabba kunflitti meta għaqqad il-​fergħat, ikkoreġi d-​difetti, u jerġaʼ jibni “b’sett differenti taʼ kompiti fil-​bini.” Proċess simplifikat kien jidher bħal dan:

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Ma konniex kuntenti b'dan, u ridna nibnu proċess ta' bini u skjerament li jista' jiġi ripetut, awtomatizzat u maniġġabbli. Għal dan, kellna bżonn sistema CI/CD, u għażilna bejn il-verżjoni ħielsa ta 'Teamcity u l-verżjoni b'xejn ta' Jenkins, peress li ħdimna magħhom u t-tnejn kienu adattati għalina f'termini tas-sett ta 'funzjonijiet. Aħna għażilna Teamcity bħala prodott aktar riċenti. Dak iż-żmien, konna ma użajnax l-arkitettura tal-mikroservizz u ma stennejtx numru kbir ta’ kompiti u proġetti.

Aħna naslu għall-idea tas-sistema tagħna stess

L-implimentazzjoni ta' Teamcity neħħiet biss parti mix-xogħol manwali: dak li jibqa 'huwa l-ħolqien ta' Pull Requests, promozzjoni ta 'kwistjonijiet skont l-istatus f'Jira, u għażla ta' kwistjonijiet għar-rilaxx. Is-sistema Teamcity ma setgħetx tlaħħaq ma' dan. Kien meħtieġ li tagħżel it-triq ta 'aktar awtomazzjoni. Aħna ikkunsidrajna għażliet biex naħdmu bi skripts f'Teamcity jew jaqilbu għal sistemi ta 'awtomazzjoni ta' partijiet terzi. Iżda fl-aħħar iddeċidejna li kellna bżonn ta' flessibilità massima, li s-soluzzjoni tagħna biss tista' tipprovdi. Hekk dehret l-ewwel verżjoni tas-sistema ta’ awtomazzjoni interna msejħa Integro.

Teamcity jittratta l-awtomazzjoni fil-livell tat-tnedija tal-proċessi tal-bini u l-iskjerament, filwaqt li Integro iffoka fuq l-awtomazzjoni tal-ogħla livell tal-proċessi tal-iżvilupp. Kien meħtieġ li tgħaqqad ix-xogħol ma 'kwistjonijiet f'Jira ma' l-ipproċessar tal-kodiċi tas-sors assoċjat f'Bitbucket. F'dan l-istadju, Integro beda jkollu l-flussi tax-xogħol tiegħu stess biex jaħdem ma 'kompiti ta' tipi differenti. 

Minħabba ż-żieda fl-awtomazzjoni fil-proċessi tan-negozju, in-numru ta 'proġetti u runs f'Teamcity żdied. Allura daħlet problema ġdida: istanza waħda b'xejn ta 'Teamcity ma kinitx biżżejjed (3 aġenti u 100 proġett), żidna każ ieħor (3 aġenti aktar u 100 proġett), imbagħad ieħor. Bħala riżultat, spiċċajna b'sistema ta' diversi clusters, li kienet diffiċli biex timmaniġġaha:

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Meta qamet il-kwistjoni tar-4 istanza, indunajna li ma stajna nkomplu ngħixu hekk, minħabba li l-ispejjeż totali tal-appoġġ għal 4 istanzi ma kienu għadhom fl-ebda limitu. Qammet il-mistoqsija dwar ix-xiri ta' Teamcity imħallas jew l-għażla ta' Jenkins b'xejn. Għamilna kalkoli fuq każijiet u pjanijiet ta 'awtomazzjoni u ddeċidejna li ngħixu fuq Jenkins. Wara ftit ġimgħat, qlibna għal Jenkins u eliminajna xi wħud mill-uġigħ ta 'ras assoċjat maż-żamma ta' każijiet multipli ta 'Teamcity. Għalhekk, stajna niffukaw fuq l-iżvilupp ta 'Integro u l-personalizzazzjoni ta' Jenkins għalina.

Bit-tkabbir ta 'awtomazzjoni bażika (fil-forma ta' ħolqien awtomatiku ta 'Pull Requests, ġbir u pubblikazzjoni ta' kopertura tal-Kodiċi u kontrolli oħra), hemm xewqa qawwija li tabbanduna r-rilaxxi manwali kemm jista 'jkun u tagħti dan ix-xogħol lir-robots. Barra minn hekk, il-kumpanija bdiet tiċċaqlaq għal mikroservizzi fi ħdan il-kumpanija, li kienu jeħtieġu rilaxxi frekwenti, u separatament minn xulxin. Dan huwa kif gradwalment wasalna għal rilaxxi awtomatiċi tal-mikroservizzi tagħna (bħalissa qed nirrilaxxaw il-monolith manwalment minħabba l-kumplessità tal-proċess). Iżda, kif jiġri s-soltu, qamet kumplessità ġdida. 

Aħna awtomatizzati l-ittestjar

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Minħabba l-awtomazzjoni tar-rilaxxi, il-proċessi ta 'żvilupp aċċelleraw, parzjalment minħabba l-qbeż ta' xi stadji tal-ittestjar. U dan wassal għal telf temporanju ta 'kwalità. Jidher trivjali, iżda flimkien mal-aċċelerazzjoni tar-rilaxxi, kien meħtieġ li tinbidel il-metodoloġija tal-iżvilupp tal-prodott. Kien meħtieġ li wieħed jaħseb dwar l-awtomazzjoni tal-ittestjar, inissel ir-responsabbiltà personali (hawnhekk qed nitkellmu dwar "l-aċċettazzjoni tal-idea fir-ras", mhux multi monetarji) tal-iżviluppatur għall-kodiċi rilaxxat u bugs fih, kif ukoll id-deċiżjoni li rilaxx/mhux jirrilaxxa kompitu permezz ta 'skjerament awtomatiku. 

L-eliminazzjoni tal-problemi ta 'kwalità, wasalna għal żewġ deċiżjonijiet importanti: bdejna nwettqu ttestjar tal-kanarji u daħħalna monitoraġġ awtomatiku tal-isfond tal-iżball b'rispons awtomatiku għall-eċċess tiegħu. L-ewwel soluzzjoni għamlitha possibbli li jinstabu żbalji ovvji qabel ma l-kodiċi ġie rilaxxat għal kollox fil-produzzjoni, it-tieni naqqset il-ħin ta 'rispons għal problemi fil-produzzjoni. Żbalji, ovvjament, iseħħu, iżda nqattgħu ħafna mill-ħin u l-isforzi tagħna mhux biex nikkoreġuhom, iżda biex innaqqsuhom. 

Tim tal-Awtomazzjoni

Bħalissa għandna persunal ta 'żviluppatur 130, u nkomplu jikber. It-tim għall-integrazzjoni kontinwa u t-twassil tal-kodiċi (minn hawn 'il quddiem imsejjaħ it-tim ta' Skjerament u Integrazzjoni jew DI) jikkonsisti minn nies 7 u jaħdem f'direzzjonijiet 2: żvilupp tal-pjattaforma ta 'awtomazzjoni Integro u DevOps. 

DevOps huwa responsabbli għall-ambjent Dev/Beta tas-sit CIAN, l-ambjent Integro, jgħin lill-iżviluppaturi jsolvu l-problemi u jiżviluppa approċċi ġodda għall-iskala tal-ambjenti. Id-direzzjoni ta 'żvilupp ta' Integro tittratta kemm Integro innifsu kif ukoll servizzi relatati, pereżempju, plugins għal Jenkins, Jira, Confluence, u tiżviluppa wkoll utilitajiet awżiljarji u applikazzjonijiet għal timijiet ta 'żvilupp. 

It-tim DI jaħdem b'mod kollaborattiv mat-tim tal-Pjattaforma, li jiżviluppa l-arkitettura, il-libreriji, u l-approċċi tal-iżvilupp internament. Fl-istess ħin, kwalunkwe żviluppatur fi ħdan CIAN jista 'jikkontribwixxi għall-awtomazzjoni, pereżempju, jagħmel mikro-awtomazzjoni biex taqdi l-ħtiġijiet tat-tim jew jaqsam idea friska dwar kif tagħmel l-awtomazzjoni saħansitra aħjar.

Saff kejk ta 'awtomazzjoni f'CIAN

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Is-sistemi kollha involuti fl-awtomazzjoni jistgħu jinqasmu f'diversi saffi:

  1. Sistemi esterni (Jira, Bitbucket, eċċ.). Timijiet ta 'żvilupp jaħdmu magħhom.
  2. Pjattaforma Integrata. Ħafna drabi, l-iżviluppaturi ma jaħdmux magħha direttament, iżda huwa dak li jżomm l-awtomazzjoni kollha taħdem.
  3. Servizzi ta’ kunsinna, orkestrazzjoni u skoperta (pereżempju, Jeknins, Consul, Nomad). Bl-għajnuna tagħhom, aħna niskjeraw kodiċi fuq servers u niżguraw li s-servizzi jaħdmu ma 'xulxin.
  4. Saff fiżiku (servers, OS, softwer relatat). Il-kodiċi tagħna jopera f'dan il-livell. Dan jista 'jkun jew server fiżiku jew wieħed virtwali (LXC, KVM, Docker).

Ibbażat fuq dan il-kunċett, naqsmu oqsma ta 'responsabbiltà fi ħdan it-tim DI. L-ewwel żewġ livelli huma fil-qasam tar-responsabbiltà tad-direzzjoni tal-iżvilupp Integro, u l-aħħar żewġ livelli huma diġà fil-qasam tar-responsabbiltà tad-DevOps. Din is-separazzjoni tippermettilna li niffukaw fuq il-kompiti u ma tfixkilx l-interazzjoni, peress li aħna qrib xulxin u kontinwament niskambjaw għarfien u esperjenza.

Intatt

Ejja niffukaw fuq Integro u nibdew bil-munzell tat-teknoloġija:

  • CentOS 7
  • Docker + Nomad + Konslu + Vault
  • Java 11 (il-monolitu Integro l-antik se jibqa' fuq Java 8)
  • Spring Boot 2.X + Spring Cloud Config
  • PostgreSql 11
  • Fenek MQ 
  • Apache Ignite
  • Camunda (inkorporat)
  • Grafana + Graphite + Prometheus + Jaeger + ELK
  • Web UI: React (CSR) + MobX
  • SSO: Keycloak

Aħna nżommu mal-prinċipju ta 'żvilupp ta' mikroservizzi, għalkemm għandna wirt fil-forma ta 'monolith ta' verżjoni bikrija ta 'Integro. Kull mikroservizz jaħdem fil-kontenitur Docker tiegħu stess, u s-servizzi jikkomunikaw ma 'xulxin permezz ta' talbiet HTTP u messaġġi RabbitMQ. Il-mikroservizzi jsibu lil xulxin permezz tal-Konslu u jagħmlu talba għalih, billi jgħaddu l-awtorizzazzjoni permezz tal-SSO (Keycloak, OAuth 2/OpenID Connect).

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Bħala eżempju tal-ħajja reali, ikkunsidra l-interazzjoni ma 'Jenkins, li jikkonsisti fil-passi li ġejjin:

  1. Il-mikroservizz tal-ġestjoni tal-fluss tax-xogħol (minn hawn 'il quddiem imsejjaħ il-mikroservizz Flow) irid imexxi build f'Jenkins. Biex jagħmel dan, juża l-Konsul biex isib l-IP:PORT tal-mikroservizz għall-integrazzjoni ma 'Jenkins (minn hawn 'il quddiem imsejjaħ mikroservizz Jenkins) u jibgħatlu talba asinkronika biex tibda l-bini f'Jenkins.
  2. Wara li jirċievi talba, il-mikroservizz Jenkins jiġġenera u jirrispondi b'ID tal-Impjieg, li mbagħad tista' tintuża biex tidentifika r-riżultat tax-xogħol. Fl-istess ħin, iqanqal il-bini f'Jenkins permezz ta 'sejħa REST API.
  3. Jenkins iwettaq il-bini u, wara t-tlestija, jibgħat webhook bir-riżultati tal-eżekuzzjoni lill-mikroservizz Jenkins.
  4. Il-mikroservizz Jenkins, wara li rċieva l-webhook, jiġġenera messaġġ dwar it-tlestija tal-ipproċessar tat-talba u jehmeż miegħu r-riżultati tal-eżekuzzjoni. Il-messaġġ iġġenerat jintbagħat lill-kju RabbitMQ.
  5. Permezz ta’ RabbitMQ, il-messaġġ ippubblikat jilħaq il-mikroservizz Flow, li jitgħallem dwar ir-riżultat tal-ipproċessar tal-kompitu tiegħu billi jqabbel l-ID tal-Impjieg mit-talba u l-messaġġ riċevut.

Issa għandna madwar 30 mikroservizz, li jistgħu jinqasmu f'diversi gruppi:

  1. Ġestjoni tal-konfigurazzjoni.
  2. Informazzjoni u interazzjoni mal-utenti (messaġġiera, posta).
  3. Ħidma bil-kodiċi tas-sors.
  4. Integrazzjoni ma 'għodod ta' skjerament (jenkins, nomad, konsul, eċċ.).
  5. Monitoraġġ (rilaxxi, żbalji, eċċ.).
  6. Utilitajiet tal-web (UI għall-ġestjoni ta' ambjenti tat-test, ġbir ta' statistika, eċċ.).
  7. Integrazzjoni ma' trackers tal-kompiti u sistemi simili.
  8. Ġestjoni tal-fluss tax-xogħol għal kompiti differenti.

Ħidmiet tal-fluss tax-xogħol

Integro awtomatizza attivitajiet relatati maċ-ċiklu tal-ħajja tal-kompitu. F'termini simplifikati, iċ-ċiklu tal-ħajja ta 'kompitu se jinftiehem bħala l-fluss tax-xogħol ta' kompitu f'Jira. Il-proċessi ta 'żvilupp tagħna għandhom diversi varjazzjonijiet tal-fluss tax-xogħol skont il-proġett, it-tip ta' kompitu u l-għażliet magħżula f'kompitu partikolari. 

Ejja nħarsu lejn il-fluss tax-xogħol li nużaw l-aktar spiss:

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Fid-dijagramma, l-irkaptu jindika li t-tranżizzjoni tissejjaħ awtomatikament minn Integro, filwaqt li l-figura umana tindika li t-tranżizzjoni tissejjaħ manwalment minn persuna. Ejja nħarsu lejn diversi mogħdijiet li kompitu jista' jieħu f'dan il-fluss tax-xogħol.

Ittestjar kompletament manwali fuq DEV + BETA mingħajr testijiet tal-kanarji (ġeneralment dan huwa kif nirrilaxxaw monolith):

Mill-iskripts għall-pjattaforma tagħna stess: kif awtomatizzajna l-iżvilupp f'CIAN

Jista 'jkun hemm kombinazzjonijiet ta' transizzjoni oħra. Xi drabi t-triq li se tieħu kwistjoni tista 'tintgħażel permezz ta' għażliet f'Jira.

Moviment tal-kompitu

Ejja nħarsu lejn il-passi ewlenin li jsiru meta kompitu jimxi permezz tal-fluss tax-xogħol "Testjar DEV + Testijiet Kanarji":

1. L-iżviluppatur jew PM joħloq il-kompitu.

2. L-iżviluppatur jieħu l-kompitu biex jaħdem. Wara t-tlestija, taqleb għall-istatus IN REVIŻJONI.

3. Jira tibgħat Webhook lill-mikroservizz Jira (responsabbli għall-integrazzjoni ma' Jira).

4. Il-mikroservizz Jira jibgħat talba lis-servizz Flow (responsabbli għall-flussi tax-xogħol interni li fihom jitwettaq ix-xogħol) biex jibda l-fluss tax-xogħol.

5. Ġewwa s-servizz tal-Fluss:

  • Ir-reviżuri huma assenjati għall-kompitu (Utenti mikroservizz li jaf kollox dwar l-utenti + Jira mikroservizz).
  • Permezz tal-mikroservizz Sors (jaf dwar repożitorji u fergħat, iżda ma jaħdimx mal-kodiċi innifsu), issir tfittxija għal repożitorji li fihom fergħa tal-ħruġ tagħna (biex tissimplifika t-tfittxija, l-isem tal-fergħa jikkoinċidi mal-kwistjoni numru fil-Jira). Ħafna drabi, kompitu jkollu fergħa waħda biss f'repożitorju wieħed; dan jissimplifika l-ġestjoni tal-kju tal-iskjerament u jnaqqas il-konnettività bejn ir-repożitorji.
  • Għal kull fergħa misjuba, titwettaq is-sekwenza ta 'azzjonijiet li ġejja:

    i) Aġġornament tal-fergħa prinċipali (mikroservizz Git biex taħdem bil-kodiċi).
    ii) Il-fergħa hija mblukkata minn bidliet mill-iżviluppatur (mikroservizz Bitbucket).
    iii) Tinħoloq Pull Request għal din il-fergħa (mikroservizz Bitbucket).
    iv) Jintbagħat messaġġ dwar Pull Request ġdida lil chats tal-iżviluppaturi (Avża lill-mikroservizz għax taħdem man-notifiki).
    v) Il-kompiti tal-bini, tat-test u tal-iskjerament jinbdew fuq DEV (mikroservizz ta' Jenkins għal ħidma ma' Jenkins).
    vi) Jekk il-passi kollha preċedenti jitlestew b'suċċess, allura Integro tpoġġi l-Approvazzjoni tagħha fit-Talba tal-Iġbed (mikroservizz Bitbucket).

  • Integro jistenna Approva f'Pull Request minn reviżuri maħtura.
  • Hekk kif l-approvazzjonijiet kollha meħtieġa jkunu waslu (inklużi testijiet awtomatizzati jkunu għaddew b'mod pożittiv), Integro jittrasferixxi l-kompitu għall-istatus Test on Dev (mikroservizz Jira).

6. Testers jittestjaw il-kompitu. Jekk ma jkunx hemm problemi, allura l-kompitu jiġi trasferit għall-istatus Ready For Build.

7. Integro "jara" li l-kompitu huwa lest għar-rilaxx u jibda l-iskjerament tiegħu fil-modalità canary (mikroservizz Jenkins). Ir-rieda hija ddeterminata minn sett ta' regoli. Pereżempju, il-kompitu jinsab fl-istatus meħtieġ, m'hemm l-ebda serraturi fuq kompiti oħra, bħalissa m'hemm l-ebda uploads attiv ta 'dan il-mikroservizz, eċċ.

8. Il-kompitu jiġi trasferit għall-istatus tal-Kanarji (mikroservizz Jira).

9. Jenkins tniedi kompitu ta 'skjerament permezz ta' Nomad fil-modalità canary (ġeneralment 1-3 każijiet) u jinnotifika lis-servizz ta 'monitoraġġ tar-rilaxx (DeployWatch microservice) dwar l-iskjerament.

10. Il-mikroservizz DeployWatch jiġbor l-isfond tal-iżball u jirreaġixxi għalih, jekk meħtieġ. Jekk jinqabeż l-isfond tal-iżball (in-norma tal-isfond tiġi kkalkulata awtomatikament), l-iżviluppaturi jiġu notifikati permezz tal-mikroservizz Notifika. Jekk wara 5 minuti l-iżviluppatur ma jkunx wieġeb (ikklikkja Aqbad jew Ibqa'), allura jitnieda rollback awtomatiku tal-istanzi tal-kanarji. Jekk l-isfond ma jinqabiżx, allura l-iżviluppatur għandu jniedi manwalment l-iskjerament tal-kompitu għall-Produzzjoni (billi tikklikkja buttuna fl-UI). Jekk fi żmien 60 minuta l-iżviluppatur ma niedax l-iskjerament għall-Produzzjoni, allura l-istanzi tal-kanarji wkoll jiġu rtirati lura għal raġunijiet ta 'sigurtà.

11. Wara t-tnedija tal-iskjerament għall-Produzzjoni:

  • Il-kompitu jiġi trasferit għall-istatus tal-Produzzjoni (mikroservizz Jira).
  • Il-mikroservizz Jenkins jibda l-proċess tal-iskjerament u jinnotifika lill-mikroservizz DeployWatch dwar l-iskjerament.
  • Il-mikroservizz DeployWatch jiċċekkja li l-kontenituri kollha fuq Produzzjoni ġew aġġornati (kien hemm każijiet meta mhux kollha ġew aġġornati).
  • Permezz tal-mikroservizz Notify, tintbagħat notifika dwar ir-riżultati tal-iskjerament lill-Produzzjoni.

12. L-iżviluppaturi se jkollhom 30 minuta biex jibdew jaqilbu biċċa xogħol mill-Produzzjoni jekk tinstab imġieba mhux korretta tal-mikroservizz. Wara dan iż-żmien, il-kompitu se jingħaqad awtomatikament fil-kaptan (Git microservice).

13. Wara amalgamazzjoni b'suċċess f'master, l-istatus tal-kompitu jinbidel għal Magħluq (mikroservizz Jira).

Id-dijagramma ma tippretendix li hija kompletament dettaljata (fir-realtà hemm saħansitra aktar passi), iżda tippermettilek tivvaluta l-grad ta 'integrazzjoni fil-proċessi. Aħna ma nqisux din l-iskema bħala ideali u qed intejbu l-proċessi tar-rilaxx awtomatiku u l-appoġġ għall-iskjerament.

X'hemm Li jmiss

Għandna pjanijiet kbar għall-iżvilupp tal-awtomazzjoni, pereżempju, l-eliminazzjoni tal-operazzjonijiet manwali waqt ir-rilaxxi tal-monoliti, it-titjib tal-monitoraġġ waqt l-iskjerament awtomatiku, u t-titjib tal-interazzjoni mal-iżviluppaturi.

Imma ejja nieqfu hawn għalissa. Aħna koprejna ħafna suġġetti fir-reviżjoni tal-awtomazzjoni b'mod superfiċjali, xi wħud ma ġewx mimsus, għalhekk se nkunu kuntenti li nwieġbu l-mistoqsijiet. Qed nistennew suġġerimenti dwar x'għandek tkopri fid-dettall, ikteb fil-kummenti.

Sors: www.habr.com

Żid kumment