Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Дар RIT 2019 ҳамкори мо Александр Коротков гузориш дар бораи автоматикунонии рушд дар CIAN: барои содда кардани ҳаёт ва кор, мо платформаи Integro-и худро истифода мебарем. Он давраи ҳаёти вазифаҳоро пайгирӣ мекунад, таҳиягаронро аз амалиёти муқаррарӣ озод мекунад ва шумораи хатогиҳоро дар истеҳсолот ба таври назаррас коҳиш медиҳад. Дар ин паём, мо гузориши Искандарро пурра мекунем ва ба шумо мегӯям, ки чӣ гуна мо аз скриптҳои оддӣ ба омезиши маҳсулоти кушодаасос тавассути платформаи худ гузаштем ва гурӯҳи алоҳидаи автоматикунонии мо чӣ кор мекунад.
 

Сатҳи сифр

"Дараҷаи сифрӣ вуҷуд надорад, ман чунин чизро намедонам"
Мастер Шифу аз филми "Кунг-фу Панда"

Автоматикунонӣ дар CIAN пас аз 14 соли таъсисёбии ширкат оғоз ёфт. Он вакт дар бригадаи ободо-нй 35 кас буд. Бовар кардан душвор, дуруст? Албатта, автоматизатсия дар баъзе шаклҳо вуҷуд дошт, аммо дар соли 2015 як самти алоҳида барои ҳамгироии пайваста ва интиқоли код шакл гирифт. 

Он вақт мо як монолитии бузурги Python, C# ва PHP доштем, ки дар серверҳои Linux/Windows ҷойгир карда шуда буданд. Барои ҷойгир кардани ин ҳаюло, мо маҷмӯи скриптҳо доштем, ки онҳоро дастӣ иҷро мекардем. Инчунин монтажи монолит баргузор шуд, ки дар натиҷаи муноқишаҳо ҳангоми якҷоя кардани шохаҳо, ислоҳи камбудиҳо ва барқарорсозӣ "бо маҷмӯи вазифаҳои гуногун дар сохтмон" дарду ранҷ меовард. Раванди соддакардашуда чунин менамуд:

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Мо аз ин қаноатманд набудем ва мо мехостем як раванди такроршаванда, автоматӣ ва идорашавандаи сохтан ва ҷойгиркунӣ бунёд кунем. Барои ин ба мо системаи CI/CD лозим буд ва мо байни версияи ройгони Teamcity ва версияи ройгони Ҷенкинсро интихоб кардем, зеро мо бо онҳо кор кардем ва ҳарду аз ҷиҳати маҷмӯи функсияҳо ба мо мувофиқ буданд. Мо Teamcity-ро ҳамчун маҳсулоти навтарин интихоб кардем. Он вақт мо ҳанӯз аз меъмории микросервис истифода накарда будем ва интизор набудем, ки шумораи зиёди вазифаҳо ва лоиҳаҳо.

Мо ба фикри системаи худамон меоем

Татбиқи Teamcity танҳо як қисми кори дастӣ хориҷ карда шуд: он чизе, ки боқӣ мемонад, эҷоди дархостҳои кашидан, пешбурди масъалаҳо аз рӯи мақом дар Jira ва интихоби масъалаҳо барои озод кардан аст. Системаи Teamcity дигар наметавонад бо ин мубориза барад. Рохи минбаъдаи автоматизацияро интихоб кардан лозим буд. Мо имконоти кор бо скриптҳо дар Teamcity ё гузаштан ба системаҳои автоматикунонии тарафи сеюмро баррасӣ кардем. Аммо дар ниҳоят мо тасмим гирифтем, ки ба мо чандирии ҳадди аксар лозим аст, ки танҳо ҳалли худи мо метавонад онро таъмин кунад. Ин аст, ки версияи аввалини системаи автоматикунонии дохилӣ бо номи Integro пайдо шуд.

Teamcity бо автоматизатсия дар сатҳи оғоз кардани равандҳои сохтмон ва ҷойгиркунӣ сарукор дорад, дар ҳоле ки Integro ба автоматикунонии сатҳи боло дар равандҳои рушд тамаркуз кардааст. Зарур буд, ки кор бо масъалаҳо дар Jira бо коркарди коди сарчашмаи алоқаманд дар Bitbucket якҷоя карда шавад. Дар ин марҳила, Integro ҷараёнҳои кори худро барои кор бо вазифаҳои намудҳои гуногун оғоз кард. 

Дар робита ба афзоиши автоматикунонии равандҳои бизнес, шумораи лоиҳаҳо ва иҷроҳо дар Teamcity афзоиш ёфт. Ҳамин тавр, мушкилоти нав ба миён омад: як нусхаи ройгони Teamcity кофӣ набуд (3 агент ва 100 лоиҳа), мо як мисоли дигарро (3 агенти дигар ва 100 лоиҳа) илова кардем, баъд дигаре. Дар натиҷа, мо бо як системаи якчанд кластерҳо ба охир расидем, ки идора кардан душвор буд:

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Вақте ки савол дар бораи инстансияи 4-ум ба миён омад, мо фаҳмидем, ки мо наметавонем ин тавр зиндагӣ кунем, зеро хароҷоти умумии дастгирии 4 инстансия дигар дар ҳудуди ягон маҳдудият набуд. Савол дар бораи харидани Teamcity-и пулакӣ ё интихоби Ҷенкинсҳои ройгон ба миён омад. Мо дар бораи мисолҳо ва нақшаҳои автоматизатсия ҳисобҳо анҷом додем ва қарор додем, ки дар Ҷенкинс зиндагӣ мекунем. Пас аз чанд ҳафта, мо ба Ҷенкинс гузаштем ва баъзе дарди сарро, ки бо нигоҳ доштани якчанд мисолҳои Teamcity алоқаманданд, бартараф кардем. Аз ин рӯ, мо тавонистем ба рушди Integro ва мутобиқсозии Ҷенкинс барои худ тамаркуз кунем.

Бо афзоиши автоматикунонии асосӣ (дар шакли эҷоди автоматии дархостҳои Pull, ҷамъоварӣ ва нашри фарогирии Кодекс ва санҷишҳои дигар), хоҳиши қавӣ барои даст кашидан аз нашрҳои дастӣ ба қадри имкон ва додани ин кор ба роботҳо вуҷуд дорад. Илова бар ин, ширкат гузаштан ба микросервисҳои дохили ширкатро оғоз кард, ки интишори зуд-зуд ва ҷудо аз ҳамдигарро талаб мекард. Ҳамин тавр мо тадриҷан ба барориши автоматии хидматрасонии худ расидем (мо айни замон аз сабаби мураккабии раванд монолитро дастӣ мебарорем). Аммо, чунон ки одатан рӯй медиҳад, як мураккабии нав ба миён омад. 

Мо санҷишро автоматӣ мекунем

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Бо сабаби автоматикунонии релизҳо, равандҳои рушд, қисман аз сабаби гузаштани баъзе марҳилаҳои санҷиш суръат гирифтанд. Ва ин боиси муваккатан гум шудани сифат гардид. Ин ночиз ба назар мерасад, аммо дар баробари тезонидани нашрҳо, методологияи таҳияи маҳсулотро тағир додан лозим буд. Дар бораи автоматикунонии санҷиш, бедор кардани масъулияти шахсӣ (дар ин ҷо сухан дар бораи «қабули идея дар сар», на ҷаримаҳои пулӣ меравад) таҳиякунанда барои коди баровардашуда ва хатогиҳои он, инчунин тасмим гирифтан лозим буд. озод кардан / озод накардани вазифа тавассути ҷойгиркунии автоматӣ. 

Мушкилоти сифатро бартараф намуда, мо ба ду қарори муҳим омадем: мо ба гузаронидани санҷиши канарӣ шурӯъ кардем ва мониторинги автоматии заминаи хатогиро бо вокуниши автоматӣ ба зиёдатии он ҷорӣ кардем. Ҳалли якум имкон дод, ки то пурра ба истеҳсолот ворид шудани код хатогиҳои ошкоро пайдо карда шавад, дуюмӣ вақти ҷавобро ба мушкилот дар истеҳсолот кам кард. Хатохо, албатта, руй медиханд, вале мо бештари вакт ва кувваи худро на барои ислохи онхо, балки барои кам кардани онхо сарф мекунем. 

Дастаи автоматика

Дар айни замон мо як ҳайати 130 таҳиягарон дорем ва мо идома медиҳем калон шудан. Гурӯҳи муттаҳидшавӣ ва интиқоли кодҳо (минбаъд - Дастаи ҷойгиркунӣ ва ҳамгироӣ ё DI) аз 7 нафар иборат буда, дар 2 самт кор мекунад: таҳияи платформаи автоматикунонии Integro ва DevOps. 

DevOps барои муҳити Dev/Beta сайти CIAN, муҳити Integro масъул аст, ба таҳиягарон дар ҳалли мушкилот кӯмак мекунад ва равишҳои навро ба миқёси муҳитҳо таҳия мекунад. Самти рушди Integro ҳам ба худи Integro ва ҳам хидматҳои марбута, масалан, плагинҳо барои Jenkins, Jira, Confluence дахл дорад ва инчунин утилитаҳои ёрирасон ва барномаҳоро барои гурӯҳҳои таҳиякунанда таҳия мекунад. 

Дастаи DI бо дастаи Платформа, ки меъморӣ, китобхонаҳо ва равишҳои рушдро дар дохили он таҳия мекунад, ҳамкорӣ мекунад. Ҳамзамон, ҳар як таҳиякунанда дар дохили CIAN метавонад ба автоматизатсия саҳм гузорад, масалан, микроавтоматикунониро мувофиқи эҳтиёҷоти даста созад ё идеяи олиҷанобро дар бораи боз ҳам беҳтар кардани автоматизатсия мубодила кунад.

Торти қабати автоматизатсия дар CIAN

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Ҳама системаҳое, ки ба автоматизатсия машғуланд, метавонанд ба якчанд қабатҳо тақсим карда шаванд:

  1. Системаҳои беруна (Jira, Bitbucket ва ғайра). Гурӯҳҳои рушд бо онҳо кор мекунанд.
  2. Платформаи Integro. Аксар вақт, таҳиягарон мустақиман бо он кор намекунанд, аммо он чизест, ки тамоми автоматизатсияро нигоҳ медорад.
  3. Хизматрасонии интиқол, оркестрсозӣ ва кашф (масалан, Jeknins, Consul, Nomad). Бо ёрии онҳо, мо кодро дар серверҳо ҷойгир мекунем ва кафолат медиҳем, ки хидматҳо бо ҳамдигар кор мекунанд.
  4. Қабати физикӣ (серверҳо, OS, нармафзори алоқаманд). Рамзи мо дар ин сатҳ амал мекунад. Ин метавонад сервери ҷисмонӣ ё сервери виртуалӣ бошад (LXC, KVM, Docker).

Дар асоси ин консепсия, мо соҳаҳои масъулиятро дар дохили дастаи DI тақсим мекунем. Ду сатҳи аввал дар соҳаи масъулият дар самти рушди Integro ва ду сатҳи охир аллакай дар соҳаи масъулияти DevOps мебошанд. Ин ҷудоӣ ба мо имкон медиҳад, ки диққати худро ба вазифаҳо равона кунем ва ба ҳамкориҳо халал нарасонем, зеро мо ба ҳамдигар наздикем ва пайваста дониш ва таҷриба мубодила мекунем.

Бетаъхир

Биёед ба Integro тамаркуз кунем ва аз стеки технологӣ оғоз кунем:

  • CentOS 7
  • Docker + Nomad + Consul + Vault
  • Java 11 (монолити кӯҳнаи Integro дар Java 8 боқӣ мемонад)
  • Spring Boot 2.X + Config баҳори абрӣ
  • PostgreSql 11
  • Харгӯш 
  • Apache Ignite
  • Камунда (дарунсохт)
  • Grafana + Graphite + Prometheus + Jaeger + ELK
  • Web UI: React (CSR) + MobX
  • SSO: клавиатура

Мо ба принсипи рушди микросервис риоя мекунем, гарчанде ки мо мерос дар шакли монолитии версияи аввали Integro дорем. Ҳар як хидматрасонии хурд дар контейнери Docker-и худ кор мекунад ва хидматҳо тавассути дархостҳои HTTP ва паёмҳои RabbitMQ бо ҳамдигар муошират мекунанд. Микросервисҳо тавассути Консул якдигарро пайдо мекунанд ва ба он муроҷиат мекунанд ва аз тариқи SSO (Keycloak, OAuth 2/OpenID Connect) иҷозат медиҳанд.

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Ҳамчун мисоли воқеии ҳаёт, муошират бо Ҷенкинсро баррасӣ кунед, ки аз қадамҳои зерин иборат аст:

  1. Микросервиси идоракунии ҷараёни корӣ (минбаъд микросервиси Flow номида мешавад) мехоҳад, ки дар Ҷенкинс сохтмонро иҷро кунад. Барои ин, ӯ Консулро барои дарёфти IP: PORT-и хидматрасонии микросервис барои ҳамгироӣ бо Ҷенкинс (минбаъд микросервиси Ҷенкинс номида мешавад) истифода мебарад ва ба он дархости асинхронӣ барои оғози сохтани Ҷенкинс мефиристад.
  2. Пас аз гирифтани дархост, хидматрасонии хурди Ҷенкинс бо ID-и кор тавлид ва посух медиҳад, ки пас аз он метавонад барои муайян кардани натиҷаи кор истифода шавад. Ҳамзамон, он тавассути занги REST API сохтанро дар Ҷенкинс бармеангезад.
  3. Ҷенкинс сохтанро иҷро мекунад ва пас аз анҷомёбӣ вебхукро бо натиҷаҳои иҷро ба микросервиси Ҷенкинс мефиристад.
  4. Микросервиси Ҷенкинс, ки вебхукро гирифтааст, дар бораи анҷоми коркарди дархост паём тавлид мекунад ва натиҷаҳои иҷроро ба он замима мекунад. Паёми тавлидшуда ба навбати RabbitMQ фиристода мешавад.
  5. Тавассути RabbitMQ, паёми нашршуда ба микросервиси Flow мерасад, ки он дар бораи натиҷаи коркарди вазифаи худ тавассути мувофиқ кардани ID Job аз дархост ва паёми қабулшуда маълумот мегирад.

Ҳоло мо тақрибан 30 микросервис дорем, ки онҳоро ба чанд гурӯҳ тақсим кардан мумкин аст:

  1. Идоракунии конфигуратсия.
  2. Маълумот ва ҳамкорӣ бо корбарон (мессенҷерҳо, почта).
  3. Кор бо рамзи сарчашма.
  4. Интегратсия бо асбобҳои ҷойгиркунӣ (ҷенкинс, номад, консул ва ғайра).
  5. Мониторинг (релизҳо, хатогиҳо ва ғ.).
  6. Утилитҳои веб (UI барои идоракунии муҳити санҷиш, ҷамъоварии омор ва ғайра).
  7. Интегратсия бо трекерҳои вазифаҳо ва системаҳои шабеҳ.
  8. Идоракунии ҷараёни корӣ барои вазифаҳои гуногун.

Вазифаҳои ҷараёни корӣ

Integro фаъолиятҳои марбут ба давраи ҳаёти вазифаҳоро автоматӣ мекунад. Бо истилоҳҳои соддакардашуда, давраи ҳаёти вазифа ҳамчун ҷараёни кори вазифа дар Jira фаҳмида мешавад. Равандҳои рушди мо вобаста ба лоиҳа, намуди вазифа ва имконоти дар вазифаи мушаххас интихобшуда якчанд вариантҳои ҷараёни корӣ доранд. 

Биёед ба ҷараёни коре, ки мо аксар вақт истифода мебарем, бубинем:

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Дар диаграмма фишанг нишон медиҳад, ки гузариш ба таври худкор аз ҷониби Integro даъват карда мешавад, дар ҳоле ки тасвири инсон нишон медиҳад, ки гузариш аз ҷониби шахс дастӣ даъват карда мешавад. Биёед якчанд роҳҳоро дида бароем, ки вазифа дар ин ҷараёни кор метавонад бигирад.

Санҷиши пурраи дастӣ дар DEV+BETA бидуни санҷишҳои канарӣ (одатан ҳамин тавр мо монолит мебарорем):

Аз скриптҳо то платформаи шахсии мо: чӣ гуна мо рушдро дар CIAN автоматӣ кардем

Мумкин аст, ки дигар комбинатсияҳои гузариш вуҷуд дошта бошанд. Баъзан роҳеро, ки масъаларо пеш мегирад, тавассути вариантҳо дар Jira интихоб кардан мумкин аст.

Ҳаракати вазифа

Биёед қадамҳои асосиеро бубинем, ки ҳангоми гузаштани супориш тавассути ҷараёни кории "DEV Testing + Canary Tests" иҷро мешаванд:

1. Таҳиягар ё PM супоришро эҷод мекунад.

2. Таҳиягар вазифаро ба кор мегирад. Пас аз анҷом, он ба ҳолати IN REVIEW мегузарад.

3. Jira Webhook-ро ба микросервиси Jira мефиристад (барои ҳамгироӣ бо Jira масъул аст).

4. Хидмати хурди Jira барои оғоз кардани ҷараёни кор ба хидмати Flow (барои ҷараёнҳои дохилии кор масъул аст) дархост мефиристад.

5. Дар дохили хидмати Flow:

  • Баррасикунандагон ба вазифа таъин карда мешаванд (Хизматрасонии хурди корбарон, ки ҳама чизро дар бораи корбарон медонад + microservice Jira).
  • Тавассути микросервиси Source (он дар бораи анборҳо ва филиалҳо медонад, аммо бо худи код кор намекунад) ҷустуҷӯ барои анборҳо анҷом дода мешавад, ки шохаи масъалаи моро дар бар мегиранд (барои содда кардани ҷустуҷӯ, номи филиал бо масъала мувофиқат мекунад. рақам дар Jira). Аксар вақт, супориш дар як анбор танҳо як филиал дорад; ин идоракунии навбати ҷойгиркуниро осон мекунад ва пайвасти байни анборҳоро коҳиш медиҳад.
  • Барои ҳар як шохаи ёфтшуда, пайдарпайии амалҳои зерин иҷро карда мешавад:

    i) Навсозии филиали асосӣ (Git microservice барои кор бо код).
    ii) Филиал аз тағирот аз ҷониби таҳиякунанда манъ карда шудааст (Bitbucket microservice).
    iii) Дархости кашидан барои ин филиал сохта шудааст (Хизматрасонии хурди Bitbucket).
    iv) Паём дар бораи дархости нави кашидан ба чатҳои таҳиягарон фиристода мешавад (Огоҳӣ ба microservice барои кор бо огоҳиҳо).
    v) Дар DEV (микросервиси Ҷенкинс барои кор бо Ҷенкинс) вазифаҳо сохтан, санҷидан ва ҷойгиркунӣ оғоз мешаванд.
    vi) Агар ҳамаи қадамҳои қаблӣ бомуваффақият анҷом дода шаванд, он гоҳ Integro Тасдиқи худро дар дархости Pull (Bitbucket microservice) мегузорад.

  • Integro интизори тасвиб дар дархости кашидан аз баррасиҳои таъиншуда аст.
  • Ҳамин ки ҳама тасдиқҳои зарурӣ гирифта шуданд (аз ҷумла санҷишҳои автоматикунонидашуда мусбат гузаштанд), Integro вазифаро ба ҳолати Test on Dev (Jira microservice) интиқол медиҳад.

6. Санҷишҳо супоришро месанҷанд. Агар ягон мушкилот вуҷуд надошта бошад, пас вазифа ба ҳолати Омода барои Сохт интиқол дода мешавад.

7. Integro "мебинад", ки вазифа барои баровардан омода аст ва ҷойгиркунии онро дар реҷаи канарӣ (Microservice Jenkins) оғоз мекунад. Омодагӣ ба озодкунӣ бо маҷмӯи қоидаҳо муайян карда мешавад. Масалан, супориш дар ҳолати зарурӣ қарор дорад, дар дигар вазифаҳо қуфлҳо вуҷуд надоранд, дар айни замон боркунии фаъоли ин микросервис вуҷуд надорад ва ғайра.

8. Вазифа ба мақоми Canary (Jira microservice) интиқол дода мешавад.

9. Ҷенкинс як вазифаи густаришро тавассути Nomad дар реҷаи канарӣ оғоз мекунад (одатан 1-3 мисол) ва хадамоти мониторинги релизҳоро (DeployWatch microservice) дар бораи ҷойгиркунӣ огоҳ мекунад.

10. Микросервиси DeployWatch заминаи хатогиҳоро ҷамъ мекунад ва дар ҳолати зарурӣ ба он вокуниш нишон медиҳад. Агар заминаи хато аз ҳад зиёд бошад (меъёри замина ба таври худкор ҳисоб карда мешавад), таҳиягарон тавассути микросервиси Notify огоҳ карда мешаванд. Агар пас аз 5 дақиқа таҳиякунанда посух надиҳад (Бозгашт ё монданро пахш кунед), пас бозгашти автоматии мисолҳои канарӣ оғоз мешавад. Агар замина аз ҳад зиёд набошад, он гоҳ таҳиякунанда бояд ба таври дастӣ ҷойгиркунии вазифаро ба Истеҳсолот оғоз кунад (бо пахш кардани тугма дар UI). Агар дар давоми 60 дақиқа таҳиякунанда ҷойгиркуниро ба Истеҳсолот оғоз накунад, пас намунаҳои канарӣ низ бо сабабҳои амниятӣ баргардонида мешаванд.

11. Пас аз ба кор андохтани ҷойгиркунӣ ба истеҳсолот:

  • Вазифа ба ҳолати истеҳсолӣ (Jira microservice) интиқол дода мешавад.
  • Микросервиси Ҷенкинс раванди ҷобаҷокуниро оғоз мекунад ва микросервиси DeployWatchро дар бораи ҷойгиркунӣ огоҳ мекунад.
  • Микросервиси DeployWatch тафтиш мекунад, ки ҳама контейнерҳо дар истеҳсолот нав карда шудаанд (ҳодисаҳое буданд, ки на ҳама нав карда шудаанд).
  • Тавассути микросервиси Notify, огоҳинома дар бораи натиҷаҳои ҷойгиркунӣ ба Истеҳсолот фиристода мешавад.

12. Дар сурати ошкор шудани рафтори нодурусти хидматрасонии хидматрасонӣ, таҳиягарон 30 дақиқа доранд, то ба бозгардонидани супориш аз Истеҳсол шурӯъ кунанд. Пас аз ин вақт, вазифа ба таври худкор ба устод (Git microservice) якҷоя карда мешавад.

13. Пас аз якҷояшавии бомуваффақият ба усто, ҳолати вазифа ба пӯшида иваз карда мешавад (Хизматрасонии микро Jira).

Диаграмма худро комилан муфассал вонамуд намекунад (дар асл қадамҳои бештар вуҷуд доранд), аммо он ба шумо имкон медиҳад, ки дараҷаи ҳамгироиро ба равандҳо арзёбӣ кунед. Мо ин схемаро идеалӣ намешуморем ва равандҳои озодкунии автоматӣ ва дастгирии ҷойгиркуниро такмил медиҳем.

Ин чӣ аст?

Мо барои инкишофи автоматика накшахои калон дорем, масалан, бархам додани амалиёти дастй хангоми барориши монолит, бехтар намудани назорат дар вакти чорй намудани автоматикунонй ва бехтар намудани алока бо тахиягарон.

Аммо биёед ҳоло дар ин ҷо бас кунем. Мо бисёр мавзӯъҳоро дар баррасии автоматикунонӣ рӯякӣ фаро гирифтем, ба баъзеи онҳо умуман дахл накарданд, аз ин рӯ мо бо омодагӣ ба саволҳо посух хоҳем дод. Мо интизори пешниҳодҳо дар бораи он, ки ба таври муфассал чиро бояд фаро гирем, дар шарҳҳо нависед.

Манбаъ: will.com

Илова Эзоҳ