Arendasime DevOpsi nii hĂ€sti kui suutsime. Meid oli kaheksa ja Vasja oli neist kĂ”ige lahedam. WindowsĂkitselt lahkus Vasja ja mul oli ĂŒlesanne kĂ€ivitada uus projekt, mis varustab Windows-arendus. Kui ma kogu virna lauale viskasin Windows-arengud, siis sain aru, et olukord on valus...
Nii see lugu algab Aleksandra Sinchinova edasi Kui juhtiv spetsialist ettevĂ”ttest lahkus Windows, Aleksander mĂ”tles, mida nĂŒĂŒd teha. Mine aadressile LinuxMuidugi! Aleksander rÀÀgib teile, kuidas tal Ă”nnestus pretsedent luua ja osa tĂ”lkida Windows arengud Linux kasutades nĂ€itena 100 000 lĂ”ppkasutaja jaoks lĂ”petatud projekti.

Kuidas projekti TFS-i, Puppeti ja muude tööriistade abil RPM-ile lihtsalt ja vaevata edastada? Linux .NET Core? Kuidas hallata projekti andmebaasi versioonimist, kui arendaja kuuleb sĂ”nu Postgres ja Flyway esimest korda ning tĂ€htaeg on ĂŒlehomme? Kuidas integreerida Dockeriga? Kuidas motiveerida .NET arendajaid loobuma Windows ja smuutid Nukule ja LinuxKuidas lahendada ideoloogilisi konflikte, kui teenite Windows Kas sul pole energiat, soovi vĂ”i ressursse tootmiskeskkonnaga alustamiseks? Alexanderi ettekanne kĂ€sitleb seda, aga ka veebi juurutamist, testimist, CI-d, TFS-i tavasid olemasolevates projektides ning loomulikult katkiseid ja toimivaid lahendusi.

Niisiis, Vasja lahkus, ĂŒlesanne oli minu ja arendajad ootasid kannatamatult kahvlitega. Kui ma lĂ”puks taipasin, et Vasja tagasi ei tule, asusin asja kallale. Esmalt hindasin meie masinapargi Win VM-ide protsenti. Ć ansid olid tema vastu. Windows.

Kuna me tegeleme aktiivselt DevOpsi arendamisega, mĂ”istsin, et peame uute rakenduste juurutamise lĂ€henemisviisis midagi muutma. Oli ainult ĂŒks lahendus: viia kĂ”ik vĂ”imaluse korral natiivsele tasemele. LinuxGoogle aitas mind â sel ajal oli .Net juba portitud Linux, ja ma sain aru, et see oligi lahendus!
Miks .NET tuum koos Linux?
Sellel oli mitu pĂ”hjust. Maksmise ja maksmata jĂ€tmise vahel valides valiks enamik inimesi viimase â nagu ka mina. MSDB litsents maksab umbes 1000 dollarit ja virtuaalsete masinate laevastiku haldamine Windows ulatub sadadesse dollaritesse. Suure ettevĂ”tte jaoks on see mĂ€rkimisvÀÀrne kulu. SeetĂ”ttu kokkuhoid - esimene pĂ”hjus. Mitte kĂ”ige olulisem, kuid ĂŒks olulisemaid.
Virtuaalsed masinad Windows tarbivad rohkem ressursse kui nende vennad Linux - nad on raskedArvestades suurettevÔtte suurust, valisime Linux.
SĂŒsteem on lihtsalt integreeritud olemasolevasse CI-ssePeame end progressiivseteks DevOpsi esindajateks, kasutame Bamboot, Jenkinsit ja GitLab CI-d, seega suurem osa meie tööst toimub Linux.
Viimane pĂ”hjus on mugav kaaslane. Me pidime langetama sisenemisbarjÀÀri "hooldajatele" â neile, kes mĂ”istavad tehnilist poolt, tagavad tööaja ja haldavad teenuseid teisest liinist alates. Nad olid juba sĂŒsteemiga tuttavad. Linux, seega on neil uue toote mĂ”istmine, toetamine ja hooldamine palju lihtsam kui sarnaste tarkvarafunktsioonide mĂ”istmiseks lisaressursse kulutada. Windows platvorm.
NÔuded
EelkÔige - uue lahenduse mugavus arendajateleMitte kÔik neist polnud muutusteks valmis, eriti pÀrast seda, kui sÔna oli lausutud. LinuxArendajad tahavad oma lemmik Visual Studiot, TFS-i automatiseeritud ehitustestidega ja smoothies'eid. See, kuidas nad tootmiskeskkonda jÔuavad, pole nende jaoks oluline. SeetÔttu otsustasime tuttavat protsessi mitte muuta ja selle sinnapaika jÀtta. Windows- arengud jÀÀvad samaks.
Vaja uus projekt integreerida olemasolevasse CI-sse. Rööpad olid juba olemas ja kogu töö tuli teha konfiguratsioonihaldussĂŒsteemi parameetreid, aktsepteeritud tarnestandardeid ja seiresĂŒsteeme arvestades.
Toetamise ja kasutamise lihtsus, mis on kÔikide uute osalejate eri osakondadest ja tugiosakonnast minimaalse sisseastumislÀve tingimuseks.
TĂ€htaeg - eile.
VÔida arendusgrupp
Millega meeskond siis töötas? Windows?

NĂŒĂŒd vĂ”in seda julgelt vĂ€ita Identiteediserver4 on lahe tasuta alternatiiv sarnaste vĂ”imalustega ADFS-ile vĂ”i mis Olemi raamistiku tuum - arendaja paradiis, kus ei pea vaeva nĂ€gema SQL skriptide kirjutamisega, vaid kirjeldama andmebaasis olevaid pĂ€ringuid OOP terminites. Aga siis, tegevuskava arutamise ajal, vaatasin seda virna, nagu oleks see sumeri kiilkiri, tundes Ă€ra ainult PostgreSQL ja Git.
Sel ajal kasutasime aktiivselt Nukuteater konfiguratsioonihaldussĂŒsteemina. Enamikus oma projektides kasutasime GitLab CI, Elastne, tasakaalustatud suure koormusega teenuseid kasutades HAProxy jĂ€lgis kĂ”ike Zabbix, sidemed grafana Đž Prometheus, Jaeger, ja see kĂ”ik keerles rauatĂŒkkide peal HP c ESXi edasi VMware. KĂ”ik teavad seda â ĆŸanri klassika.

Vaatame ja proovime mÔista, mis toimus enne kÔigi nende sekkumiste alustamist.
Mis juhtus
TFS on ĂŒsna vĂ”imas sĂŒsteem, mis mitte ainult ei edasta koodi arendajalt lĂ”plikule tootmismasinale, vaid omab ka komplekti vĂ€ga paindlikuks integreerimiseks erinevate teenustega - CI pakkumiseks platvormidevahelisel tasemel.

Varem olid need kĂ”ik aknad. TFS kasutas mitut ehitusagenti, mis ehitasid mitu projekti. Igal agendil oli 3-4 töötajat ĂŒlesannete paralleelseks ja protsessi optimeerimiseks. SeejĂ€rel, vastavalt vĂ€ljalaskeplaanidele, edastas TFS vĂ€rskelt kĂŒpsetatud ehituse... Windows- rakendusserver.
Mida me saavutada tahtsime?
Kasutame TFS-i nii tarnimiseks kui ka arenduseks ning kÀivitame rakenduse Linux Rakendusserver ja nende vahel on mingi vÔlujÔud. See Magic Box ja ees on töö sool. Enne lahti vÔtmist astun sammu kÔrvale ja rÀÀgin mÔne sÔna rakenduse kohta.
Projekt
Rakendus pakub funktsioone ettemakstud kaartide kÀsitlemiseks.

klient
Kasutajaid oli kahte tĂŒĂŒpi. Esimene sai juurdepÀÀsu SSL SHA-2 sertifikaadiga sisse logides. U teine oli juurdepÀÀs sisselogimise ja parooliga.
HAProxy
SeejÀrel lÀks kliendi taotlus HAProxy-le, mis lahendas jÀrgmised probleemid:
- esmane luba;
- SSL-i lÔpetamine;
- HTTP pÀringute hÀÀlestamine;
- saatetaotlused.
Kliendi sertifikaati kontrolliti kogu ahela ulatuses. Meie - asutus ja me saame seda endale lubada, kuna me ise vÀljastame teenindusklientidele sertifikaate.
Pöörake tÀhelepanu kolmandale punktile, selle juurde naaseme veidi hiljem.
Taustaprogramm
Tagaosa oli plaanis teha LinuxTagaserver suhtleb andmebaasiga, laadib vajaliku Ôiguste loendi ja seejÀrel, olenevalt volitatud kasutaja Ôigustest, annab juurdepÀÀsu finantsdokumentide allkirjastamiseks ja tÀitmiseks saatmiseks vÔi aruande genereerimiseks.
SÀÀstud HAProxyga
Lisaks kahele kontekstile, milles iga klient navigeeris, oli olemas ka identiteedikontekst. Identiteediserver4 vÔimaldab lihtsalt sisse logida, see on tasuta ja vÔimas analoog ADFS - Active Directory föderatsiooni teenused.
Identiteeditaotlust töödeldi mitmes etapis. Esimene samm - klient sattus tagaprogrammi, mis suhtles selle serveriga ja kontrollis kliendi tokeni olemasolu. Kui seda ei leitud, tagastati pĂ€ring tagasi konteksti, kust see pĂ€rines, kuid ĂŒmbersuunamisega ja koos ĂŒmbersuunamisega lĂ€ks see identiteedile.
Teine samm â taotlus vĂ”eti vastu IdentityServeri autoriseerimislehele, kuhu klient registreerus, ja see kauaoodatud mĂ€rk ilmus IdentityServeri andmebaasi.
Kolmas samm - klient suunati tagasi konteksti, kust see tuli.

IdentityServer4-l on funktsioon: see tagastab vastuse tagastamistaotlusele HTTP kaudu. ĂkskĂ”ik kui palju me serveri seadistamisega vaeva nĂ€gime, kui palju me end dokumentatsiooniga valgustasime, saime iga kord esialgse kliendipĂ€ringu URL-iga, mis tuli HTTPS-i kaudu ja IdentityServer tagastas sama konteksti, kuid HTTP-ga. Olime ĆĄokeeritud! Ja me kandsime selle kĂ”ik lĂ€bi identiteedikonteksti HAProxy-sse ja pĂ€istes pidime muutma HTTP-protokolli HTTPS-iks.
Mis on paranemine ja kust sÀÀstsite?
SÀÀstsime raha, kasutades tasuta lahendust kasutajate grupi, ressursside autoriseerimiseks, kuna me ei paigutanud IdentityServer4 eraldiseisvasse segmenti eraldi sÔlmena, vaid kasutasime seda koos taustaprogrammiga samas serveris, kus rakenduse taustaprogramm töötab. .
Kuidas see peaks toimima
Niisiis, nagu ma lubasin â Magic Box. Me juba mĂ”istame, et liigume kindlasti selles suunas LinuxSĂ”nastagem konkreetsed ĂŒlesanded, mis vajasid lahendamist.

Nuku manifest. Teenuste ja rakenduste konfiguratsiooni tarnimiseks ja haldamiseks tuli kirjutada lahedaid retsepte. Pliiatsirull nÀitab kÔnekalt, kui kiiresti ja tÔhusalt see tehtud sai.
Kohaletoimetamise viis. Standard on RPM. KĂ”ik saavad sellest aru. Linux Sellest polnud muud ĂŒle, aga projekt ise oli pĂ€rast ehitamist kĂ€ivitatavate DLL-failide kogum. Neid oli umbes 150, mis tegi projekti ĂŒsna mahukaks. Ainus jĂ€tkusuutlik lahendus oli pakkida need binaarfailid RPM-i ja rakendus sealt juurutada.
Versioonide koostamine. Me kavatsesime vĂ€ga tihti vĂ€lja anda ja pidime otsustama, kuidas paketi nime moodustada. See oli TFS-iga integratsiooni taseme kĂŒsimus. Meil ââoli peal ehitusagent LinuxKui TFS saadab Build agendi töötajale ĂŒlesande, edastab see talle ka hulga muutujaid, mis on salvestatud töötaja keskkonda. Need keskkonnamuutujad sisaldavad jĂ€rgu nime, versiooni nime ja muid muutujaid. Lisateavet leiate jaotisest "RPM-paketi loomine".
TFS-i seadistamine KĂ”ik taandus torujuhtme rajamisele. Varem ehitasime edasi Windows- kĂ”ik agendid Windows-projektid ja nĂŒĂŒd paistab see vĂ€lja Linux-agent â ehitusagent, mis tuleb lisada ehitusgruppi, rikastada mĂ”ne artefaktiga, mÀÀrata, millist tĂŒĂŒpi projekte sellele ehitusagendile ehitatakse, ja muuta mingil moel torujuhet.
Identiteediserver. ADFS ei ole meie tee, me kasutame avatud lÀhtekoodi.
Vaatame komponente lÀbi.
Magic Box
Koosneb neljast osast.

Linux Ehitusagent. Linux, sest me kompileerime selle jaoks â see on loogiline. See osa valmis kolmes etapis.
- Konfigureerige töötajaid ja mitte ĂŒksi, sest projektiga loodeti jagada tööd.
- Installige .NET Core 1.x. Miks 1.x, kui 2.0 on standardhoidlas juba saadaval? Sest kui arendamisega alustasime, oli stabiilne versioon 1.09 ja selle pÔhjal otsustatigi projekt teha.
- Git 2.x.
RPM-hoidla. RPM-paketid pidid kuskil olema. Me pidime kasutama sama ettevÔtte RPM-hoidlat, mis oli kÔigile ligipÀÀsetav. Linux hostid. Seda me tegimegi. Hoidla server on konfigureeritud veebikonks mis laadis mÀÀratud asukohast alla vajaliku RPM-paketi. Paketi versioonist teatas veebihaagile ehitusagent.
GitLab. Pane tÀhele: GitLabi ei kasuta siin arendajad, vaid operatsioonide osakond rakenduste versioonide, pakettide versioonide ja kÔigi oleku haldamiseks. Linux-masinad ja see salvestab retsepti - kÔik nukute manifestid.
Nukuteater â lahendab kĂ”ik vastuolulised probleemid ja pakub Gitlabilt tĂ€pselt sellise konfiguratsiooni, mida me tahame.
Hakkame sukelduma. Kuidas DLL-i edastamine RPM-ile töötab?
Tarne DDL kuni RPM
Oletame, et meil on .NET-i arenduse rokkstaar. See kasutab Visual Studio ja loob vĂ€ljalaskeharu. PĂ€rast seda laadib see selle Giti ĂŒles ja Git on siin TFS-ĂŒksus, st see on rakenduste hoidla, millega arendaja töötab.

PÀrast seda nÀeb TFS, et uus commit on saabunud. Milline rakendus? TFS-i sÀtted nÀitavad, millised ressursid igal ehitusagendil on. Sel juhul nÀeb see, et me ehitame .NET Core'i projekti ja valib Linux Loo agent basseinist.
Ehitusagent saab allikad ja laadib need alla sÔltuvused .NET-i hoidlast, npm-st jne. ja pÀrast rakenduse enda koostamist ja sellele jÀrgnevat pakkimist saadab RPM-i paketi RPM-i hoidlasse.
Teisest kĂŒljest juhtub jĂ€rgmine. Operatsiooniosakonna insener on projekti juurutamisega otseselt seotud: ta muudab sisse pakettide versioone Hiera hoidlas, kus on salvestatud rakenduse retsept, mille jĂ€rel vallandub Nukk Yum, toob hoidlast uue paketi ja rakenduse uus versioon on kasutamiseks valmis.

SÔnades on kÔik lihtne, aga mis toimub Buildi agendi enda sees?
Pakkimine DLL RPM
Sai projekti allikad ja ehitusĂŒlesande TFS-ist. Ehitusagent hakkab projekti ise allikatest ĂŒles ehitama. Kokkupandud projekt on saadaval komplektina DLL-failid, mis on failisĂŒsteemi koormuse vĂ€hendamiseks pakitud ZIP-arhiivi.
ZIP-arhiiv visatakse minema RPM-paketi ehituskataloogi. JĂ€rgmisena lĂ€htestab Bashi skript keskkonnamuutujad, otsib ĂŒlesehituse versiooni, projekti versiooni, tee ehituskataloogi ja kĂ€ivitab RPM-ehituse. Kui ehitamine on lĂ”petatud, avaldatakse pakett aadressil kohalik hoidla, mis asub ehitusagendil.
JÀrgmiseks ehitusagendilt serverisse RPM-i hoidlas JSON-i pÀring on saadetud mÀrkides versiooni ja jÀrgu nime. Webhook, millest ma varem rÀÀkisin, laadib just selle paketi Build agendi kohalikust hoidlast alla ja teeb uue koostu installimiseks kÀttesaadavaks.

Miks RPM-repositooriumi jaoks just see konkreetne edastusskeem? Miks ei saa loodud paketti kohe repositooriumisse saata? See on turvanĂ”ue. See stsenaarium piirab vĂ”imalust, et volitamata isikud laadivad RPM-pakette ĂŒles avalikult ligipÀÀsetavale serverile. Linux-autod.
Andmebaasi versioonide loomine
Arenduskonsultatsioonil selgus, et tĂŒĂŒbid on MS SQL-ile lĂ€hemal, aga enamasti mitte-Windows Kasutasime PostgreSQL-i juba ulatuslikult mitme projekti jaoks. Kuna olime juba otsustanud tasulisest tarkvarast loobuda, hakkasime ka siin PostgreSQL-i kasutama.

Selles osas tahan teile rÀÀkida, kuidas me andmebaasi versiooni tegime ja kuidas valisime Flyway ja Entity Framework Core'i vahel. Vaatame nende plusse ja miinuseid.
Miinused
Flyway lĂ€heb ainult ĂŒhte suunda, meie me ei saa tagasi pöörata â see on mĂ€rkimisvÀÀrne puudus. Seda saab Entity Framework Core'iga vĂ”rrelda ka muul viisil â arendaja mugavuse seisukohast. MĂ€letate, et seadsime selle esmatĂ€htsaks ja peamine kriteerium oli mitte midagi muuta Windows-arengud.
Meie jaoks Flyway mingit ĂŒmbrist oli vajaet poisid ei kirjutaks SQL pĂ€ringud. Nad on OOP-i mĂ”istes tegutsemisele palju lĂ€hemal. Kirjutasime juhised andmebaasiobjektidega töötamiseks, genereerisime SQL-pĂ€ringu ja kĂ€ivitasime selle. Andmebaasi uus versioon on valmis, testitud - kĂ”ik on korras, kĂ”ik töötab.
Entity Framework Core'il on miinus â suure koormuse korral see loob suboptimaalseid SQL pĂ€ringuid, ja andmebaasi vĂ€henemine vĂ”ib olla mĂ€rkimisvÀÀrne. Aga kuna meil pole suure koormusega teenust, siis me ei arvuta koormust sadades RPS-ides, vĂ”tsime need riskid vastu ja delegeerisime probleemi enda kanda.
Plusse
Olemi raamistiku tuum töötab karbist vÀlja ja seda on lihtne arendadaja Flyway Lihtne integreerida olemasolevasse CI-sse. Aga teeme selle arendajatele mugavaks :)
Roll-up protseduur
Puppet nĂ€eb, et tulemas on muudatus paketi versioonis, sealhulgas selles, mis vastutab migratsiooni eest. Esiteks installib see paketi, mis sisaldab migratsiooniskripte ja andmebaasiga seotud funktsioone. PĂ€rast seda taaskĂ€ivitatakse andmebaasiga töötav rakendus. JĂ€rgmine on ĂŒlejÀÀnud komponentide paigaldamine. Pakettide installimise ja rakenduste kĂ€ivitamise jĂ€rjekorda kirjeldatakse Puppeti manifestis.
Rakendused kasutavad tundlikke andmeid, nagu mĂ€rgid, andmebaasi paroolid, kĂ”ik see tĂ”mmatakse Puppet masterist konfiguratsiooni, kus need salvestatakse krĂŒpteeritud kujul.
TFS-i probleemid
PĂ€rast seda, kui olime otsustanud ja mĂ”istnud, et meie jaoks kĂ”ik tĂ”esti töötab, otsustasin vaadata, mis toimub Win arendusosakonna TFS-i koostudega tervikuna teiste projektide puhul â kas ehitasime/vĂ€ljastame kiiresti vĂ”i mitte, ja avastas olulisi probleeme kiirusega.
Ăhe pĂ”hiprojekti kokkupanekuks kulub 12-15 minutit â see on pikk aeg, nii ei saa elada. Kiire analĂŒĂŒs nĂ€itas sisend-vĂ€ljundis kohutavat tĂ”rget ja see oli massiividel.
PĂ€rast selle komponentide kaupa analĂŒĂŒsimist tuvastasin kolm koldet. Esiteks - "Kaspersky viirusetĂ”rje", mis kehtib kĂ”igile Windows Ehitusagendid skannivad lĂ€htekoodi. Teine on Windows Indekseerija. Seda ei keelatud ja kĂ”ik indekseeriti juurutusprotsessi ajal ehitusagentides reaalajas.
Kolmas - Npm installimine. Selgus, et enamiku torujuhtmete puhul kasutasime tĂ€pselt seda stsenaariumi. Miks ta halb on? Npm installiprotseduur kĂ€ivitatakse, kui sĂ”ltuvuspuu moodustatakse pakett-lukk.json, kus salvestatakse projekti koostamiseks kasutatavate pakettide versioonid. Negatiivne kĂŒlg on see, et Npm install tĂ”mbab iga kord Internetist uusimad pakettide versioonid ja see vĂ”tab suure projekti puhul palju aega.
Arendajad katsetavad mĂ”nikord kohaliku masinaga, et testida, kuidas konkreetne osa vĂ”i kogu projekt töötab. MĂ”nikord selgus, et kohapeal oli kĂ”ik lahe, aga panid kokku, rullisid lahti ja miski ei töötanud. Hakkame aru saama, milles probleem on â jah, erinevad sĂ”ltuvustega pakettide versioonid.
otsus
- Allikad AV erandites.
- Keela indekseerimine.
- Ăleminek npm ci.
Npm ci eelised seisnevad selles, et meie Kogume sĂ”ltuvuspuu ĂŒks kordja saame vĂ”imaluse pakkuda arendajale praegune pakettide nimekiri, millega ta saab kohapeal katsetada nii palju kui tahab. See sÀÀstab aega arendajad, kes kirjutavad koodi.
Konfiguratsioon
NĂŒĂŒd natuke hoidla konfiguratsioonist. Ajalooliselt kasutame Nexus hoidlate haldamiseks, sealhulgas Sisemine REPO. See sisemine repositoorium sisaldab kĂ”iki komponente, mida kasutame sisemistel eesmĂ€rkidel, nĂ€iteks enda kirjutatud jĂ€lgimiseks.

Kasutame ka NuGet, kuna sellel on teiste paketihalduritega vÔrreldes parem vahemÀlu.
Tulemus
PÀrast ehitusagentide optimeerimist vÀhenes keskmine ehitusaeg 12 minutilt 7-le.
Kui loeme kokku kÔik masinad, mida saaksime kasutada Windows, aga tÔlgituna keelde Linux Selle projektiga sÀÀstsime umbes 10 000 dollarit. Ja see on ainult litsentside pealt; kui arvestada ka sisu, on see veelgi suurem.
Plaanid
JÀrgmises kvartalis plaanisime töötada koodi edastamise optimeerimisega.
LĂŒlitumine eelkoostatud Dockeri pildile. TFS on lahe asi paljude pistikprogrammidega, mis vĂ”imaldavad teil Pipeline'i integreerida, sealhulgas nĂ€iteks Dockeri kujutise pÀÀstikupĂ”hine kokkupanek. Tahame selle kĂ€ivitada samale pakett-lukk.json. Kui projekti koostamiseks kasutatud komponentide koostis kuidagi muutub, ehitame uue Dockeri pildi. Seda kasutatakse hiljem konteineri juurutamiseks koos kokkupandud rakendusega. Praegu see nii ei ole, kuid meie ettevĂ”ttes aktiivselt arenevas ja juba pikemat aega tootmislahendusi teenindavas Kubernetes plaanime ĂŒle minna mikroteenuste arhitektuurile.
KokkuvÔte
Ma kutsun kĂ”iki ĂŒles see minema viskama Windows, aga see pole sellepĂ€rast, et ma ei teaks, kuidas seda valmistada. PĂ”hjus on selles, et enamik avatud lĂ€htekoodiga lahendusi on Linux-virn. kas sul on kĂ”ik korras sÀÀsta ressursseMinu arvates on tulevik avatud lĂ€htekoodiga lahenduste pĂ€ralt. Linux vĂ”imsa kogukonnaga.
Aleksandr Sintƥinovi kÔneleja profiil .
on konverents arendus-, testimis- ja tööprotsesside integreerimisest professionaalidele professionaalide poolt. SellepĂ€rast see projekt, millest Aleksander rÀÀkis? rakendatud ja töökorras ning esinemispĂ€eval ilmus kaks edukat vĂ€ljaannet. Peal 27. ja 28. mail on sarnaseid juhtumeid praktikutelt veelgi rohkem. Viimasesse vankrisse saab veel hĂŒpata ja vĂ”i vĂ”ta aega pilet. Kohtume Skolkovos!
Allikas: www.habr.com
