{"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\/sk\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core na Linuxu, DevOps na koni","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>DevOps sme vyv\u00edjali, ako najlep\u0161ie sme mohli. Boli sme \u0161tyria a V\u00e1clav bol najlep\u0161\u00ed v oblasti Windows. N\u00e1hle V\u00e1clav odi\u0161iel a ja som dostal \u00falohu spusti\u0165 nov\u00fd projekt, ktor\u00fd dod\u00e1va Windows v\u00fdvoj. Ke\u010f som na st\u00f4l vysypal cel\u00fd stack Windows v\u00fdvoja, uvedomil som si, \u017ee situ\u00e1cia je \u0165a\u017ek\u00e1...<\/p>\n<p>Takto sa za\u010d\u00edna pr\u00edbeh <b>Alexandra Sin\u010dinova<\/b> na <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Ke\u010f z firmy odi\u0161iel ved\u00faci \u0161pecialista na Windows, Alexander sa za\u010dal zam\u00fd\u0161\u013ea\u0165, \u010do teraz robi\u0165. Prejs\u0165 na Linux, samozrejme! Alexander rozpr\u00e1va, ako sa mu podarilo vytvori\u0165 precedens a prelo\u017ei\u0165 \u010das\u0165 Windows v\u00fdvoja na Linux na pr\u00edklade realizovan\u00e9ho projektu pre 100 000 koncov\u00fdch pou\u017e\u00edvate\u013eov.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAko jednoducho a bez n\u00e1mahy doru\u010di\u0165 projekt v RPM, vyu\u017e\u00edvaj\u00fac TFS, Puppet a Linux .NET core? Ako uchov\u00e1va\u0165 verzionovanie datab\u00e1zy projektu, ak v\u00fdvoj\u00e1ri prv\u00fdkr\u00e1t po\u010duli slov\u00e1 Postgres a Flyway, a term\u00edn je u\u017e o dva dni? Ako integrova\u0165 s Dockerom? Ako motivova\u0165 .NET v\u00fdvoj\u00e1rov vzda\u0165 sa Windows a smoothie v prospech Puppet a Linux? Ako rie\u0161i\u0165 ideologick\u00e9 konflikty, ak niet s\u00edl, ani t\u00fa\u017eby, ani prostriedkov na podporu Windows v produkcii? O tom, ako aj o Web Deploy, testovan\u00ed, CI, praktik\u00e1ch vyu\u017e\u00edvania TFS v existuj\u00facich projektoch, a samozrejme, o zlomen\u00fdch podper\u00e1ch a funguj\u00facich rie\u0161eniach, hovor\u00ed Alexander vo svojej prezent\u00e1cii.<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=\"Prehrajte video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nTak\u017ee, V\u00e1clav odi\u0161iel, \u00faloha je na mne, v\u00fdvoj\u00e1ri \u010dakaj\u00fa s vidlami nedo\u010dkavo. Ke\u010f som si kone\u010dne uvedomil, \u017ee V\u00e1clava nevr\u00e1tim \u2014 pustil som sa do pr\u00e1ce. Na za\u010diatok som odhadol percento Win VM v na\u0161om parku. Po\u010dty nehrali v prospech Windows.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKe\u010f\u017ee akt\u00edvne rozv\u00edjame DevOps, uvedomil som si, \u017ee je potrebn\u00e9 zmeni\u0165 pr\u00edstup k zav\u00e1dzaniu novej aplik\u00e1cie. Rie\u0161en\u00edm bolo jedno \u2014 pokia\u013e je to mo\u017en\u00e9, v\u0161etko prenies\u0165 na Linux. Google mi pomohol \u2014 vtedy u\u017e bol .Net portovan\u00fd na Linux a uvedomil som si, \u017ee je to rie\u0161enie!<\/p>\n<h2>Pre\u010do .NET core v kombin\u00e1cii s Linuxom?<\/h2>\n<p>\nNa to bolo nieko\u013eko d\u00f4vodov. Medzi \u201eplati\u0165 peniaze\u201c a \u201eneplati\u0165\u201c v\u00e4\u010d\u0161ina zvol\u00ed druh\u00e9 \u2014 ako aj ja. Licencia na MSDB stoj\u00ed okolo 1 000 $, \u00fadr\u017eba parku virtu\u00e1lnych strojov Windows sa po\u010d\u00edta v stovk\u00e1ch dol\u00e1rov. Pre ve\u013ek\u00e9 spolo\u010dnosti s\u00fa to ve\u013ek\u00e9 n\u00e1klady. Preto <b>\u00faspora\u00a0<\/b>\u2014<b> je prv\u00fd d\u00f4vod<\/b>. Nie najd\u00f4le\u017eitej\u0161\u00ed, ale jeden z podstatn\u00fdch.<\/p>\n<p>Virtu\u00e1lne stroje Windows si vy\u017eaduj\u00fa viac zdrojov ako ich linuxov\u00ed kolegovia \u2014 <b>s\u00fa \u0165a\u017ek\u00e9<\/b>. Vzh\u013eadom na rozsah ve\u013ekej spolo\u010dnosti sme zvolili Linux.<\/p>\n<p><b>Syst\u00e9m sa jednoducho integruje do existuj\u00faceho CI<\/b>. Pova\u017eujeme sa za pokrokov\u00fdch DevOps, pou\u017e\u00edvame Bamboo, Jenkins a GitLab CI, tak\u017ee v\u00e4\u010d\u0161ina na\u0161ich oper\u00e1ci\u00ed prebieha na Linuxe.<\/p>\n<p>Posledn\u00fd d\u00f4vod je <b>pohodln\u00e1 podpora. <\/b>Museli sme zn\u00ed\u017ei\u0165 prah vstupu pre \u201epodporovate\u013eov\u201c \u2013 \u013eud\u00ed, ktor\u00ed rozumej\u00fa technickej str\u00e1nke, zabezpe\u010duj\u00fa nepretr\u017eitos\u0165 a obsluhuj\u00fa slu\u017eby druhej l\u00ednie. U\u017e boli obozn\u00e1men\u00ed so stackom Linux, preto pre nich bolo ove\u013ea jednoduch\u0161ie pochopi\u0165 nov\u00fd produkt, podporova\u0165 a spravova\u0165 ho, ne\u017e m\u00ed\u0148a\u0165 \u010fal\u0161ie zdroje na porozumenie podobn\u00e9mu funk\u010dn\u00e9mu softv\u00e9ru pre platformu Windows.<\/p>\n<h2>Po\u017eiadavky<\/h2>\n<p>\nPrv\u00e9 a najd\u00f4le\u017eitej\u0161ie je <b>pohodlie nov\u00e9ho rie\u0161enia pre v\u00fdvoj\u00e1rov<\/b>. Nie v\u0161etci z nich boli pripraven\u00ed na zmeny, najm\u00e4 po vysloven\u00ed slova Linux. V\u00fdvoj\u00e1ri chc\u00fa svoju ob\u013e\u00faben\u00fa Visual Studio, TFS s automatick\u00fdmi testami pre zostavy a smoothies. Ako prebieha dod\u00e1vka do produkcie \u2013 to pre nich nie je d\u00f4le\u017eit\u00e9. Preto sme sa rozhodli nemeni\u0165 osved\u010den\u00fd proces a necha\u0165 pre Windows v\u00fdvoj v\u0161etko bez zmien. <\/p>\n<p>Nov\u00fd projekt treba <b>integrova\u0165 do existuj\u00faceho CI<\/b>. Ko\u013eajnice u\u017e boli a cel\u00fa pr\u00e1cu bolo potrebn\u00e9 vykona\u0165 so zoh\u013eadnen\u00edm parametrov syst\u00e9mu riadenia konfigur\u00e1cie, prijat\u00fdch \u0161tandardov dod\u00e1vok a syst\u00e9mov monitorovania.<\/p>\n<p><b>Jednoduchos\u0165 v podpore a prev\u00e1dzke<\/b>, ako podmienka pre minim\u00e1lny prah vstupu pre v\u0161etk\u00fdch nov\u00fdch \u00fa\u010dastn\u00edkov z r\u00f4znych oddelen\u00ed a podpory.<\/p>\n<p><b>Deadline \u2013 v\u010dera<\/b>.<\/p>\n<h2>Skupina Win v\u00fdvoja<\/h2>\n<p>\nNa \u010dom teda pracoval t\u00edm Windows?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeraz m\u00f4\u017eem s ur\u010ditos\u0165ou poveda\u0165, \u017ee <b>IdentityServer4<\/b>\u00a0je skvel\u00e1 bezplatn\u00e1 alternat\u00edva ADFS s podobn\u00fdmi mo\u017enos\u0165ami, alebo \u017ee <b>Entity Framework Core<\/b>\u00a0je raj pre v\u00fdvoj\u00e1ra, kde sa nemus\u00ed zaobera\u0165 p\u00edsan\u00edm SQL skriptov, ale m\u00f4\u017ee opisova\u0165 dopyty do DB v r\u00e1mci OOP. Ale vtedy, na diskusii o pl\u00e1ne akci\u00ed, som na tento stack pozeral ako na \u0161umer\u010dinu, pri\u010dom som poznal iba PostgreSQL a Git.<\/p>\n<p>V tom \u010dase sme akt\u00edvne pou\u017e\u00edvali <b>Puppet<\/b> ako syst\u00e9m riadenia konfigur\u00e1cie. Vo v\u00e4\u010d\u0161ine na\u0161ich projektov sme pou\u017e\u00edvali <b>GitLab CI<\/b>, <b>Elastic<\/b>, vyva\u017eovali sme vysoko za\u0165a\u017een\u00e9 slu\u017eby pomocou <b>HAProxy,<\/b> sledovali sme v\u0161etko pomocou <b>Zabbix<\/b>, kombin\u00e1cie <b>Grafana<\/b> a\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, a to v\u0161etko be\u017ealo na\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> na\u00a0<b>VMware<\/b>. V\u0161etk\u00fdm zn\u00e1me \u2013 klasika \u017e\u00e1nru.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPozrime sa a pok\u00fasme sa pochopi\u0165, \u010do sa dialo predt\u00fdm, ako sme za\u010dali s t\u00fdmito z\u00e1sahmi.<\/p>\n<h2>\u010co sa stalo<\/h2>\n<p>\nTFS je dos\u0165 v\u00fdkonn\u00fd syst\u00e9m, ktor\u00fd nielen\u017ee doru\u010duje k\u00f3d od v\u00fdvoj\u00e1ra k fin\u00e1lnej produk\u010dnej ma\u0161ine, ale tie\u017e m\u00e1 sadu na ve\u013emi flexibiln\u00fa integr\u00e1ciu s r\u00f4znymi slu\u017ebami, aby zabezpe\u010dil CI na multiplatformovej \u00farovni.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPredt\u00fdm to boli iba nepriehladn\u00e9 okn\u00e1. TFS pou\u017e\u00edval nieko\u013eko Build agentov, na ktor\u00fdch sa zhroma\u017e\u010fovalo mno\u017estvo projektov. V ka\u017edom agente bolo 3-4 workery na paraleliz\u00e1ciu \u00faloh a optimaliz\u00e1ciu procesu. Potom, pod\u013ea pl\u00e1nov vydania, TFS dod\u00e1val \u010derstvo upe\u010den\u00fd Build na Windows server aplik\u00e1ci\u00ed.<\/p>\n<h2>K \u010domu sme chceli dospie\u0165<\/h2>\n<p>\nNa dod\u00e1vanie a v\u00fdvoj pou\u017e\u00edvame TFS, a aplik\u00e1ciu sp\u00fa\u0161\u0165ame na Linux Application serveri, a medzi nimi je ak\u00e1si m\u00e1gia. Tento <b>Magic Box<\/b> je so\u013eou nadch\u00e1dzaj\u00facej pr\u00e1ce. Predt\u00fdm, ako ho rozlo\u017e\u00edm na \u010dasti, urob\u00edm krok nabok a poviem dve slov\u00e1 o aplik\u00e1cii.<\/p>\n<h2>Projekt<\/h2>\n<p>\nAplik\u00e1cia poskytuje funk\u010dnos\u0165 na manipul\u00e1ciu s predplaten\u00fdmi kartami. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Client<\/h3>\n<p>\nExistovali dva typy pou\u017e\u00edvate\u013eov. <b>Prv\u00fd<\/b> mal pr\u00edstup, autorizuj\u00fac sa prostredn\u00edctvom certifik\u00e1tu SSL SHA-2. Druh\u00fd\u00a0<b>mal pr\u00edstup pomocou prihlasovac\u00edch \u00fadajov a hesla.<\/b> Potom klientsky po\u017eiadavok pre\u0161iel do HAProxy, ktor\u00fd rie\u0161il nasleduj\u00face \u00falohy:<\/p>\n<h3>HAProxy<\/h3>\n<p>\nprim\u00e1rna autoriz\u00e1cia;<\/p>\n<ul>\n<li>ukon\u010dovanie SSL;\n<\/li>\n<li>lad\u011bn\u00ed HTTP po\u017eiadaviek;\n<\/li>\n<li>prekl\u00e1danie po\u017eiadaviek.\n<\/li>\n<li>Overovanie certifik\u00e1tu klienta prebiehalo cez re\u0165azec. Sme\n<\/li>\n<\/ul>\n<p>\nauthority <b>a m\u00f4\u017eeme si to dovoli\u0165, preto\u017ee sami vyd\u00e1vame certifik\u00e1ty klientom slu\u017eby. <\/b>V\u0161imnite si tret\u00ed bod, nesk\u00f4r sa k nemu vr\u00e1time.<\/p>\n<p>Backend<\/p>\n<h3>Backend pl\u00e1novali na Linuxe. Backend interaguje s DB, na\u010d\u00edtava potrebn\u00fd zoznam privilegi\u00ed a potom, v z\u00e1vislosti od toho, ak\u00e9 privilegovan\u00e9 m\u00e1 autorizovan\u00fd pou\u017e\u00edvate\u013e, poskytuje pr\u00edstup na podpisovanie finan\u010dn\u00fdch dokumentov a ich odosielanie na vykonanie, alebo generovanie nejak\u00e9ho reportu.<\/h3>\n<p>\n\u00daspora s HAProxy<\/p>\n<h2>Okrem dvoch kontextov, ktor\u00fdmi prech\u00e1dzal ka\u017ed\u00fd z klientov, existoval e\u0161te kontext identity.<\/h2>\n<p>\nktor\u00fd presne umo\u017e\u0148uje autoriz\u00e1ciu, je to bezplatn\u00fd a v\u00fdkonn\u00fd ekvivalent pre <b>IdentityServer4<\/b> ADFS <b>Active Directory Federation Services\u00a0<\/b>\u2014<b> \u017diados\u0165 o identity sa spracov\u00e1vala v nieko\u013ek\u00fdch krokoch. Prv\u00fd krok -<\/b>.<\/p>\n<p>klient <b>sa dostal do backendu.<\/b> <b>dostal sa do backendu<\/b>, ktor\u00fd vymie\u0148al \u00fadaje s t\u00fdmto serverom a kontroloval pr\u00edtomnos\u0165 tokenu pre klienta. Ak ho nena\u0161iel, po\u017eiadavka sa vr\u00e1tila sp\u00e4\u0165 do kontextu, z ktor\u00e9ho pri\u0161la, ale u\u017e s presmerovan\u00edm, a s presmerovan\u00edm i\u0161la na identity.<\/p>\n<p>Druh\u00fd krok \u2013 po\u017eiadavka sa dostala <b>na str\u00e1nku autoriz\u00e1cie v IdentityServer,<\/b> kde sa klient registroval, a v datab\u00e1ze IdentityServer sa objavil ten vyt\u00fa\u017een\u00fd token. <\/p>\n<p>Tret\u00ed krok \u2013 <b>klient bol presmerovan\u00fd sp\u00e4\u0165 <\/b>do kontextu, z ktor\u00e9ho pri\u0161iel.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 m\u00e1 \u0161pecifickos\u0165: <b>odpove\u010f na sp\u00e4tn\u00fa po\u017eiadavku vracia cez HTTP<\/b>. Akoby sme sa s nastavovan\u00edm servera akoko\u013evek sna\u017eili, akoby sme si pre\u010d\u00edtali dokument\u00e1ciu, ale zaka\u017ed\u00fdm sme dostali inicia\u010dn\u00fa po\u017eiadavku klienta s URL, ktor\u00e1 pri\u0161la cez HTTPS, a IdentityServer vr\u00e1til ten ist\u00fd kontext, ale s HTTP. Chceli sme sa \u0161okova\u0165! A prelo\u017eili sme to cez kontext identity na HAProxy, a v hlavi\u010dk\u00e1ch sme museli upravi\u0165 protokol HTTP na HTTPS. <\/p>\n<p>Ak\u00e9 je teda zlep\u0161enie a kde sme u\u0161etrili?<\/p>\n<blockquote><p>U\u0161etrili sme peniaze pou\u017eit\u00edm bezplatn\u00e9ho rie\u0161enia pre autoriz\u00e1ciu skupiny pou\u017e\u00edvate\u013eov, vyu\u017eili sme prostriedky, preto\u017ee sme nevy\u010dlenili IdentityServer4 ako samostatn\u00fa uzol do samostatn\u00e9ho segmentu, ale pou\u017eili sme ho spolo\u010dne s backendom na tom istom serveri, na ktorom be\u017e\u00ed backend aplik\u00e1cie.<\/p><\/blockquote>\n<p><\/p>\n<h2>Ako by to malo fungova\u0165<\/h2>\n<p>\nTak\u017ee, ako som s\u013e\u00fabil \u2013 Magic Box. U\u017e rozumieme, \u017ee sa zaru\u010dene pos\u00favame k Linuxu. Po\u010fme formulova\u0165 konkr\u00e9tne \u00falohy, ktor\u00e9 potrebovali rie\u0161enie.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Manifesty Puppet. <\/b>Aby sme doru\u010dovali a spravovali konfigur\u00e1ciu slu\u017eby a aplik\u00e1cie, bolo potrebn\u00e9 nap\u00edsa\u0165 skvel\u00e9 recepty. Rolka s ceruzou v\u00fdsti\u017ene ukazuje, ako r\u00fdchlo a kvalitne to bolo uroben\u00e9.<\/p>\n<p><b>Sp\u00f4sob doru\u010dovania. <\/b>\u0160tandard je RPM. V\u0161etci ch\u00e1pu, \u017ee v Linuxe bez neho to nejde, ale samotn\u00fd projekt po zostaven\u00ed predstavoval s\u00fabor vykon\u00e1vac\u00edch DLL s\u00faborov. T\u00fdch bolo okolo 150, projekt bol dos\u0165 n\u00e1ro\u010dn\u00fd. Jedin\u00e9 harmonick\u00e9 rie\u0161enie je zabali\u0165 t\u00fato bin\u00e1rnu hmotu do RPM a z nej u\u017e rozbehn\u00fa\u0165 aplik\u00e1ciu.<\/p>\n<p><b>Verziovanie. <\/b>Museli sme sa \u010dasto releasova\u0165 a bolo potrebn\u00e9 rozhodn\u00fa\u0165, ako formova\u0165 n\u00e1zov bal\u00edka. To je ot\u00e1zka \u00farovne integr\u00e1cie s TFS. Build agent sme mali na Linuxe. Ke\u010f TFS posiela \u00falohu spracovate\u013eovi - worker - na Build agenta, odovzd\u00e1va mu aj skupinu premenn\u00fdch, ktor\u00e9 sa dostan\u00fa do prostredia procesu spracovate\u013ea. V t\u00fdchto premenn\u00fdch prostredia sa pren\u00e1\u0161a n\u00e1zov Build, verzia a \u010fal\u0161ie premenn\u00e9. Podrobnosti n\u00e1jdete v \u010dasti \u201es\u00fabor RPM bal\u00edka\u201c.<\/p>\n<p><b>Nastavenie TFS<\/b> spo\u010d\u00edvalo v nastaven\u00ed Pipeline. Predt\u00fdm sme zhroma\u017e\u010fovali v\u0161etky Windows projekty na Windows agentoch, ale teraz sa objavuje Linux agent - Build agent, ktor\u00fd treba prida\u0165 do skupiny zostavovania, obohati\u0165 o nejak\u00e9 artefakty, poveda\u0165, ak\u00e9ho typu projekty sa bud\u00fa zostavova\u0165 na tomto Build agentovi, a nejako modifikova\u0165 Pipeline.<\/p>\n<p><b>IdentityServer. <\/b>ADFS nie je na\u0161a cesta, podporujeme Open Source.<\/p>\n<p>Prejdeme si komponenty.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nSklad\u00e1 sa zo \u0161tyroch \u010dast\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build agent. <\/b>Linux, preto\u017ee ho na to potrebujeme - logicky. T\u00e1to \u010das\u0165 sa vykon\u00e1vala v troch krokoch.<\/p>\n<ul>\n<li><b>Nastavi\u0165 workery<\/b> a nie len jedn\u00e9ho, preto\u017ee sa predpokladala distribuovan\u00e1 pr\u00e1ca na projekte.\n<\/li>\n<li><b>Nain\u0161talova\u0165 .NET Core 1.x<\/b>. Pre\u010do pr\u00e1ve 1.x, ke\u010f je u\u017e dostupn\u00e9 2.0 v \u0161tandardnom repozit\u00e1ri? Preto\u017ee, ke\u010f sme za\u010dali vyv\u00edja\u0165, stabiln\u00e1 verzia bola 1.09 a projekt sa rozhodlo urobi\u0165 pod \u0148u.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repozit\u00e1r. <\/b>RPM bal\u00edky bolo potrebn\u00e9 niekde uchov\u00e1va\u0165. Predpokladalo sa, \u017ee budeme pou\u017e\u00edva\u0165 ten ist\u00fd podnikov\u00fd RPM repozit\u00e1r, ktor\u00fd je dostupn\u00fd v\u0161etk\u00fdm Linux hostite\u013eom. Tak sme na serveri repozit\u00e1ra nastavili <b>webhook<\/b> ktor\u00fd s\u0165ahoval po\u017eadovan\u00fd RPM bal\u00edk z uveden\u00e9ho miesta. Verziu bal\u00edka webhook-u oznamoval Build agent.<\/p>\n<p><b>GitLab. <\/b>Pozor! GitLab sa tu pou\u017e\u00edva nie v\u00fdvoj\u00e1rmi, ale oddelen\u00edm prev\u00e1dzky na kontrolu verzi\u00ed aplik\u00e1cie, verzi\u00ed bal\u00edkov, kontrolu stavu v\u0161etk\u00fdch Linux strojov a uchov\u00e1va tam recept\u00faru - v\u0161etky manifesty Puppet. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2014 rie\u0161i v\u0161etky sporn\u00e9 ot\u00e1zky a doru\u010duje presne t\u00fa konfigur\u00e1ciu, ktor\u00fa chceme, z Gitlabu.<\/p>\n<p>Za\u010dneme sa pon\u00e1ra\u0165. Ako prebieha dodanie DLL do RPM?<\/p>\n<h3>Dodanie DDL do RPM<\/h3>\n<p>\nPovedzme, \u017ee m\u00e1me rockov\u00fa hviezdu v\u00fdvoja na .NET. Pou\u017e\u00edva Visual Studio a vytv\u00e1ra release vetvu. Potom ju na\u010d\u00edta do Gitu, a Git tu - TFS entita, to znamen\u00e1, \u017ee je to repozit\u00e1r aplik\u00e1cie, s ktor\u00fdm pracuje v\u00fdvoj\u00e1r.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo \u010dom TFS vid\u00ed, \u017ee pri\u0161la nov\u00e1 commit. Ak\u00e1 aplik\u00e1cia? V nastaveniach TFS je ozna\u010denie, ak\u00fdmi prostriedkami disponuje dan\u00fd Build-agent. V tomto pr\u00edpade vid\u00ed, \u017ee zbierame .NET Core projekt a vyber\u00e1 Linux Build-agent z poolu. <\/p>\n<p>Build-agent z\u00edska zdrojov\u00e9 k\u00f3dy, stiahne potrebn\u00e9 <b>z\u00e1vislosti<\/b> z repozit\u00e1ra .NET, npm at\u010f. a po zostaven\u00ed aplik\u00e1cie a n\u00e1slednom zabalen\u00ed odosiela RPM-bal\u00edk do RPM-repozit\u00e1ra.<\/p>\n<p>Na druhej strane prebieha toto. In\u017einier oddelenia prev\u00e1dzky sa priamo zaober\u00e1 nasaden\u00edm projektu: men\u00ed verzie bal\u00edkov v\u00a0<b>Hiera<\/b> v repozit\u00e1ri, kde je ulo\u017een\u00fd recept aplik\u00e1cie, po \u010dom Puppet spust\u00ed <b>Yum<\/b>, vezme nov\u00fd bal\u00edk z repozit\u00e1ra a nov\u00e1 verzia aplik\u00e1cie je pripraven\u00e1 na pou\u017eitie.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa papieri je v\u0161etko jednoduch\u00e9, ale \u010do sa deje vo vn\u00fatri samotn\u00e9ho Build-agenta?<\/p>\n<h3>Balenie DLL RPM<\/h3>\n<p>\nZ\u00edskan\u00e9 zdrojov\u00e9 k\u00f3dy projektu a \u00faloha na zostavenie od TFS. Build-agent <b>sp\u00fa\u0161\u0165a zostavenie samotn\u00e9ho projektu zo zdrojov<\/b>. Zostaven\u00fd projekt je dostupn\u00fd vo forme mno\u017estva <b>DLL s\u00faborov<\/b>, ktor\u00e9 s\u00fa zabalen\u00e9 do zip-arch\u00edvu na zn\u00ed\u017eenie z\u00e1\u0165a\u017ee na s\u00faborov\u00fd syst\u00e9m.<\/p>\n<p>ZIP-arch\u00edv je umiestnen\u00fd <b>do adres\u00e1ra zostavenia bal\u00edka RPM.<\/b> \u010ealej Bash-skript inicializuje premenn\u00e9 prostredia, n\u00e1jde verziu Build, verziu projektu, cestu do adres\u00e1ra zostavenia a sp\u00fa\u0161\u0165a RPM-build. Po skon\u010den\u00ed zostavenia je bal\u00edk publikovan\u00fd do\u00a0<b>m\u00edstneho repozit\u00e1ra<\/b>, ktor\u00fd sa nach\u00e1dza na Build-agente.<\/p>\n<p>\u010ealej, z Build-agenta na server v RPM-repozit\u00e1ri <b>odch\u00e1dza JSON-dopyt<\/b> s uveden\u00edm mena verzie a buildu. Webhook, o ktorom som u\u017e hovoril, stiahne tento bal\u00edk z miestneho repozit\u00e1ra na Build-agente a spr\u00edstupn\u00ed nov\u00fa zostavu na in\u0161tal\u00e1ciu.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPre\u010do pr\u00e1ve tak\u00fdto sch\u00e9ma dodania bal\u00edka do repozit\u00e1ra RPM? Pre\u010do nemo\u017eno okam\u017eite odosla\u0165 zostaven\u00fd bal\u00edk do repozit\u00e1ra? Ide o to, \u017ee toto je podmienka pre zabezpe\u010denie. Tak\u00fdto scen\u00e1r obmedzuje mo\u017enos\u0165 neopr\u00e1vnenej zlo\u017eenia RPM-bal\u00edkov cudz\u00edmi osobami na server, ktor\u00fd je pr\u00edstupn\u00fd v\u0161etk\u00fdm Linuxov\u00fdm strojom.<\/p>\n<h2>Verzionovanie DB<\/h2>\n<p>\nNa konz\u00edliu s v\u00fdvojom sa zistilo, \u017ee chlapcom je bli\u017e\u0161ie MS SQL, ale vo v\u00e4\u010d\u0161ine non-Windows projektov sme u\u017e naplno pou\u017e\u00edvali PostgreSQL. Preto\u017ee sme sa u\u017e rozhodli vzda\u0165 v\u0161etk\u00e9ho platen\u00e9ho, za\u010dali sme pou\u017e\u00edva\u0165 PostgreSQL aj tu.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV tejto \u010dasti chcem hovori\u0165 o tom, ako sme realizovali verzionovanie DB a ako sme si vyberali medzi Flyway a Entity Framework Core. Pozrime sa na ich v\u00fdhody a nev\u00fdhody.<\/p>\n<h3>Nev\u00fdhody<\/h3>\n<p>\nFlyway ide len jedn\u00fdm smerom, my\u00a0<b>nem\u00f4\u017eeme sa vr\u00e1ti\u0165 sp\u00e4\u0165<\/b>\u00a0\u2014 to je z\u00e1sadn\u00fd m\u00ednus. Porovn\u00e1va\u0165 s Entity Framework Core je mo\u017en\u00e9 z in\u00fdch parametrov \u2014 z h\u013eadiska pohodlia v\u00fdvoj\u00e1ra. Ve\u010f si pam\u00e4t\u00e1te, \u017ee sme to postavili do centra pozornosti, a hlavn\u00fdm krit\u00e9riom bolo nezmeni\u0165 ni\u010d pre Windows v\u00fdvoj.<\/p>\n<p>Pre Flyway sme <b>potrebovali ak\u00fdsi wrapper<\/b>, aby chlapi nep\u00edsali <b>SQL dopyty<\/b>. Pre nich je ove\u013ea prirodzenej\u0161ie pracova\u0165 v term\u00ednoch OOP. Nap\u00edsali sme pokyny na pr\u00e1cu s objektmi DB, SQL dopyt bol vygenerovan\u00fd a vykonan\u00fd. Nov\u00e1 verzia DB je pripraven\u00e1, vysk\u00fa\u0161ali sme ju \u2014 v\u0161etko je v poriadku, v\u0161etko funguje.<\/p>\n<p>Entity Framework Core m\u00e1 nev\u00fdhodu \u2014 pri vysok\u00fdch za\u0165a\u017eeniach generuje\u00a0<b>neoptim\u00e1lne SQL dopyty<\/b>, a pokles v\u00fdkonu DB m\u00f4\u017ee by\u0165 zna\u010dn\u00fd. Ale preto\u017ee na\u0161i slu\u017eby nie s\u00fa ve\u013emi za\u0165a\u017een\u00e9, nezaznamen\u00e1vame za\u0165a\u017eenie v stovk\u00e1ch RPS, prijali sme tieto rizik\u00e1 a delegovali probl\u00e9m bud\u00facim n\u00e1m.<\/p>\n<h3>V\u00fdhody<\/h3>\n<p>\nEntity Framework Core <b>funguje z krabice a je pohodln\u00fd pre v\u00fdvoj<\/b>, zatia\u013e \u010do Flyway <b>sa \u013eahko integruje do existuj\u00faceho CI<\/b>. Ale rob\u00edme to pre pohodlie v\u00fdvoj\u00e1rov :)<\/p>\n<h3>Proced\u00fara nasadenia<\/h3>\n<p>\nPuppet vid\u00ed, \u017ee prich\u00e1dza zmena verzie bal\u00edkov, medzi ktor\u00fdmi je aj ten, ktor\u00fd zodpoved\u00e1 za migr\u00e1ciu. Najprv nain\u0161taluje bal\u00edk, ktor\u00fd obsahuje migra\u010dn\u00e9 skripty a funk\u010dnos\u0165 viazan\u00fa na DB. Po tom sa re\u0161tartuje aplik\u00e1cia, ktor\u00e1 pracuje s DB. Potom nasleduje in\u0161tal\u00e1cia zost\u00e1vaj\u00facich komponentov. Poradie in\u0161tal\u00e1cie bal\u00edkov a spustenia aplik\u00e1ci\u00ed je pop\u00edsan\u00e9 v manifeste Puppet.<\/p>\n<p>Aplik\u00e1cie pou\u017e\u00edvaj\u00fa citliv\u00e9 \u00fadaje, ako s\u00fa tokeny, hesl\u00e1 k DB, v\u0161etko to sa s\u0165ahuje do konfigur\u00e1cie z Puppet mastera, kde s\u00fa ulo\u017een\u00e9 v za\u0161ifrovanej forme.<\/p>\n<h2>Probl\u00e9my TFS<\/h2>\n<p>\nPotom, \u010do sme sa rozhodli a zistili, \u017ee n\u00e1m naozaj v\u0161etko funguje, rozhodol som sa pozrie\u0165, \u010do sa deje so zostavami v TFS celkovo pre oddelenie Win v\u00fdvoja v in\u00fdch projektoch \u2014 \u010di r\u00fdchlo zostavujeme\/release-ujeme, a objavil som z\u00e1sadn\u00e9 probl\u00e9my s r\u00fdchlos\u0165ou.<\/p>\n<p>Jeden z hlavn\u00fdch projektov sa zostavuje 12-15 min\u00fat \u2014 to je dlh\u00e9, takto sa \u017ei\u0165 ned\u00e1. R\u00fdchla anal\u00fdza uk\u00e1zala hrozn\u00e9 poklesy v\u00fdkonu pri I\/O, a to na mas\u00edvoch.<\/p>\n<p>Po anal\u00fdze po komponentoch som vy\u010dlenil tri ohnisk\u00e1. Prv\u00e9 \u2014 <b>\u201eKaspersky antivirus\u201c<\/b>, ktor\u00fd skenuje zdrojov\u00e9 k\u00f3dy na\u00a0v\u0161etk\u00fdch Windows Build agentoch. Druh\u00fd\u00a0\u2014 <b>Windows<\/b> <b>Index\u00e9r.<\/b> Nebolo to vypnut\u00e9 a\u00a0\u0161lo to v\u00a0re\u00e1lnom \u010dase, indexovalo sa v\u0161etko po\u010das procesu nasadenia. <\/p>\n<p>Tret\u00ed\u00a0\u2014 <b>Npm install. <\/b>Uk\u00e1zalo sa, \u017ee v\u00a0v\u00e4\u010d\u0161ine Pipeline sme pou\u017e\u00edvali pr\u00e1ve tento scen\u00e1r. \u010c\u00edm je zl\u00fd? Proced\u00fara Npm install sa sp\u00fa\u0161\u0165a pri vytv\u00e1ran\u00ed stromu z\u00e1vislost\u00ed v\u00a0<b>package-lock.json<\/b>, kde s\u00fa zaznamenan\u00e9 verzie bal\u00edkov, ktor\u00e9 sa bud\u00fa pou\u017e\u00edva\u0165 na\u00a0s\u00faborn\u00fd projekt. Nev\u00fdhoda je v\u00a0tom, \u017ee Npm install ka\u017ed\u00fd raz \u0165ah\u00e1 aktu\u00e1lne verzie bal\u00edkov z\u00a0internetu, a\u00a0to je nemal\u00fd \u010das v\u00a0pr\u00edpade ve\u013ek\u00e9ho projektu.<\/p>\n<blockquote><p>V\u00fdvoj\u00e1ri niekedy experimentuj\u00fa na\u00a0lok\u00e1lnom stroji, aby otestovali fungovanie jednotliv\u00fdch \u010dast\u00ed alebo projektu ako celku. Niekedy to dopadlo tak, \u017ee lok\u00e1lne to v\u0161etko fungovalo skvele, ale pri zostavovan\u00ed, nasadzovan\u00ed \u2014 ni\u010d nefungovalo. Za\u010dneme zis\u0165ova\u0165, v\u00a0\u010dom je probl\u00e9m \u2014 aha, r\u00f4zne verzie bal\u00edkov so\u00a0z\u00e1vislos\u0165ami.<\/p><\/blockquote>\n<p><\/p>\n<h3>Rie\u0161enie<\/h3>\n<p><\/p>\n<ul>\n<li>Zdroje v\u00a0v\u00fdnimk\u00e1ch AV.\n<\/li>\n<li>Vypnutie index\u00e1cie.\n<\/li>\n<li>Prechod na\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nPlusy npm ci s\u00fa v\u00a0tom, \u017ee\u00a0<b>zostavujeme strom z\u00e1vislost\u00ed jednorazovo<\/b>, a\u00a0dost\u00e1vame mo\u017enos\u0165 poskytn\u00fa\u0165 v\u00fdvoj\u00e1rovi <b>aktu\u00e1lny zoznam bal\u00edkov<\/b>, s\u00a0ktor\u00fdmi m\u00f4\u017ee neraz experimentova\u0165 lok\u00e1lne. To <b>\u0161et\u0159\u00ed \u010das<\/b> v\u00fdvoj\u00e1rov, ktor\u00ed p\u00ed\u0161u k\u00f3d.<\/p>\n<h3>Konfigur\u00e1cia<\/h3>\n<p>\nTeraz trochu o\u00a0konfigur\u00e1cii repozit\u00e1ra. Historicky pou\u017e\u00edvame <b>Nexus<\/b> na\u00a0spr\u00e1vu repozit\u00e1rov, vr\u00e1tane <b>Intern\u00e9ho REPO<\/b>. Do tohto intern\u00e9ho repozit\u00e1ra sa dod\u00e1vaj\u00fa v\u0161etky komponenty, ktor\u00e9\u00a0pou\u017e\u00edvame na\u00a0intern\u00e9 \u00fa\u010dely, napr\u00edklad vlastn\u00e9 monitorovanie.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core na Linuxu, DevOps na koni\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTie\u017e pou\u017e\u00edvame <b>NuGet<\/b>, preto\u017ee lep\u0161ie cache-uje v\u00a0porovnan\u00ed s\u00a0in\u00fdmi spr\u00e1vami bal\u00edkov.<\/p>\n<h3>V\u00fdsledok<\/h3>\n<p>\nPo optimaliz\u00e1cii Build agentov sa priemern\u00fd \u010das zostavenia skr\u00e1til z 12 min\u00fat na 7.<\/p>\n<blockquote><p>Ak spo\u010d\u00edtame v\u0161etky stroje, ktor\u00e9\u00a0by sme mohli pou\u017ei\u0165 pre Windows, ale\u00a0pre\u0161li na\u00a0Linux v\u00a0tomto projekte, u\u0161etrili sme pribli\u017ene 10 000 dol\u00e1rov. A\u00a0to s\u00fa len licencie, a\u00a0ak zoh\u013eadn\u00edme n\u00e1klady na\u00a0\u00fadr\u017ebu \u2014 e\u0161te viac.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pl\u00e1ny<\/h2>\n<p>\nNa\u00a0bud\u00faci kvart\u00e1l sme napl\u00e1novali pr\u00e1cu na\u00a0optimaliz\u00e1cii dod\u00e1vania k\u00f3du.<\/p>\n<p><b>Prechod na\u00a0prebuild Docker obraz<\/b>. TFS je skvel\u00fd n\u00e1stroj s\u00a0mno\u017estvom pluginov, ktor\u00e9 umo\u017e\u0148uj\u00fa integr\u00e1ciu do pipeline, vr\u00e1tane zostavovania na\u00a0sp\u00fa\u0161\u0165a\u010d, napr\u00edklad Docker obraz. Tento sp\u00fa\u0161\u0165a\u010d chceme nastavi\u0165 na\u00a0ten ist\u00fd <b>package-lock.json<\/b>. Ak sa nejako men\u00ed zlo\u017eenie komponentov, ktor\u00e9 sa pou\u017e\u00edvaj\u00fa na zostavenie projektu \u2014 vytvor\u00ed sa nov\u00fd Docker obraz. V bud\u00facnosti sa pou\u017eije na nasadenie kontajnera so zostavenou aplik\u00e1ciou. Moment\u00e1lne to nie je, ale pl\u00e1nujeme prechod na mikroslu\u017ebov\u00fa architekt\u00faru v Kubernetes, ktor\u00e1 sa akt\u00edvne vyv\u00edja v na\u0161ej spolo\u010dnosti a dlhodobo zabezpe\u010duje produk\u010dn\u00e9 rie\u0161enia.<\/p>\n<h2>Zhrnutie<\/h2>\n<p>\nVyjadrujem v\u00fdzvu v\u0161etk\u00fdm, aby sa zbavili Windows, ale nie preto, \u017ee by som ju nevedel pripravi\u0165. D\u00f4vodom je, \u017ee v\u00e4\u010d\u0161ina Opensource rie\u0161en\u00ed \u2014 to je <b>Linux stack<\/b>. U\u0161etr\u00edte na zdrojoch. <b>Pod\u013ea m\u00f4jho n\u00e1zoru, bud\u00facnos\u0165 patr\u00ed rie\u0161eniam Open Source na Linuxe s siln\u00fdm komunitn\u00fdm z\u00e1zem\u00edm.<\/b>Profil re\u010dn\u00edka Alexandra Sin\u010dinova<\/p>\n<p><i>na GitHub <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">DevOps Conf<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">je konferencia o integr\u00e1cii procesov v\u00fdvoja, testovania a prev\u00e1dzky pre profesion\u00e1lov od profesion\u00e1lov. Pr\u00e1ve preto je projekt, o ktorom rozpr\u00e1val Alexander, realizovan\u00fd a funguje, a v de\u0148 vyst\u00fapenia bolo vykonan\u00fdch dva \u00faspe\u0161n\u00e9 release. Na<\/a><\/noindex>\u00a0DevOps Conf na RIT++\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">27 a 28 m\u00e1ja bude e\u0161te viac podobn\u00fdch pr\u00edpadov od praktikantov. E\u0161te sa m\u00f4\u017eete nasku\u010di\u0165 do posledn\u00e9ho vag\u00f3na a<\/a><\/noindex> predlo\u017ei\u0165 pr\u00edspevok <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">alebo v pokoji<\/a><\/noindex> rezervova\u0165 <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">l\u00edstok. Uvid\u00edme sa v Skolkove!<\/a><\/noindex> My sme rozv\u00edjali DevOps, ako sme mohli. Bolo n\u00e1s 8 a Va\u0161a bol najlep\u0161\u00ed v Windows. Neo\u010dak\u00e1vane Va\u0161a odi\u0161iel a ja som dostal \u00falohu vyvies\u0165 nov\u00fd projekt, ktor\u00fd dod\u00e1va Windows v\u00fdvoj.<\/p><\/blockquote>\n<p>Zdroj: <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.3 - 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\/sk\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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 na Linuxe, DevOps na koni | ProHoster","description":"\ud83e\udd47 .NET Core na Linuxe, DevOps na koni | ProHoster","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}