Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Di RIT 2019 de, hevkarê me Alexander Korotkov çêkir nûçe di derbarê otomasyona pêşkeftinê de li CIAN: ji bo hêsankirina jiyan û xebatê, em platforma xweya Integro bikar tînin. Ew çerxa jiyanê ya peywiran dişopîne, pêşdebiran ji operasyonên rûtîn rehet dike û bi girîngî hejmara xeletiyên di hilberînê de kêm dike. Di vê postê de, em ê raporta Alexander temam bikin û ji we re vebêjin ka em çawa ji nivîsarên sade berbi berhevkirina hilberên çavkaniya vekirî bi navgîniya platforma xwe ve çûn û tîmê meya xweseriya cihêreng çi dike.
 

Asta sifir

"Tiştekî bi navê asta sifir tune, ez tiştekî wiha nizanim"
Mamoste Shifu ji fîlma "Kung Fu Panda"

Otomasyon li CIAN 14 sal piştî damezrandina pargîdanî dest pê kir. Di wê demê de 35 kes di ekîba pêşveçûnê de bûn. Zehmet e ku bawer bike, rast? Bê guman, otomasyon bi rengekî hebû, lê rêgezek cûda ji bo yekbûn û radestkirina kodê ya domdar di sala 2015-an de dest pê kir. 

Wê demê, me monolîtek mezin a Python, C# û PHP-ê hebû, ku li ser serverên Linux/Windows-ê hatine bicîh kirin. Ji bo bicihkirina vê cinawirê, me komek senaryoyên ku me bi destan meşandin hebûn. Di heman demê de meclîsa monolîtê jî hebû, ku ji ber pevçûnan êş û azar di dema yekkirina şaxan, sererastkirina kêmasiyan, û ji nû ve avakirina "bi komek karên cûda yên di çêkirinê de" anî. Pêvajoyek hêsan bi vî rengî xuya bû:

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Em ji vê yekê ne kêfxweş bûn, û me xwest ku em pêvajoyek çêkirin û bicîhkirinê ya dubare, otomatîk û birêkûpêk ava bikin. Ji bo vê yekê, me pêdivî bi pergalek CI/CD-ê hebû, û me di navbera guhertoya belaş a Teamcity û guhertoya belaş a Jenkins de hilbijart, ji ber ku me bi wan re xebitî û hem jî di warê komek fonksiyonan de li gorî me bûn. Me Teamcity wekî hilberek nûtirîn hilbijart. Wê demê, me hîn mîmariya mîkroxizmetê bikar neaniye û li hêviya hejmareke mezin ji kar û projeyan nebû.

Em digihîjin fikra pergala xwe

Pêkanîna Teamcity tenê beşek ji xebata destan jê kir: ya ku dimîne afirandina Daxwazên Kêşanê, pêşvebirina pirsgirêkan ji hêla statûyê ve li Jira, û hilbijartina pirsgirêkan ji bo berdanê ye. Sîstema Teamcity êdî nikarîbû bi vê yekê re mijûl bibe. Pêwîst bû ku riya xweseriya bêtir hilbijêrin. Me vebijarkên ji bo xebata bi nivîsarên li Teamcity an guheztina pergalên otomasyona sêyemîn-sêyem nirxand. Lê di dawiyê de me biryar da ku hewcedariya me bi nermbûna herî zêde heye, ku tenê çareseriya me dikare peyda bike. Bi vî rengî guhertoya yekem a pergala xweseriya navxweyî ya bi navê Integro xuya bû.

Teamcity di asta destpêkirina pêvajoyên avakirin û bicîhkirinê de bi otomatîkkirinê re mijûl dibe, dema ku Integro balê dikişîne ser otomatîkkirina asta jorîn a pêvajoyên pêşkeftinê. Pêwîst bû ku xebata bi pirsgirêkên li Jira re bi hilberandina koda çavkaniyê ya têkildar li Bitbucket re were hev kirin. Di vê qonaxê de, Integro ji bo xebata bi karên cûrbecûr re dest bi xebatên xwe kir. 

Ji ber zêdebûna otomasyona di pêvajoyên karsaziyê de, hejmara proje û rêve di Teamcity de zêde bûye. Ji ber vê yekê pirsgirêkek nû derket: mînakek Teamcity ya belaş ne bes bû (3 ajan û 100 proje), me mînakek din (3 ajanên din û 100 proje) lê zêde kir, dûv re yeke din. Wekî encamek, me bi pergalek ji çend koman pêk tê, ku birêvebirina wê dijwar bû:

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Dema ku pirsa mînaka 4emîn hat, me fêm kir ku em nikarin bi vî rengî bijîn, ji ber ku lêçûnên giştî yên piştgirîkirina 4 mînakan êdî di nav ti sînoran de ne. Pirs li ser kirîna Teamcity-ya drav an hilbijartina Jenkins-a belaş derket holê. Me li ser mînak û plansaziyên otomasyonê hesaban kir û biryar da ku em ê li ser Jenkins bijîn. Piştî çend hefteyan, me berê xwe da Jenkins û hin serêşiya ku bi domandina gelek mînakên Teamcity ve girêdayî ye ji holê rakir. Ji ber vê yekê, me karîbû balê bikişîne ser pêşxistina Integro û xweşkirina Jenkins ji bo xwe.

Bi mezinbûna otomasyona bingehîn (di forma çêkirina otomatîkî ya Daxwazên Kêşanê, berhevkirin û weşandina vegirtina Kodê û kontrolên din de), daxwazek xurt heye ku bi qasî ku gengaz dev ji berdanên destan berde û vî karî bide robotan. Digel vê yekê, pargîdanî dest pê kir ku di hundurê pargîdaniyê de berbi mîkroxizmetên ku hewceyê berdanên pir caran, û ji hevûdu veqetandî bû, dest pê kir. Bi vî rengî em hêdî hêdî gihîştin berdanên otomatîkî yên mîkroxizmetên xwe (ji ber tevliheviya pêvajoyê em niha monolîtê bi destan berdidin). Lê, wekî ku bi gelemperî diqewime, tevliheviyek nû derket holê. 

Em ceribandinê otomatîk dikin

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Ji ber otomatîkkirina berdanan, pêvajoyên pêşkeftinê bilez bûne, hinekî jî ji ber derbasbûna hin qonaxên ceribandinê. Û ev bû sedema windabûna kalîteyê ya demkî. Ew sivik xuya dike, lê digel bilezkirina berdanan, pêdivî bû ku metodolojiya pêşkeftina hilberê were guheztin. Pêdivî bû ku meriv li ser otomatîkkirina ceribandinê, danîna berpirsiyariya kesane (li vir em qala "qebûlkirina ramanê di serî de", ne cezayên diravî) ya pêşdebiran ji bo koda hatî berdan û xeletiyên tê de, û her weha biryara serbestberdan / ne berdana peywirek bi karanîna otomatîk. 

Ji holê rakirina pirsgirêkên kalîteyê, em gihîştin du biryarên girîng: me dest bi ceribandina kanariyê kir û çavdêriya otomatîkî ya paşxaneya xeletiyê bi bersivek otomatîkî ya zêdeya wê re destnîşan kir. Çareseriya yekem gengaz kir ku meriv xeletiyên eşkere bibîne berî ku kod bi tevahî di hilberînê de were berdan, ya duyemîn dema bersivdayînê ji pirsgirêkên di hilberînê de kêm kir. Bê guman xeletî diqewimin, lê em piraniya dem û hewldana xwe ne li ser rastkirina wan, lê ji bo kêmkirina wan xerc dikin. 

Tîma Automation

Niha xebatkarên me yên ji 130 pêşdebiran pêk tê hene û em berdewam dikin mezinbûn. Tîma ji bo entegrasyon û radestkirina kodê ya domdar (ji vir şûnde wekî tîmê Deploy û Entegrasyonê an DI tê binav kirin) ji 7 kesan pêk tê û di 2 aliyan de dixebite: pêşvebirina platforma otomasyona Integro û DevOps. 

DevOps ji hawîrdora Dev / Beta ya malpera CIAN, hawîrdora Integro berpirsiyar e, ji pêşdebiran re dibe alîkar ku pirsgirêkan çareser bikin û nêzîkatiyên nû ji hawîrdorên pîvandinê re pêşve bibin. Rêvebiriya pêşkeftina Integro hem bi Integro bixwe û hem jî bi karûbarên têkildar re mijûl dibe, mînakî, pêvekên ji bo Jenkins, Jira, Confluence, û di heman demê de ji bo tîmên pêşkeftinê karûbar û serîlêdanên alîkar jî pêşve dixe. 

Tîma DI bi tîmê Platformê re hevkariyê dike, ku mîmarî, pirtûkxane û nêzîkatiyên pêşkeftinê di hundurê xwe de pêş dixe. Di heman demê de, her pêşdebirek di nav CIAN-ê de dikare beşdarî otomasyonê bibe, mînakî, mîkro-otomatîkî li gorî hewcedariyên tîmê çêbike an ramanek xweş parve bike ka meriv çawa otomasyonê hîn çêtir dike.

Layer cake automation li CIAN

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Hemî pergalên ku di otomasyonê de têkildar in dikarin li çend qatan werin dabeş kirin:

  1. Pergalên derve (Jira, Bitbucket, hwd.). Tîmên pêşveçûnê bi wan re dixebitin.
  2. Platforma Integro. Bi gelemperî, pêşdebiran rasterast bi wê re naxebitin, lê ew e ku hemî otomasyonê dimeşîne.
  3. Karûbarên radestkirin, orkestrasyon û vedîtinê (mînak, Jeknins, Konsul, Nomad). Bi alîkariya wan, em kodê li ser serveran bicîh dikin û piştrast dikin ku karûbar bi hev re dixebitin.
  4. Qata fizîkî (server, OS, nermalava têkildar). Koda me di vê astê de dixebite. Ev dikare bibe serverek fîzîkî an jî virtual (LXC, KVM, Docker).

Li ser bingeha vê konseptê, em qadên berpirsiyariyê di nav tîmê DI de dabeş dikin. Du astên yekem di warê berpirsiyariya rêgeza pêşkeftina Integro de ne, û du astên paşîn jixwe di qada berpirsiyariya DevOps de ne. Ev veqetandin rê dide me ku em bala xwe bidin ser karan û destwerdanê nade danûstandinê, ji ber ku em nêzî hev in û her dem zanîn û ezmûnê diguhezînin.

Tije

Werin em li ser Integro bisekinin û bi stoka teknolojiyê dest pê bikin:

  • CentOS 7
  • Docker + Koçer + Konsul + Vault
  • Java 11 (monolîta Integro ya kevn dê li Java 8 bimîne)
  • Spring Boot 2.X + Bihara Cloud Config
  • PostgreSql 11
  • Rabbit MQ 
  • Apache Ignite
  • Camunda (binavkirî)
  • Grafana + Graphite + Prometheus + Jaeger + ELK
  • UI Web: React (CSR) + MobX
  • SSO: Keycloak

Em pabendî prensîba pêşkeftina mîkroxizmetê ne, her çend mîrateya me di forma monolîtek guhertoyek pêşîn a Integro de heye. Her mîkroxizmet di konteynera xwe ya Docker de dimeşe, û karûbar bi daxwazên HTTP û peyamên RabbitMQ bi hevûdu re têkilî daynin. Microservis bi navgîniya Konsulê hevdu dibînin û daxwazek jê re dikin, destûrnameyê bi SSO (Keycloak, OAuth 2 / OpenID Connect) re derbas dikin.

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Wekî mînakek jiyanek rastîn, bi Jenkins re têkilî binirxînin, ku ji gavên jêrîn pêk tê:

  1. Mîkroxizmeta rêveberiya tevgera xebatê (ji vir şûnde wekî mîkroxizmeta Flow tê binav kirin) dixwaze ku li Jenkins avahiyek bimeşîne. Ji bo vê yekê, ew Konsul bikar tîne da ku IP: PORT ya mîkroxizmetê ji bo entegrasyonê bi Jenkins re (ji vir şûnde wekî mîkroxizmeta Jenkins tê binav kirin) bibîne û daxwazek asynkron jê re dişîne da ku dest bi avakirina Jenkins bike.
  2. Piştî wergirtina daxwazek, mîkroxizmeta Jenkins bi Nasnameyek Karê diafirîne û bersiv dide, ku paşê dikare were bikar anîn da ku encama xebatê nas bike. Di heman demê de, ew avakirina li Jenkins bi riya bangek REST API-ê vedigire.
  3. Jenkins çêkirinê pêk tîne û, piştî qedandinê, tevnokek bi encamên darvekirinê re ji mîkroxizmeta Jenkins re dişîne.
  4. Mîkroxizmeta Jenkins, ku webhook wergirtiye, di derbarê qedandina pêvajoya daxwaznameyê de peyamek diafirîne û encamên darvekirinê pê ve girêdide. Peyama hatî çêkirin ji rêza RabbitMQ re tê şandin.
  5. Bi RabbitMQ re, peyama weşandî digihîje mîkroxizmeta Flow, ya ku di derheqê encama pêvajoykirina peywira xwe de bi berhevkirina Nasnameya Karê ji daxwaz û peyama wergirtî fêr dibe.

Naha nêzîkê 30 mîkroxizmetên me hene, ku dikarin li çend koman bêne dabeş kirin:

  1. birêvebirina veavakirina.
  2. Agahdarî û danûstendina bi bikarhêneran re (qasid, mail).
  3. Bi koda çavkaniyê re dixebitin.
  4. Yekbûnek bi amûrên bicîhkirinê (jenkîn, koçer, konsul, hwd.).
  5. Çavdêrî (berdan, xeletî, hwd.).
  6. Karûbarên malperê (UI ji bo birêvebirina hawîrdorên ceribandinê, berhevkirina statîstîkan, hwd.).
  7. Yekbûn bi şopînerên peywirê û pergalên mîna hev re.
  8. Rêvebiriya xebatê ji bo karên cûda.

Karên xebatê

Integro çalakiyên bi çerxa jiyana peywirê ve girêdayî otomatîk dike. Bi şertên hêsankirî, çerxa jiyanê ya peywirê dê wekî xebata karekî li Jira were fêm kirin. Pêvajoyên pêşkeftina me li gorî projeyê, celebê peywirê û vebijarkên ku di karekî taybetî de hatine hilbijartin, gelek guhertoyên xebata xebatê hene. 

Ka em li xebata ku em pir caran bikar tînin binêrin:

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Di diagramê de, gear destnîşan dike ku veguheztin bixweber ji hêla Integro ve tê gotin, dema ku jimareya mirovî destnîşan dike ku veguheztin ji hêla kesek ve bi destan tê gotin. Ka em li çend riyên ku karek dikare di vê xebata xebatê de bigire binêre.

Testkirina bi tevahî destan li ser DEV + BETA bêyî ceribandinên canary (bi gelemperî bi vî rengî em monolîtek berdidin):

Ji senaryoyan heya platforma xwe: me çawa pêşkeftina li CIAN-ê otomatîk kir

Dibe ku kombînasyonên veguherînê yên din hebin. Carinan riya ku dê pirsgirêk bimeşe dikare bi vebijarkên li Jira ve were hilbijartin.

Tevgera Task

Werin em li gavên sereke yên ku gava peywirek di nav xebata "Testkirina DEV + Testên Kanarya" de derbas dibe binihêrin:

1. Pêşdebir an PM peywirê diafirîne.

2. Pêşdebir erkê bi kar tîne. Piştî qedandinê, ew diguhere rewşa IN REVIEW.

3. Jira Webhookek ji mîkroxizmeta Jira re dişîne (berpirsiyarê entegrasyona bi Jira re).

4. Mîkroxizmeta Jira daxwazek ji karûbarê Flow re (berpirsiyar ji karên hundurîn ên ku kar tê de têne kirin) dişîne da ku karûbarê xebatê bide destpêkirin.

5. Di hundurê karûbarê Flow de:

  • Çavdêr ji peywirê re têne peywirdar kirin (Microservice bikarhêner ku her tiştî di derbarê bikarhêneran de dizane + Jira microservice).
  • Bi navgîniya mîkroxizmeta Çavkaniyê (ew bi depo û şaxan dizane, lê bi kodê bixwe re naxebite), lêgerînek li depoyên ku şaxek pirsgirêka me vedihewîne tê kirin (ji bo hêsankirina lêgerînê, navê şaxê bi pirsgirêkê re li hev dike jimare li Jira). Bi gelemperî, peywirek di yek depoyê de tenê şaxek heye; ev rêveberiya rêza bicîhkirinê hêsan dike û girêdana di navbera depoyan de kêm dike.
  • Ji bo her şaxek hatî dîtin, rêzika çalakiyan ya jêrîn tête kirin:

    i) Nûvekirina şaxê sereke (microservice Git ji bo xebata bi kodê).
    ii) Şax ji guhertinan ji hêla pêşdebir (microservice Bitbucket) ve tê asteng kirin.
    iii) Ji bo vê şaxê (microservice Bitbucket) Daxwazek Kêşkirinê tê çêkirin.
    iv) Peyamek li ser Daxwazek Vekêşana nû ji sohbetên pêşdebiran re tê şandin (Ji bo xebata bi ragihandinan re Microservice agahdar bike).
    v) Karûbarên çêkirin, ceribandin û bicihkirin li ser DEV (microservice Jenkins ji bo xebata bi Jenkins) têne destpêkirin.
    vi) Ger hemî gavên berê bi serfirazî qediyan, wê hingê Integro Pejirandina xwe di Daxwaza Kêşê de (microservice Bitbucket) dixe.

  • Integro li benda Pejirandina Daxwaza Kêşkirinê ya ji lêkolînerên destnîşankirî ye.
  • Gava ku hemî pejirandinên pêwîst hatin wergirtin (tevî ceribandinên otomatîkî bi erênî derbas bûne), Integro peywirê vediguhezîne rewşa Testê li ser Dev (Jira microservice).

6. Testers ceribandina erkê. Ger pirsgirêk tunebin, wê hingê peywir vediguhezîne statûya Ready For Build.

7. Integro "dibîne" ku peywir ji bo serbestberdanê amade ye û di moda kanariyê de dest bi danîna xwe dike (microservice Jenkins). Amadebûna ji bo berdanê ji hêla rêzek rêbazan ve tê destnîşankirin. Mînakî, peywir di statûya pêwîst de ye, li ser karên din kilît tune, heya niha barkirinên çalak ên vê mîkroxizmetê tune, hwd.

8. Kar ji bo statuya Kanaryayê (jira microservice) tê veguheztin.

9. Jenkins bi navgîniya Nomad ve di moda kanariyê de (bi gelemperî 1-3 mînak) peywirek dakêşanê dide destpêkirin û karûbarê çavdêriya berdanê (microservice DeployWatch) di derbarê bicîhkirinê de agahdar dike.

10. Mîkroxizmeta DeployWatch paşxaneya xeletiyê berhev dike û heke hewce bike, bertek nîşan dide. Ger paşnavê xeletiyê derbas bibe (norma paşîn bixweber tê hesibandin), pêşdebiran bi navgîniya Microservice Notify têne agahdar kirin. Ger piştî 5 hûrdeman pêşdebir bersiv nedaye (bitikîne Vegere an Bimîne), wê hingê vegerandina otomatîkî ya mînakên canary tê destpêkirin. Ger paşxane neyê derbas kirin, wê hingê pêşdebir pêdivî ye ku bi desta vekirina peywirê li Hilberînê bide destpêkirin (bi tikandina bişkokek di UI-yê de). Ger di nav 60 hûrdeman de pêşdebir dest bi belavkirina Hilberînê nekiriye, wê hingê dê ji ber sedemên ewlehiyê bûyerên kanaran jî paşde werin vegerandin.

11. Piştî destpêkirina belavkirina hilberînê:

  • Kar ji bo statûya Hilberînê (jira microservice) tê veguheztin.
  • Mîkroxizmeta Jenkins pêvajoya bicihkirinê dest pê dike û mîkroxizmeta DeployWatch di derbarê bicîhkirinê de agahdar dike.
  • Microservice DeployWatch kontrol dike ku hemî konteynerên li ser Hilberînê hatine nûve kirin (rewş hebûn ku ne hemî nehatin nûve kirin).
  • Bi navgîniya Microservice Notify, agahdariyek di derbarê encamên bicîhkirinê de ji Hilberînê re tê şandin.

12. Pêşdebiran dê 30 hûrdem hebin ku dest bi paşvexistina peywirek ji Hilberînê bikin ger tevgerek mîkroxizmeta çewt were dîtin. Piştî vê demê, peywir dê bixweber di nav masterê (Git microservice) de were yek kirin.

13. Piştî yekbûnek serketî ya nav masterê, dê statûya peywirê bibe Girtî (jira microservice).

Diagram wekî ku bi tevahî hûrgulî xuya nake (di rastiyê de hêj bêtir gav hene), lê ew dihêle hûn asta entegrasyonê di pêvajoyan de binirxînin. Em vê pilanê îdeal nabînin û pêvajoyên serbestberdana otomatîkî û piştgirîya bicîhkirinê baştir dikin.

Çi ye?

Ji bo pêşkeftina otomasyonê me planên mezin hene, mînakî, rakirina operasyonên bi destan di dema serbestberdana monolît de, baştirkirina çavdêriyê di dema bicîhkirina otomatîkî de, û baştirkirina danûstendina bi pêşdebiran re.

Lê em ji bo niha li vir rawestin. Me di vekolîna otomasyonê de gelek mijar bi serpêhatî veşart, hin kes qet nehatin destgirtin, ji ber vê yekê em ê kêfxweş bibin ku bersiva pirsan bidin. Em li benda pêşniyaran in ka çi bi hûrgulî veşêrin, di şîroveyan de binivîsin.

Source: www.habr.com

Add a comment