Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

RIT 2019, saaxiibkay Alexander Korotkov ayaa sameeyay warbixin ku saabsan automation of development at CIAN: si loo fududeeyo nolosha iyo shaqada, waxaan isticmaalnaa madal Integro noo gaar ah. Waxay la socotaa meertada nolosha ee hawlaha, waxay yaraynaysaa horumarinta hawlaha caadiga ah waxayna si weyn u yareysaa tirada cayayaanka wax soo saarka. Maqaalkan, waxaanu ku buuxin doonaa warbixinta Alexander waxaanan kuu sheegi doonaa sida aan uga soo baxnay qoraallada fudud ilaa la isku daro alaabada isha furan iyada oo loo marayo madal noo gaar ah iyo waxa kooxdayada otomatiga ah ay sameeyaan.
 

Heer eber

"Ma jiro wax la yiraahdo heerka eber, ma aqaan waxaas oo kale"
Master Shifu oo ka socda filimka "Kung Fu Panda"

Automation-ka CIAN wuxuu bilaabmay 14 sano kadib markii shirkadda la aasaasay. Waqtigaas waxaa kooxda horumarinta ku jiray 35 qof. Way adag tahay in la rumaysto, sax? Dabcan, automation-ku wuxuu u jiray nooc ka mid ah, laakiin jiho gaar ah oo loogu talagalay isdhexgalka joogtada ah iyo gaarsiinta koodka ayaa bilaabay inuu qaabeeyo 2015. 

Waqtigaas, waxaan haysanay monolith weyn oo Python, C # iyo PHP ah, oo la geeyay server-yada Linux/Windows. Si loo geeyo bahalkan, waxaanu haynay qoraalo badan oo aanu gacanta ku wadnay. Waxa kale oo jiray shirkii monolith, kaas oo keenay xanuun iyo rafaad ay sabab u tahay isku dhacyada marka la isku daro laamaha, hagaajinta cilladaha, iyo dib u dhiska "hawlaha kala duwan ee dhismaha." Hannaanka la fududeeyay wuxuu u ekaa sidan:

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Kumaanu faraxsanayn tan, waxaana aanu rabnay in aanu dhisno qaab dhismo iyo hawlgelin lagu celin karo, si toos ah oo la maamuli karo. Taas awgeed, waxaan u baahanahay nidaamka CI / CD, waxaanan doorannay inta u dhaxaysa nooca bilaashka ah ee Teamcity iyo nooca bilaashka ah ee Jenkins, maadaama aan la shaqeynay iyaga oo labaduba nagu habboon yihiin marka la eego qaabka hawlaha. Waxaan u doorannay kooxda sida wax soo saar dhawaanahan. Waqtigaas, weli maynaan isticmaalin qaab-dhismeedka microservice mana aanan fileynin tiro badan oo hawlo iyo mashruucyo ah.

Waxaan u nimid fikradda nidaamkayaga

Hirgelinta koox-hawleedka waxa ay meesha ka saartay qayb ka mid ah shaqada gacanta: waxa hadhay waa abuurista Codsiyada Jiidista, kor u qaadida arrimaha heerka Jira, iyo xulashada arrimaha la sii daayo. Nadaamka Kooxda-kooxdu mar dambe ma la qabsan karo tan. Waxay ahayd lagama maarmaan in la doorto jidka otomatiga dheeraadka ah. Waxaan tixgelinay xulashooyinka ku shaqeynta qoraallada gudaha Kooxda ama u beddelashada nidaamyada automation-ka qolo saddexaad. Laakiin ugu dambeyntii waxaan go'aansanay in aan u baahannahay dabacsanaan ugu badan, taas oo kaliya oo xal noo gaar ah ay bixin karto. Tani waa sida uu u muuqday nuqulkii ugu horreeyay ee nidaamka automation-ka gudaha ee loo yaqaan Integro.

Koox-kooxeedku waxa ay wax ka qabtaan automation-ka heerka bilaabista hab-dhisidda iyo geynta, halka Integro ay diiradda saartay hab-raaca heerka sare ee otomaatiga ah ee hababka horumarinta. Waxay ahayd lagama maarmaan in la isku daro shaqada iyo arrimaha Jira iyo habaynta koodhka isha ee la xidhiidha Bitbucket. Marxaladdan, Integro waxay bilowday inay yeelato hawl-socod u gaar ah oo ay kula shaqaynayso hawlo noocyo kala duwan ah. 

Sababo la xiriira kororka automation-ka ee hababka ganacsiga, tirada mashaariicda iyo socodsiinta kooxda ayaa kordhay. Markaa dhibaato cusub ayaa timid: hal tusaale oo koox-kooxeedka bilaashka ah kuma filna (3 wakiil iyo 100 mashruuc), waxaanu ku darnay tusaale kale (3 wakiil oo dheeraad ah iyo 100 mashruuc), ka dibna mid kale. Natiijo ahaan, waxaan ku soo gabagabeynay nidaam ka kooban dhowr koox, oo ay adagtahay in la maareeyo:

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Markii su'aasha tusaalaha 4-aad ay soo baxday, waxaan ogaanay inaanan sii wadi karin inaan sidan ku sii noolaan karno, sababtoo ah wadarta kharashka taageerada 4 xaaladood ayaan hadda ku jirin wax xaddidan. Su'aashu waxay kacday iibsashada kooxda lacag bixinta ama doorashada Jenkins bilaashka ah. Waxaan samaynay xisaabin ku saabsan tusaalooyinka iyo qorshayaasha otomaatiga ah waxaanan go'aansannay inaan ku noolaan doonno Jenkins. Dhowr toddobaad ka dib, waxaan u wareegnay Jenkins oo aan meesha ka saarnay qaar ka mid ah madax-xanuunkii la xiriiray ilaalinta xaalado badan oo koox-kooxeed. Sidaa darteed, waxaan awoodnay inaan diirada saarno horumarinta Integro iyo habeynta Jenkins nafteena.

Iyada oo kobaca otomatiga aasaasiga ah (oo ah qaab abuurista otomaatig ah ee Codsiyada Jiidista, ururinta iyo daabacaadda caymiska Xeerka iyo jeegaga kale), waxaa jira rabitaan xoog leh oo ah in laga tago siidaynta buug-gacmeedka intii suurtagal ah oo la siiyo shaqadan robots. Intaa waxaa dheer, shirkaddu waxay bilowday inay u guurto adeegaha yaryar ee shirkadda, kuwaas oo u baahan in si joogto ah loo sii daayo, iyo si gooni ah midba midka kale. Tani waa sida aan si tartiib tartiib ah ugu nimid si otomaatig ah siideynta adeegyadeena yar-yar (waxaan hadda ku sii deyneynaa monolith gacan ahaan sababtoo ah kakanaanta habka). Laakiin, sida caadiga ah, kakanaanta cusub ayaa kacday. 

Si otomaatig ah ayaanu u tijaabinaynaa

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Sababo la xiriira otomaatiga ah ee sii deynta, hababka horumarku waa ay dardar galiyeen, qayb ahaan waxaa sabab u ah ka boodida marxaladaha imtixaanada qaarkood. Taasina waxay keentay in tayada ku meel gaadhka ah ay lumiso. Waxay u egtahay mid aan waxtar lahayn, laakiin iyada oo la socota dardargelinta sii deynta, waxay ahayd lagama maarmaan in la beddelo habka horumarinta alaabta. Waxay ahayd lagama maarmaan in laga fekero otomatiga imtixaanka, gelinta mas'uuliyadda shakhsi ahaaneed (halkan waxaan ka hadleynaa "ogolaanshaha fikradda madaxa", ma aha ganaax lacageed) ee horumarinta code-ka la sii daayay iyo cayayaanka ku jira, iyo sidoo kale go'aanka sii dayn/aan sii dayn hawl iyada oo si toos ah loo dirayo. 

Ciribtirka dhibaatooyinka tayada, waxaan gaadhnay laba go'aan oo muhiim ah: waxaan bilownay inaan sameyno tijaabinta canary waxaanan soo bandhignay kormeer toos ah oo ku saabsan asalka qaladka iyadoo si toos ah looga jawaabayo xad-dhaafkeeda. Xalka ugu horreeya wuxuu suurtogal ka dhigay in la helo khaladaad muuqda ka hor inta aan koodhka si buuxda loo sii dayn wax soo saarka, tan labaad waxay yaraysay wakhtiga jawaabta dhibaatooyinka wax soo saarka. Khaladaadka, dabcan, way dhacaan, laakiin waxaan ku bixinaa waqtigeena iyo dadaalkeena inta badan ma sixino, laakiin inaan yareyno iyaga. 

Kooxda Automation-ka

Waxaan hadda haysanaa shaqaale ka kooban 130 horumariye, waanu sii wadnaa koraan. Kooxda is dhexgalka joogtada ah iyo soo gudbinta koodka (kadib loo tixraaco sida Deploy and Integration ama kooxda DI) waxay ka kooban yihiin 7 qof waxayna ka shaqeeyaan jihooyinka 2: horumarinta qalabka iswada ee Integro iyo DevOps. 

DevOps waxay mas'uul ka tahay deegaanka Dev/Beta ee goobta CIAN, deegaanka Integro, waxay ka caawisaa horumariyeyaasha inay xalliyaan mashaakilaadka oo ay horumariyaan habab cusub oo lagu cabbiro jawiga. Jihada horumarinta Integro waxay la tacaalaysaa labadaba Integro lafteeda iyo adeegyada la xidhiidha, tusaale ahaan, plugins ee Jenkins, Jira, Confluence, iyo sidoo kale horumarinta utility iyo codsiyada kooxaha horumarinta. 

Kooxda DI waxay si wada jir ah ula shaqeeyaan kooxda Platform, kuwaas oo horumariya dhismaha, maktabadaha, iyo hababka horumarinta gudaha. Isla mar ahaantaana, horumariye kasta oo ka tirsan CIAN wuxuu gacan ka geysan karaa iswada, tusaale ahaan, samee micro-automation si uu ugu habboonaado baahiyaha kooxda ama la wadaago fikrad qabow oo ku saabsan sida otomatiga looga dhigo mid ka sii wanaagsan.

Keega lakabka otomaatiga ah ee CIAN

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Dhammaan nidaamyada ku lug leh otomatiga waxaa loo qaybin karaa dhowr lakab:

  1. Nidaamyada dibadda (Jira, Bitbucket, iwm.). Kooxaha horumarinta ayaa la shaqeeya iyaga.
  2. Madal Integro. Inta badan, horumariyayaashu si toos ah ulama shaqeeyaan, laakiin waa waxa ka dhigaya in dhammaan otomaatiga uu socdo.
  3. Bixinta, abaabulka iyo adeegyada sahaminta (tusaale ahaan, Jeknins, Qunsulka, Nomad). Caawinaadkooda, waxaan ku dhejineynaa koodka server-yada waxaanan hubineynaa in adeegyadu ay wada shaqeeyaan.
  4. Lakabka jirka (servers, OS, software la xiriira). Xeerkayagu wuxuu ku shaqeeyaa heerkan. Tani waxay noqon kartaa mid ka mid ah server-ka jirka ama mid toos ah (LXC, KVM, Docker).

Iyada oo ku saleysan fikraddan, waxaan u qaybineynaa aagagga mas'uuliyadda gudaha kooxda DI. Labada heer ee ugu horreeya waxay ku yaalaan aagga mas'uuliyadda jihada horumarinta Integro, iyo labadii heer ee ugu dambeeyay waxay horeyba ugu jireen aagga mas'uuliyadda DevOps. Kala soocidaani waxay noo ogolaaneysaa inaan diirada saarno hawlaha oo aan faragalineynin isdhexgalka, maadaama aan isku dhownahay oo aan si joogto ah isku dhaafsano aqoonta iyo khibradda.

Ansaxsan

Aan diiradda saarno Integro oo aan ku bilowno xirmada tignoolajiyada:

  • CentOS 7
  • Docker + Nomad + Qunsulka + Vault
  • Java 11 (Integro monolith-kii hore wuxuu ku sii jirayaa Java 8)
  • Bootka Guga 2.X + Qaabaynta Guga Cloud
  • PostgreSql 11
  • BakayleMQ 
  • Apache Ignite
  • Camunda (ku dheggan)
  • Grafana + Graphite + Prometheus + Jaeger + ELK
  • Shabakadda UI: React (CSR) + MobX
  • SSD: Koofiyad

Waxaan u hoggaansanahay mabda'a horumarinta adeeg-yaraha, inkasta oo aan leenahay dhaxal ahaan qaab monolith ah oo ah nooca hore ee Integro. Adeeg kasta oo yar-yar wuxuu ku shaqeeyaa weelkiisa Docker, adeegyaduna waxay ku wada xiriiraan midba midka kale codsiyada HTTP iyo fariimaha RabbitMQ. Adeegga yar-yar ayaa midba midka kale ka helaa qunsulka oo ka codsada, iyaga oo u gudbinaya oggolaanshaha SSO (Keycloak, OAuth 2/OpenID Connect).

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Tusaale ahaan nolosha dhabta ah, tixgeli inaad la falgasho Jenkins, kaas oo ka kooban tallaabooyinka soo socda:

  1. Microservice-ka maaraynta socodka shaqada (kadib loogu yeero adeegaha Flow microservice) wuxuu rabaa inuu dhismo ka wado Jenkins. Si tan loo sameeyo, wuxuu u adeegsadaa Qunsulka si uu u helo IP:PORT-ka adeega-yaraha ee la-dhexgalka Jenkins (oo hadda loo yaqaan Jenkins microservice) wuxuuna u soo diraa codsi aan caadi ahayn si uu u bilaabo dhismaha Jenkins.
  2. Ka dib markii la helo codsi, Jenkins microservice ayaa soo saara oo ku jawaaba Aqoonsiga Shaqada, kaas oo markaa loo isticmaali karo in lagu aqoonsado natiijada shaqada. Isla mar ahaantaana, waxay kicisaa dhismaha Jenkins iyada oo loo marayo wicitaanka REST API.
  3. Jenkins wuxuu sameeyaa dhismaha oo, ka dib marka la dhammeeyo, wuxuu u soo diraa webhook natiijooyinka fulinta ee adeegga yar yar ee Jenkins.
  4. Adeegga yar yar ee Jenkins, ka dib markii uu helay webhook, wuxuu abuuraa fariin ku saabsan dhamaystirka habaynta codsiga waxayna ku lifaaqdaa natiijada fulinta. Fariinta la soo saaray waxaa loo diraa safka RabbitMQ.
  5. Iyadoo loo marayo RabbitMQ, fariinta la daabacay waxay gaartaa Flow microservice, kaas oo wax ka barta natiijada ka shaqeynta hawsheeda iyada oo la mid ah aqoonsiga shaqada ee codsiga iyo fariinta la helay.

Hadda waxaan haynaa ilaa 30 microservices, kuwaas oo loo qaybin karo dhowr kooxood:

  1. Maamulka habaynta.
  2. Macluumaadka iyo isdhexgalka isticmaalayaasha (farimaha, boostada).
  3. Ku shaqaynta koodka isha
  4. Ku-dhex-galka aaladaha geynta (jenkins, reer-guuraaga, qunsulka, iwm.).
  5. Korjoogteynta (sii daynta, khaladaadka, iwm.).
  6. Adeegyada shabakada (UI ee maaraynta deegaanka tijaabada, ururinta tirakoobka, iwm.).
  7. Isdhexgalka leh raad-raacayaasha hawsha iyo nidaamyada la midka ah.
  8. Maareynta socodka shaqada ee hawlo kala duwan.

Hawlaha socodka shaqada

Integro waxay toosisaa hawlaha la xidhiidha meertada nolosha hawsha. Erayada la fududeeyay, meertada nolosha ee hawsha waxaa loo fahmi doonaa sida ay u socoto hawsha Jiira. Nidaamyada horumarinteena waxay leeyihiin dhowr kala duwanaansho shaqo oo ku xiran mashruuca, nooca shaqada iyo xulashooyinka lagu doortay hawl gaar ah. 

Aynu eegno habka shaqada ee aan inta badan isticmaalno:

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Jaantuska, gearku wuxuu muujinayaa in kala-guurka si toos ah loogu yeero Integro, halka sawirka bini'aadamka uu muujinayo in kala-guurka loogu yeero gacanta. Aynu eegno dhowr waddo oo ay hawshu u mari karto socodka shaqadan.

Tijaabada gacanta oo dhammaystiran ee DEV+BETA iyada oo aan la helin tijaabooyin kanary ah (badanaa sidan waa sida aan u sii dayno monolith):

Laga soo bilaabo qoraallada ilaa madal noo gaar ah: sida aan otomaatig ugu samaynay horumarka CIAN

Waxaa jiri kara isku-dhafka kala-guurka kale. Mararka qaarkood dariiqa ay arintu mari doonto waxaa lagu dooran karaa ikhtiyaarada Jira.

Dhaqdhaqaaqa hawsha

Aynu eegno tillaabooyinka ugu muhiimsan ee la sameeyo marka hawshu u gudubto "Tijaabada DEV + Imtixaannada Canary" socodka shaqada:

1. Horumarinta ama PM ayaa abuuraya hawsha.

2. horumariyahu waxa uu qaataa hawsha si uu u shaqeeyo. Ka dib marka la dhammeeyo, waxay u wareegtaa heerka DIB U EEGIDDA.

3. Jira waxay u soo dirtaa Webhook adeegyaraha Jira (mas'uul ka ah la-qabsiga Jira).

4. Adeegga yar ee Jira ayaa codsi u diraya adeega socodka (mas'uul ka ah socodka shaqada gudaha ee shaqada lagu qabanayo) si loo bilaabo socodka shaqada.

5. Gudaha adeega socodka:

  • Dib u eegis ayaa loo xilsaaray hawsha (Isticmalayaasha microservice oo wax walba ka yaqaan isticmaalayaasha + Jira microservice).
  • Iyada oo loo marayo Microservice Source (waxay ka warqabtaa kaydka iyo laamaha, laakiin kuma shaqeyso koodhka laftiisa), waxaa la raadiyaa bakhaarro ay ku jiraan laanta qaddiyadeena (si loo fududeeyo raadinta, magaca laanta ayaa ku beegan arrinta). Jira). Inta badan, shaqadu waxay ku leedahay hal laan oo keliya hal kayd; tani waxay fududaynaysaa maaraynta safka geynta waxayna yaraynaysaa xidhiidhka ka dhexeeya kaydadka.
  • Laan kasta oo la helo, tallaabooyinka taxanaha ah ee soo socda ayaa la sameeyaa:

    i) Cusbooneysiinta laanta sare (Git microservice ee la shaqaynta koodka).
    ii) Laanta waxaa ka xannibay isbeddelada horumariyaha (Bitbucket microservice).
    iii) Codsi Jiid ayaa loo sameeyay laantan (Bitbucket microservice).
    iv) Farriin ku saabsan Codsiga Jiidista cusub ayaa loo diraa wada sheekaysiga horumariyaha (Ogaysii adeegaha yar yar ee la shaqaynta ogeysiisyada).
    v) Dhis, tijaabi oo geeyaan hawlaha waxa laga bilaabay DEV (Jenkins microservice ee la shaqaynta Jenkins).
    vi) Haddii dhammaan tillaabooyinkii hore ay si guul leh u dhammaadaan, markaas Integro waxay ku dhejinaysaa Codsiga Jiididda (Bitbucket microservice).

  • Integro waxay sugaysaa Oggolaanshaha Codsiga Jiididda ee ka imanaya dib-u-eegayaasha la magacaabay.
  • Sida ugu dhakhsaha badan dhammaan oggolaanshaha lagama maarmaanka ah ee la helo (ay ku jiraan imtixaannada otomaatiga ah ayaa si togan u gudbay), Integro waxay u wareejisaa hawsha si ay u tijaabiso heerka Dev (Jira microservice).

6. Tijaabayaashu waxay tijaabiyaan hawsha. Haddii aysan jirin wax dhibaato ah, markaa hawsha waxaa loo wareejiyaa heerka u diyaarsan dhismaha.

7. Integro "waxay arkaysaa" in hawshu ay diyaar u tahay sii daynta waxayna ku bilaabataa hawlgelinteeda qaabka canary (Jenkins microservice). U diyaargarowga sii deynta waxaa lagu go'aamiyaa xeerar dhowr ah. Tusaale ahaan, hawshu waxay ku jirtaa heerka loo baahan yahay, ma jiraan wax quful ah oo ku saabsan hawlaha kale, hadda ma jiraan wax qabadyo firfircoon oo adeegan yar yar, iwm.

8. Hawsha waxa loo wareejiyaa xaalada Canary (Jira microservice).

9. Jenkins waxa uu bilaabay hawl diris isagoo dhex maraya Nomad qaab canary ah (badanaa 1-3 xaaladood) oo ogaysiiya adeega la socodka sii daynta (DeployWatch microservice) wax ku saabsan hawlgelinta.

10. Adeegga yar ee DeployWatch wuxuu ururiyaa asalka khaladka oo ka falceliyaa, haddii loo baahdo. Haddii asalka khaladka la dhaafo (caadiga asalka si toos ah ayaa loo xisaabiyaa), horumariyeyaasha waxaa lagu ogeysiiyaa iyada oo loo marayo Notify microservice. Haddii 5 daqiiqo ka dib horumariyuhu aanu ka jawaabin (guji Dib u celi ama Joog), ka dib dib-u-soo-noqod toos ah ee tusaalooyinka canary-ga ayaa bilaabmaya. Haddii asalka aan la dhaafin, ka dib horumariyuhu waa inuu si gacanta ah u bilaabo hawlgelinta hawsha wax-soo-saarka (adigoo gujinaya badhanka UI). Haddii 60 daqiiqo gudahood horumariyuhu aanu bilaabin dirista Wax-soo-saarka, markaa tusaalaha kanary-ga sidoo kale dib ayaa loo rogi doonaa sababo ammaan dartood.

11. Ka dib markii la bilaabay hawlgelinta Wax-soo-saarka:

  • Hawsha waxaa loo wareejiyaa heerka Wax soo saarka (Jira microservice).
  • Adeegga yar yar ee Jenkins wuxuu bilaabaa habka dirida wuxuuna ogeysiinayaa adeeg-yaraha DeployWatch wax ku saabsan hawlgelinta.
  • Adeegga yar yar ee DeployWatch wuxuu hubinayaa in dhammaan weelasha ku jira Wax soo saarka la cusboonaysiiyay (waxaa jiray kiisas aan dhammaan la cusboonaysiin).
  • Iyada oo loo marayo Notify microservice, ogeysiis ku saabsan natiijooyinka geynta ayaa loo diraa Wax soo saarka.

12. Horumariyayaashu waxay heli doonaan 30 daqiiqo si ay u bilaabaan dib u soo celinta hawsha wax soo saarka haddii la ogaado habdhaqanka adeeg-yaraha ee khaldan. Wakhtigan ka dib, hawsha si toos ah ayaa loogu milmi doonaa Master (Git microservice).

13. Kadib ku biirista guusha leh ee sayid, heerka hawsha waxa loo bedeli doonaa Xidhan (Jira microservice).

Jaantusku iskama dhigayo inuu si buuxda u faahfaahsan yahay (xaqiiqda waxaa jira xitaa tillaabooyin badan), laakiin waxay kuu ogolaaneysaa inaad qiimeyso heerka isdhexgalka ee hababka. Uma aragno qorshahan mid ku habboon waxaanan hagaajineynaa hababka siideynta tooska ah iyo taageerada geynta.

Maxaa ku xiga

Waxaan leenahay qorshooyin waaweyn oo ku saabsan horumarinta otomaatiga, tusaale ahaan, baabi'inta hawlgallada gacanta inta lagu jiro siidaynta monolith, hagaajinta la socodka inta lagu jiro hawlgalinta tooska ah, iyo hagaajinta isdhexgalka horumariyeyaasha.

Laakiin aan hadda ku ekaano halkan. Waxaan mowduucyo badan uga soo hadalnay dib u eegista otomaatiga ah si hoose, qaarkood lama taaban, marka waxaan ku farxi doonnaa inaan ka jawaabno su'aalaha. Waxaan sugeynaa talooyin ku saabsan waxa lagu daboolayo si faahfaahsan, ku qor faallooyinka.

Source: www.habr.com

Add a comment