{"id":32217,"date":"2019-10-31T21:45:43","date_gmt":"2019-10-31T18:45:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/net-core-na-linux-devops-na-kone\/"},"modified":"2019-10-31T21:45:43","modified_gmt":"2019-10-31T18:45:43","slug":"net-core-na-linux-devops-na-kone","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core Linuxis, DevOps ratsutamisel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Me arendame DevOps'i, kuidas oskame. Meid oli 8 inimest ja Vassia oli Windowsi alal parim. \u00dchel p\u00e4eval lahkus Vassia ja mul tekkis \u00fclesanne k\u00e4ivitada uus projekt, mis pakub Windows arendust. Kui ma lauas kokku kogusin kogu Windowsi arendustehnoloogia, siis sain aru, et olukord on valus...<\/p>\n<p>Nii algab lugu <b>Aleksandr Sin\u010dinov<\/b> . Tundub, et <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Kui ettev\u00f5ttest lahkus peamine Windowsi spetsialist, k\u00fcsis Aleksandr endalt, mida n\u00fc\u00fcd teha. Loomulikult liikuda Linuxile! Aleksandr r\u00e4\u00e4gib, kuidas tal \u00f5nnestus luua pretsedent ja viia osa Windowsi arendusest Linuxile, kasutades n\u00e4iteks projekti, millel on 100 000 l\u00f5ppkasutajat.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas tellida projekti RPM-i, kasutades TFS-i, Puppetit, Linux .NET core'i? Kuidas hallata projekti andmebaasi versioone, kui arendajad kuulevad Postgresi ja Flywayi nimed esmakordselt ja t\u00e4htaeg on \u00fclehomme? Kuidas integreerida Dockeriga? Kuidas motiveerida .NET arendajaid loobuma Windowsist ja smuutidest Puppet ja Linuxi kasuks? Kuidas lahendada ideoloogilisi konflikte, kui Windowsi tootmisressurss ei ole mitte ainult j\u00f5ud, vaid ka soov ja ressursid? Sellest, samuti Web Deployst, testimisest, CI-st, TFS-i kasutamise praktikast olemasolevates projektides, ja muidugi rikutud tugede ja t\u00f6\u00f6tavate lahenduste kohta, r\u00e4\u00e4gib Aleksandri esitluse \u00fclevaates.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"tZH9Ro9j9KQ\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/tZH9Ro9j9KQ\/hqdefault.jpg\" alt=\"M\u00e4ngi videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nNii, Vassia lahkus, \u00fclesanne on n\u00fc\u00fcd minu \u00f5lul, arendajad ootavad p\u00f5nevusega. Kui ma l\u00f5puks m\u00f5istsin, et Vassiat ei saa tagasi tuua\u2014alustasin t\u00f6\u00f6d. Esiteks hindasin meie Windowsi virtuaalmasinate protsenti. Numbrid ei olnud Windowsi kasuks.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuna me aktiivselt arendame DevOps'i, m\u00f5istsin, et uus rakenduse v\u00e4ljaandmine peab muutuma. Lahendus oli \u00fcheselt selge\u2014k\u00f5ik tuleb v\u00f5imaluse korral viia Linuxile. Google aitas mind\u2014tol hetkel oli .Net juba Linuxile portitud ja ma sain aru, et see on lahendus!<\/p>\n<h2>Miks .NET core koos Linuxiga?<\/h2>\n<p>\nSellel oli mitu p\u00f5hjust. Enamiku jaoks, kes peavad valima 'maksta raha' ja 'mitte maksta', valib enamik teise\u2014nagu mina. MSDB litsents maksab umbes 1 000 dollarit, Windowsi virtuaalmasinate hooldus maksab sadu dollareid. Suurettev\u00f5tte jaoks on need suuremad kulud. Seega <b>s\u00e4\u00e4st\u00a0<\/b>\u2014<b> on esimene p\u00f5hjus<\/b>. Mitte k\u00f5ige olulisem, aga \u00fcks t\u00e4htsamaid.<\/p>\n<p>Windowsi virtuaalmasinad v\u00f5tavad rohkem ressursse kui nende Linuxi vennad\u2014 <b>nad on rasked<\/b>. Arvestades suure ettev\u00f5tte m\u00f5\u00f5tmeid, valisime Linuxi.<\/p>\n<p><b>S\u00fcsteem integreerub lihtsalt olemasolevasse CI-sse<\/b>. Peame end progressiivseteks DevOps-ideks, kasutame Bamboo, Jenkinsit ja GitLab CI-d, seet\u00f5ttu p\u00f5hineb meil enamik Linuxil.<\/p>\n<p>Viimane p\u00f5hjus on <b>mugav teenindamine. <\/b>Oli vajalik v\u00e4hendada sisenemise l\u00e4ve \u201eteenindajatele\u201c - neile, kes m\u00f5istavad tehnilist poolt, tagavad teenuste t\u00f5rgeteta toimimise ja hooldavad teenuseid teise taseme abil. Nad olid juba tuttavad Linuxi tehnoloogiaga, seega on neil uus toode, selle toetamine ja hooldamine tunduvalt lihtsam, kui kulutada lisaj\u00f5ude Windowsi platvormide sarnaste funktsioonide m\u00f5istmiseks.<\/p>\n<h2>N\u00f5uded<\/h2>\n<p>\nEsiteks ja k\u00f5ige olulisem on <b>uue lahenduse mugavus arendajatele<\/b>. Mitte k\u00f5ik neist ei olnud muudatusteks valmis, eriti p\u00e4rast s\u00f5na Linuxi mainimist. Arendajad soovivad armastatud Visual Studio't, TFS-i koos automaatsete testidega build'ide jaoks ja smuutisid. Kuidas toimub kohaletoimetamine tootmisse - need ei hooli. Seet\u00f5ttu otsustasime mitte muuta harjumusp\u00e4rast protsessi ja j\u00e4tta Windowsi arendamiseks k\u00f5ik muutumatuks. <\/p>\n<p>Uus projekt tuleb <b>integreerida olemasolevasse CI-sse<\/b>. R\u00f6\u00f6pad olid juba paigas ning kogu t\u00f6\u00f6 tuli teostada arvestades konfiguratsiooni haldamise s\u00fcsteemi parameetreid, standardse kohaletoimetamise protseduuri ja j\u00e4lgimiss\u00fcsteemide n\u00f5udeid.<\/p>\n<p><b>Toetamise ja kasutamise lihtsus<\/b>, nagu tingimus, et k\u00f5ik uued osalejad erinevatest osakondadest ja teenindusosakonnast saaksid madala sisenemise l\u00e4ve.<\/p>\n<p><b>T\u00e4htp\u00e4ev oli eile<\/b>.<\/p>\n<h2>Windowsi arendamise grupp<\/h2>\n<p>\nMillega t\u00f6\u00f6tas Windowsi meeskond?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPraegu v\u00f5in kindlalt \u00f6elda, et <b>IdentityServer4<\/b>\u00a0on suurep\u00e4rane tasuta alternatiiv ADFS-ile sarnaste v\u00f5imalustega, v\u00f5i et <b>Entity Framework Core<\/b>\u00a0on arendajate paradiis, kus ei pea muretsema SQL skriptide kirjutamise p\u00e4rast, vaid saab kirjeldada andmebaasi p\u00e4ringuid OOP terminoloogiaga. Kuid siis, k\u00e4imasoleval tegevuskava arutelul, vaatasin sellele tehnoloogiale nagu sumero-keelele, tunnen ainult PostgreSQL-i ja Gitit.<\/p>\n<p>Sel ajal kasutasime aktiivselt <b>Puppet<\/b> konfiguratsiooni haldamiseks. Enamikus meie projektides kasutasime <b>GitLab CI-d<\/b>, <b>Elastic<\/b>, balanseerisime k\u00f5rge koormusega teenuseid <b>HAProxy-ga,<\/b> k\u00f5ike j\u00e4lgisime <b>Zabbix<\/b>, komplekti <b>Grafana<\/b> ja\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, ja see k\u00f5ik t\u00f6\u00f6tas riistvaral\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> . Tundub, et\u00a0<b>VMware<\/b>. K\u00f5igile tuttav - \u017eanri klassika.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVaatame ja proovime m\u00f5ista, mis juhtus enne, kui me k\u00f5ik need sekkumised ette v\u00f5tsime.<\/p>\n<h2>Mis toimus<\/h2>\n<p>\nTFS on \u00fcsna v\u00f5imas s\u00fcsteem, mis mitte ainult ei toeta koodi edastamist arendajalt l\u00f5pplikku tootmismasinasse, vaid omab ka tugevat t\u00f6\u00f6riistakomplekti, et toetada v\u00e4ga paindlikku integreerimist erinevate teenustega \u2013 CI tagamiseks \u00fclepakkumise tasemel.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVarem olid need t\u00e4iesti aknad. TFS kasutas mitmeid Build-agenete, millel koguti kokku palju projekte. Igas agendis oli 3-4 t\u00f6\u00f6tlijat, et t\u00f6id paralleelselt jagada ja protsessi optimeerida. Edasi, vastavalt v\u00e4ljaande plaanidele, edastas TFS v\u00e4rskelt valmistatud Buildi Windowsi rakenduste serverisse.<\/p>\n<h2>Mille poole me tahtsime j\u00f5uda<\/h2>\n<p>\nKasutame TFS-i edastamiseks ja arendamiseks, aga k\u00e4ivitame rakenduse Linuxi rakenduste serveris, ja nende vahele j\u00e4\u00e4b mingi maagia. See <b>Magic Box<\/b> ongi eelseisva t\u00f6\u00f6 sool. Enne kui hakkame seda t\u00fckeldama, teen sammu k\u00f5rvale ja \u00fctlen paar s\u00f5na rakendusest.<\/p>\n<h2>Projekt<\/h2>\n<p>\nRakendus pakub funktsionaalsust ette makstud kaartide haldamiseks. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Klient<\/h3>\n<p>\nOli olemas kaks t\u00fc\u00fcpi kasutajaid. <b>Esimene<\/b> saime ligip\u00e4\u00e4su, autentides SSL SHA-2 sertifikaadi kaudu. Teisel\u00a0<b>oli ligip\u00e4\u00e4s sisselogimise ja parooli kaudu.<\/b> HAProxy<\/p>\n<h3>Edasi l\u00e4ks kliendi p\u00e4ring HAProxy-sse, mis lahendas j\u00e4rgmised \u00fclesanded:<\/h3>\n<p>\nesmane autentimine;<\/p>\n<ul>\n<li>SSL-i l\u00f5ppemine;\n<\/li>\n<li>HTTP p\u00e4ringute kohandamine;\n<\/li>\n<li>p\u00e4ringute edastamine.\n<\/li>\n<li>Kliendi sertifikaadi kontrollimist tehti ahela kaudu. Me oleme\n<\/li>\n<\/ul>\n<p>\nauthority <b>ja saame endale sellist lubada, kuna me ise v\u00e4ljastame teenuse klientidele sertifikaate. <\/b>Pane t\u00e4hele kolmandat punkti, tuleme sellele tagasi veidi hiljem.<\/p>\n<p>Planeerisime tausta teha Linuxil. Taust interakteerub andmebaasiga, laadib vajalikud privileegide loendid ja seej\u00e4rel, olenevalt sellest, milliste privileegidega autentitud kasutaja on, annab juurdep\u00e4\u00e4su finantsdokumentide allkirjastamiseks ja nende t\u00e4itmiseks v\u00f5i m\u00f5ne raporti genereerimiseks.<\/p>\n<h3>Backend<\/h3>\n<p>\nKokkuhoid HAProxy-st<\/p>\n<h2>Lisaks kahe konteksti olemasolule, mille kaudu igasugused kliendid liikuda, oli veel konteksti identity.<\/h2>\n<p>\nmis just v\u00f5imaldab autentimist, see on tasuta ja v\u00f5imas analoog <b>IdentityServer4<\/b> ADFS <b>Active Directory Federation Services\u00a0<\/b>\u2014<b> P\u00e4ring identity-le t\u00f6\u00f6deldi mitmes etapis. Esimene etapp \u2013<\/b>.<\/p>\n<p>klient <b>sattus tausta<\/b> <b>sattus tagasiside<\/b>, mis vahetas andmeid selle serveriga ja kontrollis kliendi tokeni olemasolu. Kui seda ei leitud, naasis p\u00e4ring tagasi konteksti, kust see tuli, kuid juba koos \u00fcmbersuunamisega, ja \u00fcmbersuunamine l\u00e4ks identiteedi suunas.<\/p>\n<p>Teine samm - p\u00e4ring j\u00f5udis <b>autentimislehele IdentityServeris,<\/b> kus klient registreerus ja IdentityServeri andmebaasi ilmnes kauaoodatud token. <\/p>\n<p>Kolmas samm - <b>klient suunati tagasi <\/b>konteksti, kust ta tuli.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4-l on erip\u00e4ra: <b>vastus tagasip\u00e4ringule antakse tagasi HTTP<\/b>. Kuigi me pingutasime serveri seadistamise nimel, uurides dokumentatsiooni, saime iga kord kliendi algse p\u00e4ringu, mille URL tuli HTTPS-i kaudu, kuid IdentityServer tagastas sama konteksti HTTP-as. Olime \u0161okis! Ja suunasime selle k\u00f5ik identiteedi konteksti kaudu HAProxy, muutes protokolli HTTP HTTPS-iks p\u00e4istes. <\/p>\n<p>Kus on siis parendused ja kust me kokkuhoidu saime?<\/p>\n<blockquote><p>Kokkuhoid oli rahas, kasutades tasuta lahendust kasutajagrupi autentimiseks, ressurssidest, kuna me ei t\u00f5stnud IdentityServer4 eraldi s\u00f5lmena eraldi segmenti, vaid kasutasime seda koos backendiga samas serveris, kus rakenduse backend t\u00f6\u00f6tas.<\/p><\/blockquote>\n<p><\/p>\n<h2>Kuidas see peaks toimima<\/h2>\n<p>\nNii nagu ma lubasin - Magic Box. Me saame juba aru, et liigume kindlalt suunas Linux. Vaatame konkreetsed \u00fclesanded, mis vajasid lahendamist.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Puppet'i manifestid. <\/b>Teenuse ja rakenduse konfigureerimise edastamiseks ja haldamiseks tuli kirjutada toredaid retsepte. Paberirull ja pliiats n\u00e4itavad arusaadavalt, kui kiiresti ja kvaliteetselt see tehti.<\/p>\n<p><b>Edastamise meetod. <\/b>Standard on RPM. K\u00f5ik m\u00f5istavad, et Linuxis ei saa teisiti, kuid ise projekt p\u00e4rast ehitamist kujutas endast teatud k\u00e4ivitatavate DLL-failide komplekti. Need olid umbes 150, projekt oli piisavalt mahukas. Ainus harmooniline lahendus oli see binaar  RPM-ks pakkida ja sealt rakendust arendada.<\/p>\n<p><b>Versioonimine. <\/b>Meil tuli tihti releasida ja oli vaja otsustada, kuidas paketi nime vormistada. See on TFS-iga integreerumise tase. Meie Build-agent oli Linuxis. Kui TFS saadab \u00fclesande t\u00f6\u00f6tlejale - worker - Build-agentile, edastab ta talle ka muutuja grupi, mis siseneb t\u00f6\u00f6tleva protsessi keskkonda. Nendes keskkonnaparameetrites edastatakse Build'i nimi, versiooni nimi ja teised muutujad. T\u00e4iendavate detailide jaoks vaadake jaotist 'RPM-paketi koostamine'.<\/p>\n<p><b>TFS-i seadistamine<\/b> koondus Pipeline'i seadistamisele. Varem kogusime k\u00f5ik Windowsi projektid Windows-agente peal, kuid n\u00fc\u00fcd tuleb lisada Linux-agent - Build-agent, mis tuleb lisada koostamisr\u00fchma, rikastada mingite artefaktidega, m\u00e4\u00e4rata, milliseid projekte selles Build-agendis kokku pannakse, ja kuidagi modifitseerida Pipeline'i.<\/p>\n<p><b>IdentityServer. <\/b>ADFS ei ole meie tee, toetame Open Source'i.<\/p>\n<p>K\u00e4ime komponentidest l\u00e4bi.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nKoosneb neljast osast.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build-agent. <\/b>Linux, sest me kogume selle jaoks - loogiline. See osa viidi ellu kolme sammu kaudu.<\/p>\n<ul>\n<li><b>Seada worker'id<\/b> ja mitte ainult \u00fcks, kuna projektiga olnuks plaanis tegeleda jagatult.\n<\/li>\n<li><b>Installida .NET Core 1.x<\/b>. Miks just 1.x, kui 2.0 on juba olemas tavalisest repost? Sest kui me arendamist alustasime, oli stabiilne versioon 1.09 ja projekti otsustati teha selle p\u00f5hjal.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repositorium. <\/b>RPM-pakette oli vaja kuskil hoida. Eeldati, et me kasutame sama ettev\u00f5tte RPM-repositoriumi, mis on kergesti k\u00e4ttesaadav k\u00f5igile Linuxi hostidele. Nii me ka tegime. Repositoriumi serveris on seadistatud <b>webhook<\/b> mis allalaadib n\u00f5utud RPM-paketi m\u00e4\u00e4ratud kohast. Versiooni paketist edastas Build-agent webhook'ile.<\/p>\n<p><b>GitLab. <\/b>T\u00e4htis! GitLab'i kasutavad siin mitte arendajad, vaid haldust\u00f6\u00f6tajad rakenduse versioonide, pakettide versioonide, k\u00f5igi Linuxi masinate seisundi j\u00e4lgimiseks ning seal hoitakse retseptuurit - k\u00f5iki Puppet'i manifeste. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2014 lahendab k\u00f5ik vaidlusalused k\u00fcsimused ja toob t\u00e4pselt selle konfiguratsiooni, mida me soovime, Gitlab'ist.<\/p>\n<p>Alustame s\u00fcvenemist. Kuidas toimub DLL-i \u00fclekanne RPM-isse?<\/p>\n<h3>DLL-i \u00fclekanne RPM-isse<\/h3>\n<p>\nOletame, et meil on rockstar arendamiseks .NET-is. Ta kasutab Visual Studio't ja loob vabanemis haru. P\u00e4rast seda laadib ta selle Git'i, ja Git on siin TFS-i subjekt, st see on rakenduse reponeering, millega arendaja t\u00f6\u00f6tab.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e4rast seda TFS n\u00e4eb, et saabus uus commit. Milline rakendus? TFS-i seadetes on silt, milliseid ressursse omab teatud Build-agent. Antud juhul n\u00e4eb ta, et kogume .NET Core projekti ja valib Linux Build-agendi basseinist. <\/p>\n<p>Build-agent saab l\u00e4htekoodid, laadib alla vajalikud <b>s\u00f5ltuvused<\/b> n\u00e4iteks .NET hoidlast, npm jne ning p\u00e4rast rakenduse kokkupanekut ja j\u00e4rgnevat pakkimist saatab RPM-paketi RPM-hoidlasse.<\/p>\n<p>Teiselt poolt toimub j\u00e4rgmine. Operatsioonide insener tegeleb projekti v\u00e4ljaandmisega: muudab pakettide versioone\u00a0<b>Hieras<\/b> hoidlas, kus hoitakse rakenduse retsepti, mille j\u00e4rel Puppet k\u00e4ivitab <b>Yumi<\/b>, t\u00f5mbab uue paketi hoidlast ja uus rakenduse versioon on kasutamiseks valmis.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas me r\u00e4\u00e4gime, tundub k\u00f5ik lihtne, kuid mis tegelikult toimub Build-agendi sees?<\/p>\n<h3>DLL-i RPM pakkimine<\/h3>\n<p>\nL\u00e4htekoodid on saadud ja TFS-ilt on saadud kogumise \u00fclesanne. Build-agent <b>k\u00e4ivitab projekti kokkupaneku l\u00e4htekoodidest.<\/b>Kogutud projekt on saadaval mitmesugustes <b>DLL-failides<\/b>, mis on pakitud zip-arhiivi, et v\u00e4hendada koormust failis\u00fcsteemile.<\/p>\n<p>ZIP-arhiiv visatakse <b>RPM-paketi kogumise katalooge.<\/b> Edasi Bash skript initsialiseerib keskkonnamuutujad, leiab Buildi versiooni, projekti versiooni, tee kogumise kataloogi ja k\u00e4ivitab RPM-buildi. P\u00e4rast kokkupanekut avaldatakse pakett\u00a0<b>kohalikus hoidlas<\/b>, mis on Build-agendi peal.<\/p>\n<p>Edasi saadetakse Build-agentilt serverisse JSON-p\u00e4ring <b>versiooni nime ja buildi m\u00e4\u00e4ramisega. Webhook, millest ma varem r\u00e4\u00e4kisin, t\u00f5mbab selle paketi kohalikust hoidlast Build-agendis ja teeb uue kogumise paigaldamiseks k\u00e4ttesaadavaks.<\/b> Miks on just selline pakettide edastusskeem RPM-hoidlasse? Miks ei saa kohe kokkupandud paketti hoidlasse saata? Asi on selles, et see on tingimus turvalisuse tagamiseks. Selline stsenaarium piirab volitamata isikute v\u00f5imalust laadida serverisse, mis on avatud k\u00f5igile Linuxi masinatele, RPM-pakette.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAndmebaasi versioonimine<\/p>\n<h2>Konsiiliumil arendusega selgus, et poisid eelistavad MS SQL-i, kuid enamikul non-Windows projektidest oleme juba ulatuslikult kasutanud PostgreSQL-i. Kuna olime otsustanud loobuda k\u00f5ikidest tasulistest lahendustest, hakkasime ka siin kasutama PostgreSQL-i.<\/h2>\n<p>\nKonsiiliumis arendamisega selgus, et noorte seas on eelistatum MS SQL, kuid enamikus non-Windows projektides oleme juba PostgreSQL-i laialdaselt kasutanud. Kuna oleme juba otsustanud loobuda k\u00f5ikidest tasulistest lahendustest, hakkasime ka siin PostgreSQL-i kasutama.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles osas tahan r\u00e4\u00e4kida sellest, kuidas me andmebaasi versioone haldasime ja kuidas valisime Flyway ja Entity Framework Core vahel. Vaatame nende plusse ja miinuseid.<\/p>\n<h3>Miinused<\/h3>\n<p>\nFlyway t\u00f6\u00f6tab ainult \u00fches suunas, me\u00a0<b>ei saa tagasi tagasi minna<\/b>\u00a0\u2014 see on oluline miinus. Entity Framework Core'i saab v\u00f5rrelda teiste parameetrite j\u00e4rgi \u2014 arendaja mugavuse seisukohalt. Te ju m\u00e4letate, et me panime selle prioriteediks ja peamine kriteerium oli mitte muuta midagi Windows-arenduse jaoks.<\/p>\n<p>Flyway jaoks vajasime <b>mingit m\u00e4hist<\/b>, et arendajad ei kirjutaks <b>SQL-p\u00e4ringuid<\/b>. Neil on palju mugavam t\u00f6\u00f6tada OOP m\u00f5istete j\u00e4rgi. Kirjutasime juhised andmebaasi objektidega t\u00f6\u00f6tamiseks, SQL-p\u00e4ring moodustus ja t\u00e4ideti. Uus andmebaasi versioon on valmis, testitud \u2014 k\u00f5ik t\u00f6\u00f6tab h\u00e4sti.<\/p>\n<p>Entity Framework Core'il on miinus \u2014 suurte koormuste korral\u00a0<b>loob ta mitteoptimaalseid SQL-p\u00e4ringuid<\/b>, ja andmebaasi koormus v\u00f5ib olla m\u00e4rkimisv\u00e4\u00e4rne. Aga kuna meie teenus ei ole v\u00e4ga koormatud, me ei m\u00f5\u00f5da koormust sadade RPS-idega, v\u00f5tsime need riskid ja delegaarisime probleemi tulevikule.<\/p>\n<h3>Plussid<\/h3>\n<p>\nEntity Framework Core <b>t\u00f6\u00f6tavad karbist v\u00e4lja ja on arendajale mugavad<\/b>, samas Flyway <b>lihtsalt integreerub olemasolevasse CI-s\u00fcsteemi.<\/b>Aga me ju teeme arendajatele mugavate lahendusi :)<\/p>\n<h3>Puppet n\u00e4eb, et versioonide muutmise paketid, sealhulgas migratsioonide vastuolev paket, on saabumas. Esmalt installib see paketi, mis sisaldab migratsiooniskeeme ja andmebaasile seotud funktsionaalsust. Seej\u00e4rel taask\u00e4ivitab rakenduse, mis t\u00f6\u00f6tab andmebaasiga. Edasi toimub \u00fclej\u00e4\u00e4nud komponentide installimine. Pakettide installimise ja rakenduste k\u00e4ivitamise j\u00e4rjestus on kirjeldatud Puppet manifestis.<\/h3>\n<p>\nRakendused kasutavad tundlikke andmeid, nagu tokenid, andmebaasi paroolid, k\u00f5ik see t\u00f5mmatakse Puppet master'i konfiguraatorisse, kus nad on kr\u00fcptitud kujul talletatud.<\/p>\n<p>TFS-i probleemid<\/p>\n<h2>P\u00e4rast seda, kui me olime \u00e4ra otsustanud ja m\u00f5istsime, et meil t\u00f5epoolest k\u00f5ik t\u00f6\u00f6tab, otsustasin vaadata, mis TFS-is toimub Win-arenduste jaoks teiste projektide osas \u2014 kiiresti v\u00f5i mitte, ja avastasin t\u00f5sised probleemid kiirusest.<\/h2>\n<p>\n\u00dcks peamisi projekte koostatakse 12-15 minutiga \u2014 see on kaua, nii ei saa elada. Kiire anal\u00fc\u00fcs n\u00e4itas tohutut madalseisu I\/O poolest, ja see on massiivide peal.<\/p>\n<p>Komponentide kaupa anal\u00fc\u00fcsides eristasin kolm probleemi allikat. Esimene \u2014<\/p>\n<p>\u00abKaspersky antivirus\u00bb <b>\u00abKaspersky viiruset\u00f5rje\u00bb<\/b>, mis skaneerib l\u00e4htekoodi k\u00f5igil Windows Build-agentidel. Teine - <b>Windows<\/b> <b>Indekseerija.<\/b> See ei olnud v\u00e4lja l\u00fclitatud ja Build-agentidel indekseeriti reaalajas k\u00f5ik deploimise protsessis. <\/p>\n<p>Kolmas - <b>npm install. <\/b>Selgus, et enamikus Pipelines kasutasime just seda stsenaariumi. Miks see halb on? Npm install protseduur k\u00e4ivitub s\u00f5ltuvuste puu moodustamise ajal\u00a0<b>package-lock.json<\/b>, kus fikseeritakse pakettide versioonid, mida projektile kogumisel kasutatakse. Miinuseks on, et npm install toob iga kord v\u00e4rsked pakettide versioonid internetist, mis v\u00f5tab palju aega suure projekti puhul.<\/p>\n<blockquote><p>Arendajad katsetavad vahel kohalikul masinal, et kontrollida eraldi osa v\u00f5i projekti toimivust. M\u00f5nikord juhtus, et kohapeal oli k\u00f5ik suurep\u00e4rane, kuid kui kogudes ja deployides, ei t\u00f6\u00f6tanud midagi. Alustame probleemi uurimist - aha, erinevad pakettide versioonid s\u00f5ltuvustes.<\/p><\/blockquote>\n<p><\/p>\n<h3>Lahendus<\/h3>\n<p><\/p>\n<ul>\n<li>L\u00e4htekoodid AV erandite jaoks.\n<\/li>\n<li>Indekseerimise v\u00e4ljal\u00fclitamine.\n<\/li>\n<li>\u00dcleminek\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nnpm ci eelised on, et me\u00a0<b>kogume s\u00f5ltuvuste puu vaid \u00fcks kord<\/b>, ja saame arendajale pakkuda <b>relevantsete paketide nimekirja<\/b>, millega ta v\u00f5ib kohapeal katsetada. See <b>kasutab aega<\/b> arendajate jaoks, kes koodi kirjutavad.<\/p>\n<h3>Konfiguratsioon<\/h3>\n<p>\nN\u00fc\u00fcd natuke konfigureerimisest. Ajalooliselt oleme kasutanud <b>Nexus<\/b> repository haldamiseks, sealhulgas <b>Internal REPO<\/b>. Sellesse sisemisse reposse tarnitakse k\u00f5ik komponendid, mida me kasutame siset\u00f6\u00f6de jaoks, n\u00e4iteks kohandatud monitooringud.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxis, DevOps ratsutamisel\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKasutame ka <b>NuGet<\/b>, kuna see vahetab paremini kui teised paketihaldurid.<\/p>\n<h3>Tulemus<\/h3>\n<p>\nP\u00e4rast Build-agentide optimeerimist v\u00e4henes keskmine kogumise aeg 12 minutilt 7 minutile.<\/p>\n<blockquote><p>Kui arvestada k\u00f5iki masinaid, mida me oleksime v\u00f5inud Windowsi jaoks kasutada, kuid mille oleme selles projektis Linuxile \u00fcle viinud, s\u00e4\u00e4stsime umbes 10 000 dollarit. Ja see on ainult litsentside pealt, aga kui arvestada hooldust - rohkem.<\/p><\/blockquote>\n<p><\/p>\n<h2>Plaane<\/h2>\n<p>\nOleme j\u00e4rgmisse kvartalisse planeerinud koodi kohaletoimetamise optimeerimise.<\/p>\n<p><b>\u00dcleminek eelkoostatud Docker-pildile<\/b>. TFS on suurep\u00e4rane asi paljude pluginatega, mis v\u00f5imaldavad integreerida Pipeline'i, sealhulgas ka kogumist triggered, n\u00e4iteks Docker-pildi kogumist. Soovime, et see trigger t\u00f6\u00f6tab just seda. <b>package-lock.json<\/b>. Kui projektis kasutatavad koostisosad mingil juhul muutuvad, siis koostame uue Docker-pildi. Tulevikus kasutatakse seda kokku pandud rakenduse konteineri juurutamiseks. Praegu seda ei ole, kuid plaanime \u00fcle minna mikroteenuste arhitektuurile Kuberneteses, mis meie firmas aktiivselt areneb ja pikka aega tootmislahendusi teenindab.<\/p>\n<h2>Elulookirjeldus<\/h2>\n<p>\nKutsun k\u00f5iki v\u00e4lja viskama Windowsi, kuid see ei ole sellep\u00e4rast, et ma ei oska seda kasutada. P\u00f5hjus on see, et suur osa avatud l\u00e4htekoodiga lahendustest on <b>Linuxi tehnoloogia<\/b>. Te saate h\u00e4sti <b>ressursside pealt kokku hoida<\/b>. Minu arvates on tulevik avatud l\u00e4htekoodiga lahendustes Linuxil koos tugeva kogukonnaga.<\/p>\n<p><i>Esineja profiil Aleksandr Sin\u010dvin <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">GitHub'il<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0on arendamise, testimise ja haldamise protsesside integreerimise konverents professionaalide jaoks professionaalide poolt. Just seet\u00f5ttu on projekt, millest Aleksandr r\u00e4\u00e4kis, realiseeritud ja t\u00f6\u00f6tab, ning esinemise p\u00e4eva jooksul viidi l\u00e4bi kaks edukat v\u00e4ljalaset.\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf RIT++-l<\/a><\/noindex> 27. ja 28. mail on veelgi rohkem sarnaseid juhtumeid praktikutelt. Veel on v\u00f5imalik h\u00fcpata viimasesse vagunisse ja <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">esitama ettekannet<\/a><\/noindex> v\u00f5i rahulikult <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">broneerima<\/a><\/noindex> piletit. Kohtume Skolkoves!<\/p><\/blockquote>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/448496\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b\u00a0\u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438\u00a0\u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e\u00a0Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f\u00a0\u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430\u00a0\u0441\u0442\u043e\u043b \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e\u00a0\u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u00a0\u2014 \u0431\u043e\u043b\u044c\u2026 \u0422\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u043d\u0447\u0438\u043d\u043e\u0432\u0430 \u043d\u0430 DevOpsConf. \u041a\u043e\u0433\u0434\u0430 \u0438\u0437\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0448\u0435\u043b \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e\u00a0Windows, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u00a0Linux, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24043,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32217","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47.NET Core \u043d\u0430 Linux, DevOps \u043d\u0430 \u043a\u043e\u043d\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:45:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47.NET Core Linuxil, DevOps kui kuningas | ProHoster","description":"Me arendasime DevOpsi nii h\u00e4sti kui oskasime. Meid oli 8 inimest, ja Vassil oli Windowsis k\u00f5ige parem oskus. \u00c4kitselt lahkus Vassil, ja mul tekkis \u00fclesanne viia ellu uus projekt, mis pakub Windowsi arendust.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47.NET Core \u043d\u0430 Linux, DevOps \u043d\u0430 \u043a\u043e\u043d\u0435 | ProHoster","og:description":"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:45:43+00:00","article:modified_time":"2019-10-31T18:45:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32217","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 09:49:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:02:47","updated":"2026-01-21 09:49:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}