{"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\/cs\/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>Vyv\u00edjeli jsme DevOps, jak jsme mohli. Bylo n\u00e1s 8 lid\u00ed a Va\u0161a byl nejlep\u0161\u00edm specialistou na Windows. Najednou Va\u0161a ode\u0161el a j\u00e1 dostal \u00fakol spustit nov\u00fd projekt, kter\u00fd poskytuje v\u00fdvoj pro Windows. Kdy\u017e jsem na st\u016fl vyjmenoval cel\u00fd stack Windows v\u00fdvoje, uv\u011bdomil jsem si, \u017ee situace je bolestiv\u00e1...<\/p>\n<p>Tak za\u010d\u00edn\u00e1 p\u0159\u00edb\u011bh <b>Alexandr Sin\u010dinov<\/b> na <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Kdy\u017e z firmy ode\u0161el vedouc\u00ed specialista na Windows, Alexandr si polo\u017eil ot\u00e1zku, co te\u010f d\u011blat. P\u0159ech\u00e1zet na Linux, samoz\u0159ejm\u011b! Alexandr pov\u00ed, jak se mu poda\u0159ilo vytvo\u0159it precedens a p\u0159ev\u00e9st \u010d\u00e1st v\u00fdvoje Windows na Linux na p\u0159\u00edkladu realizovan\u00e9ho projektu pro 100 000 koncov\u00fdch u\u017eivatel\u016f.<\/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 \/>\nJak snadno a neform\u00e1ln\u011b dod\u00e1vat projekt v RPM pomoc\u00ed TFS, Puppet, Linux .NET core? Jak udr\u017eovat verzov\u00e1n\u00ed datab\u00e1ze projektu, kdy\u017e v\u00fdvoj\u00e1\u0159i poprv\u00e9 sly\u0161\u00ed slova Postgres a Flyway, a term\u00edn je poz\u00edt\u0159\u00ed? Jak integrovat s Dockerem? Jak motivovat .NET v\u00fdvoj\u00e1\u0159e, aby se vzdali Windows a smoothi\u00ed ve prosp\u011bch Puppetu a Linuxu? Jak \u0159e\u0161it ideologick\u00e9 konflikty, kdy\u017e obsluhovat Windows v produkci nen\u00ed sil, p\u0159\u00e1n\u00ed ani zdroj\u016f? O tom, a tak\u00e9 o Web Deploy, testov\u00e1n\u00ed, CI, o praktik\u00e1ch pou\u017e\u00edv\u00e1n\u00ed TFS v existuj\u00edc\u00edch projektech, a samoz\u0159ejm\u011b o zlomen\u00fdch berli\u010dk\u00e1ch a funk\u010dn\u00edch \u0159e\u0161en\u00edch, v p\u0159episu p\u0159edn\u00e1\u0161ky Alexandra.<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=\"P\u0159ehr\u00e1t 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 Va\u0161a ode\u0161el, \u00fakol je na mn\u011b, v\u00fdvoj\u00e1\u0159i \u010dekaj\u00ed s vidlemi nedo\u010dkav\u011b. Kdy\u017e jsem si kone\u010dn\u011b uv\u011bdomil, \u017ee Va\u0161u nelze vr\u00e1tit \u2014 pustil jsem se do pr\u00e1ce. Nejprve jsem odhadl procento Win VM v na\u0161em parku. Po\u010dty nebyly v prosp\u011bch 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 \/>\nProto\u017ee aktivn\u011b rozv\u00edj\u00edme DevOps, uv\u011bdomil jsem si, \u017ee je t\u0159eba n\u011bco zm\u011bnit v p\u0159\u00edstupu k zaveden\u00ed nov\u00e9 aplikace. \u0158e\u0161en\u00ed bylo jedno \u2014 pokud mo\u017eno p\u0159ev\u00e9st v\u0161e na Linux. Google mi pomohl \u2014 v t\u00e9 dob\u011b u\u017e byl .Net portov\u00e1n na Linux, a j\u00e1 jsem pochopil, \u017ee to je \u0159e\u0161en\u00ed!<\/p>\n<h2>Pro\u010d .NET core ve spojen\u00ed s Linuxem?<\/h2>\n<p>\nNa to bylo n\u011bkolik d\u016fvod\u016f. Mezi \u201eplatit pen\u00edze\u201c a \u201eneplatit\u201c v\u011bt\u0161ina vybere druh\u00e9 \u2014 jako j\u00e1. Licence na MSDB stoj\u00ed kolem 1 000 $, \u00fadr\u017eba parku virtu\u00e1ln\u00edch stroj\u016f Windows se po\u010d\u00edt\u00e1 na stovky dolar\u016f. Pro velkou firmu to jsou velk\u00e9 n\u00e1klady. Proto <b>\u00faspora\u00a0<\/b>\u2014<b> je prvn\u00ed d\u016fvod<\/b>. Nejsou to nejd\u016fle\u017eit\u011bj\u0161\u00ed d\u016fvody, ale jeden z v\u00e1\u017en\u00fdch.<\/p>\n<p>Virtu\u00e1ln\u00ed stroje Windows zab\u00edraj\u00ed v\u00edce zdroj\u016f ne\u017e jejich linuxov\u00ed brat\u0159i \u2014 <b>jsou t\u011b\u017ek\u00e9<\/b>. Vzhledem k velikosti velk\u00e9 spole\u010dnosti jsme zvolili Linux.<\/p>\n<p><b>Syst\u00e9m se jednodu\u0161e integruje do st\u00e1vaj\u00edc\u00edho CI<\/b>. Pova\u017eujeme se za progresivn\u00ed DevOps\u00e1ky, pou\u017e\u00edv\u00e1me Bamboo, Jenkins a GitLab CI, a proto v\u011bt\u0161ina na\u0161ich operac\u00ed b\u011b\u017e\u00ed na Linuxu.<\/p>\n<p>Posledn\u00ed d\u016fvod je <b>pohodln\u00e1 \u00fadr\u017eba. <\/b>Pot\u0159ebovali jsme sn\u00ed\u017eit p\u0159ek\u00e1\u017eky pro \"\u00fadr\u017eb\u00e1\u0159e\" \u2013 lidi, kte\u0159\u00ed ch\u00e1pou technickou \u010d\u00e1st, zaji\u0161\u0165uj\u00ed bezprobl\u00e9movost a obsluhuj\u00ed slu\u017eby ze druh\u00e9 linie. Ti u\u017e byli obezn\u00e1meni se stackem Linux, tak\u017ee pro n\u011b je mnohem snaz\u0161\u00ed pochopit nov\u00fd produkt, podporovat ho a udr\u017eovat, ne\u017e vynakl\u00e1dat dal\u0161\u00ed prost\u0159edky na zvl\u00e1dnut\u00ed obdobn\u00e9 funk\u010dnosti softwaru pro Windows.<\/p>\n<h2>Po\u017eadavky<\/h2>\n<p>\nPrvn\u00ed a hlavn\u00ed je <b>pohodl\u00ed nov\u00e9ho \u0159e\u0161en\u00ed pro v\u00fdvoj\u00e1\u0159e<\/b>. Ne v\u0161ichni byli p\u0159ipraveni na zm\u011bny, zvl\u00e1\u0161\u0165 po vysloven\u00ed slova Linux. V\u00fdvoj\u00e1\u0159i cht\u011bj\u00ed svou obl\u00edbenou Visual Studio, TFS s automatizovan\u00fdmi testy pro sestaven\u00ed a smoothie. Jak prob\u00edh\u00e1 dod\u00e1n\u00ed do produkce \u2013 to jim nen\u00ed d\u016fle\u017eit\u00e9. Proto jsme se rozhodli nem\u011bnit obvykl\u00fd proces a ponechat pro Windows v\u00fdvoj v\u0161e beze zm\u011bn. <\/p>\n<p>Nov\u00fd projekt je t\u0159eba <b>integrovat do st\u00e1vaj\u00edc\u00edho CI<\/b>. R\u00e1my u\u017e byly a ve\u0161kerou pr\u00e1ci bylo nutn\u00e9 prov\u00e9st s ohledem na parametry syst\u00e9mu pro spr\u00e1vu konfigurace, p\u0159ijat\u00e9 standardy dod\u00e1n\u00ed a monitorovac\u00ed syst\u00e9my.<\/p>\n<p><b>Jednoduchost v \u00fadr\u017eb\u011b a provozu<\/b>, jako podm\u00ednka pro minim\u00e1ln\u00ed p\u0159ek\u00e1\u017eky pro v\u0161echny nov\u00e9 \u00fa\u010dastn\u00edky z r\u016fzn\u00fdch odd\u011blen\u00ed a \u00fadr\u017eby.<\/p>\n<p><b>Deadlinem byl v\u010dera<\/b>.<\/p>\n<h2>Skupina Win developmentu<\/h2>\n<p>\nNa \u010dem tedy pracoval t\u00fdm 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 \/>\nTe\u010f mohu s jistotou \u0159\u00edci, \u017ee <b>IdentityServer4<\/b>\u00a0je skv\u011bl\u00e1 bezplatn\u00e1 alternativa ADFS se srovnateln\u00fdmi mo\u017enostmi, nebo co <b>Entity Framework Core<\/b>\u00a0je r\u00e1jem pro v\u00fdvoj\u00e1\u0159e, kde se nemus\u00edte tr\u00e1pit psan\u00edm SQL skript\u016f, ale popisujete dotazy do DB v term\u00ednech OOP. Ale tehdy, na diskuzi o pl\u00e1nu akce, jsem se na tento stack d\u00edval jako na sumerskou kl\u00ednov\u00e9 p\u00edsmo, pozn\u00e1val pouze PostgreSQL a Git.<\/p>\n<p>V tu dobu jsme aktivn\u011b pou\u017e\u00edvali <b>Puppet<\/b> jako syst\u00e9m spr\u00e1vy konfigurace. V v\u011bt\u0161in\u011b na\u0161ich projekt\u016f jsme aplikovali <b>GitLab CI<\/b>, <b>Elastic<\/b>, vyva\u017eovali vysoce zat\u00ed\u017een\u00e9 slu\u017eby s pomoc\u00ed <b>HAProxy,<\/b> sledovali v\u0161e s pomoc\u00ed <b>Zabbix<\/b>, propojen\u00ed <b>Grafana<\/b> a\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, a to v\u0161echno b\u011b\u017eelo na stroj\u00edch\u00a0<b>HP<\/b> s\u00a0<b>ESXi<\/b> na\u00a0<b>VMware<\/b>. V\u0161ichni to 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 \/>\nPod\u00edv\u00e1me se a pokus\u00edme se pochopit, co se d\u011blo p\u0159edt\u00edm, ne\u017e jsme se pustili do v\u0161ech t\u011bchto z\u00e1sah\u016f.<\/p>\n<h2>Co bylo<\/h2>\n<p>\nTFS je pom\u011brn\u011b mocn\u00fd syst\u00e9m, kter\u00fd nejen dod\u00e1v\u00e1 k\u00f3d od v\u00fdvoj\u00e1\u0159e k fin\u00e1ln\u00edmu produk\u010dn\u00edmu stroji, ale tak\u00e9 m\u00e1 sadu pro velmi flexibiln\u00ed integraci s r\u016fzn\u00fdmi slu\u017ebami \u2013 pro zaji\u0161t\u011bn\u00ed CI na multiplatformn\u00ed \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 \/>\nD\u0159\u00edve to byly sam\u00e9 okna. TFS pou\u017e\u00edval n\u011bkolik Build-agent\u016f, na kter\u00fdch se shroma\u017e\u010fovalo mno\u017estv\u00ed projekt\u016f. V ka\u017ed\u00e9m agentu bylo 3-4 pracovn\u00edk\u016f, aby se \u00fakoly paralelizovaly a optimalizoval proces. D\u00e1le, podle vyd\u00e1vac\u00edch pl\u00e1n\u016f, TFS dod\u00e1val \u010derstv\u011b upe\u010den\u00fd Build na Windows-server aplikac\u00ed.<\/p>\n<h2>K \u010demu jsme cht\u011bli p\u0159ij\u00edt<\/h2>\n<p>\nPro dod\u00e1n\u00ed a v\u00fdvoj pou\u017e\u00edv\u00e1me TFS, a spou\u0161t\u00edme aplikaci na Linux Application server, a mezi nimi je n\u011bjak\u00e1 magie. Tento <b>Magic Box<\/b> je s\u016fl nadch\u00e1zej\u00edc\u00ed pr\u00e1ce. Ne\u017e ho rozebere na \u010d\u00e1sti, ud\u011bl\u00e1m krok stranou a \u0159eknu dv\u011b slova o aplikaci.<\/p>\n<h2>Projekt<\/h2>\n<p>\nAplikace poskytuje funkcionalitu pro operace s p\u0159edplacen\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>\nExistovaly dva typy u\u017eivatel\u016f. <b>Prvn\u00ed<\/b> m\u011bl p\u0159\u00edstup, autorizuj\u00edc\u00ed se pomoc\u00ed SSL certifik\u00e1tu SHA-2. Druh\u00fd\u00a0<b>m\u011bl p\u0159\u00edstup pomoc\u00ed u\u017eivatelsk\u00e9ho jm\u00e9na a hesla.<\/b> HAProxy<\/p>\n<h3>D\u00e1le klientsk\u00fd dotaz vch\u00e1zel do HAProxy, kter\u00e9 \u0159e\u0161ilo n\u00e1sleduj\u00edc\u00ed \u00fakoly:<\/h3>\n<p>\nprim\u00e1rn\u00ed autorizace;<\/p>\n<ul>\n<li>terminace SSL;\n<\/li>\n<li>lad\u011bn\u00ed HTTP dotaz\u016f;\n<\/li>\n<li>p\u0159esm\u011brov\u00e1n\u00ed dotaz\u016f.\n<\/li>\n<li>Ov\u011b\u0159en\u00ed certifik\u00e1tu klienta prob\u00edhalo p\u0159es \u0159et\u011bzec. My jsme \u2013\n<\/li>\n<\/ul>\n<p>\nauthority <b>a m\u016f\u017eeme si to dovolit, proto\u017ee sami vyd\u00e1v\u00e1me certifik\u00e1ty klient\u016fm slu\u017eby. <\/b>V\u0161imn\u011bte si t\u0159et\u00edho bodu, k tomu se vr\u00e1t\u00edme pozd\u011bji.<\/p>\n<p>Backend<\/p>\n<h3>Backend pl\u00e1novali ud\u011blat na Linuxu. Backend interaguje s DB, na\u010d\u00edt\u00e1 pot\u0159ebn\u00fd seznam privilegi\u00ed a pot\u00e9, v z\u00e1vislosti na tom, jak\u00e1 privilegium m\u00e1 autorizovan\u00fd u\u017eivatel, poskytuje p\u0159\u00edstup k podepisov\u00e1n\u00ed finan\u010dn\u00edch dokument\u016f a jejich zas\u00edl\u00e1n\u00ed k realizaci, nebo generaci n\u011bjak\u00e9 zpr\u00e1vy.<\/h3>\n<p>\n\u00daspora s HAProxy<\/p>\n<h2>Krom\u011b dvou kontext\u016f, ve kter\u00fdch ka\u017ed\u00fd z klient\u016f pob\u00edhal, existoval je\u0161t\u011b kontext identity.<\/h2>\n<p>\nten umo\u017e\u0148uje autorizaci, je to bezplatn\u00e1 a mocn\u00e1 alternativa pro <b>IdentityServer4<\/b> ADFS <b>Active Directory Federation Services\u00a0<\/b>\u2014<b> Dotaz v identity byl zpracov\u00e1v\u00e1n v n\u011bkolika kroc\u00edch. Prvn\u00ed krok \u2013<\/b>.<\/p>\n<p>klient <b>se dostal do backendu.<\/b> <b>dostal se do backendu<\/b>, kter\u00fd vym\u011b\u0148oval data s t\u00edmto serverem a kontroloval existenci tokenu pro klienta. Pokud nebyl nalezen \u2013 po\u017eadavek se vr\u00e1til zp\u011bt do kontextu, ze kter\u00e9ho p\u0159i\u0161el, ale ji\u017e s p\u0159esm\u011brov\u00e1n\u00edm, a s p\u0159esm\u011brov\u00e1n\u00edm \u0161el na identity.<\/p>\n<p>Druh\u00fd krok \u2013 po\u017eadavek se dostal <b>na str\u00e1nku autorizace v IdentityServer,<\/b> kde se klient registroval a v datab\u00e1zi IdentityServer se objevil ten vytou\u017een\u00fd token. <\/p>\n<p>T\u0159et\u00ed krok \u2013 <b>klient byl p\u0159esm\u011brov\u00e1n zp\u011bt <\/b>do kontextu, ze kter\u00e9ho p\u0159i\u0161el.<\/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 ur\u010ditou zvl\u00e1\u0161tnost: <b>odpov\u011b\u010f na zp\u011btn\u00fd po\u017eadavek vrac\u00ed po HTTP<\/b>. Jak jsme se s nastaven\u00edm serveru sna\u017eili, jak jsme studovali dokumentaci, ale poka\u017ed\u00e9 jsme dost\u00e1vali p\u016fvodn\u00ed po\u017eadavek klienta s URL, kter\u00e9 p\u0159i\u0161lo po HTTPS, a IdentityServer vracel tent\u00fd\u017e kontext, ale s HTTP. Byli jsme v \u0161oku! A cel\u00fd to jsme p\u0159evedli p\u0159es kontext identity na HAProxy, a v hlavi\u010dk\u00e1ch bylo nutn\u00e9 modifikovat protokol HTTP na HTTPS. <\/p>\n<p>V \u010dem je zlep\u0161en\u00ed a kde jsme u\u0161et\u0159ili?<\/p>\n<blockquote><p>U\u0161et\u0159ili jsme pen\u00edze pou\u017eit\u00edm bezplatn\u00e9ho \u0159e\u0161en\u00ed pro autorizaci skupiny u\u017eivatel\u016f, zdroje, nebo\u0165 jsme neod\u010dlenili IdentityServer4 jako samostatn\u00fd uzel do samostatn\u00e9ho segmentu, ale pou\u017eili jsme ho spole\u010dn\u011b se backendem na tom sam\u00e9m serveru, kde b\u011b\u017e\u00ed backend aplikace.<\/p><\/blockquote>\n<p><\/p>\n<h2>Jak to m\u00e1 fungovat<\/h2>\n<p>\nTak\u017ee, jak jsem sl\u00edbil \u2013 Magic Box. Ji\u017e rozum\u00edme, \u017ee se jist\u011b ub\u00edr\u00e1me sm\u011brem k Linuxu. Poj\u010fme formulovat konkr\u00e9tn\u00ed \u00fakoly, kter\u00e9 vy\u017eadovaly \u0159e\u0161en\u00ed.<\/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>Abychom dod\u00e1vali a spravovali konfiguraci slu\u017eby a aplikace, bylo nutn\u00e9 napsat skv\u011bl\u00e9 recepty. Rolni\u010dka s tu\u017ekou n\u00e1le\u017eit\u011b ukazuje, jak rychle a kvalitn\u011b to bylo provedeno.<\/p>\n<p><b>Zp\u016fsob dod\u00e1n\u00ed. <\/b>Standard je RPM. V\u0161ichni ch\u00e1pou, \u017ee v Linuxu bez n\u011bj to nejde, ale samotn\u00fd projekt po sestaven\u00ed p\u0159edstavoval sadu spustiteln\u00fdch DLL-soubor\u016f. Bylo jich asi 150, projekt je dost t\u011b\u017ek\u00fd. Jedin\u00fdm harmonick\u00fdm \u0159e\u0161en\u00edm je zabalit tuto bin\u00e1rn\u00ed z\u00e1le\u017eitost do RPM a pot\u00e9 z n\u00ed rozbalovat aplikaci.<\/p>\n<p><b>Verzov\u00e1n\u00ed. <\/b>Museli jsme \u010dasto vych\u00e1zet, a proto bylo nutn\u00e9 rozhodnout, jak pojmenov\u00e1vat bal\u00ed\u010dky. To je ot\u00e1zka \u00farovn\u011b integrace s TFS. Build agent byl na Linuxu. Kdy\u017e TFS ode\u0161le \u00fakol zpracovateli - worker - na Build agent, p\u0159ed\u00e1v\u00e1 mu tak\u00e9 sadu prom\u011bnn\u00fdch, kter\u00e9 se dostanou do prost\u0159ed\u00ed procesu zpracovatele. V t\u011bchto prom\u011bnn\u00fdch prost\u0159ed\u00ed se p\u0159ed\u00e1v\u00e1 n\u00e1zev Build, n\u00e1zev verze a dal\u0161\u00ed prom\u011bnn\u00e9. V\u00edce o tom v \u010d\u00e1sti \u201esestaven\u00ed RPM bal\u00ed\u010dku\u201c.<\/p>\n<p><b>Nastaven\u00ed TFS<\/b> se soust\u0159edilo na nastaven\u00ed Pipeline. D\u0159\u00edve jsme na Windows agentech sestavovali v\u0161echny projekty pro Windows, a nyn\u00ed se objevuje Linux agent - Build agent, kter\u00fd je t\u0159eba za\u0159adit do skupiny sestaven\u00ed, obohatit o n\u011bjak\u00e9 artefakty, \u0159\u00edci, jak\u00e9 konkr\u00e9tn\u00ed typy projekt\u016f budou na tomto Build agentovi sestavov\u00e1ny, a n\u011bjak\u00fdm zp\u016fsobem modifikovat Pipeline.<\/p>\n<p><b>IdentityServer. <\/b>ADFS nen\u00ed na\u0161e cesta, podporujeme Open Source.<\/p>\n<p>Pod\u00edvejme se na komponenty.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nSkl\u00e1d\u00e1 se ze \u010dty\u0159 \u010d\u00e1st\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, proto\u017ee pro n\u011bj sestavujeme - logick\u00e9. Tato \u010d\u00e1st prob\u00edhala ve t\u0159ech kroc\u00edch.<\/p>\n<ul>\n<li><b>Nastavit worker-y<\/b> a nikoli jednoho, proto\u017ee se p\u0159edpokl\u00e1dala distribuovan\u00e1 pr\u00e1ce na projektu.\n<\/li>\n<li><b>Nainstalovat .NET Core 1.x<\/b>. Pro\u010d zrovna 1.x, kdy\u017e u\u017e je k dispozici 2.0 ve standardn\u00edm repozit\u00e1\u0159i? Proto\u017ee, kdy\u017e jsme za\u010dali vyv\u00edjet, stabiln\u00ed verz\u00ed byla 1.09, a projekt se rozhodlo ud\u011blat pod n\u00ed.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repozit\u00e1\u0159. <\/b>RPM bal\u00ed\u010dky bylo t\u0159eba n\u011bkde ulo\u017eit. P\u0159edpokl\u00e1dalo se, \u017ee budeme pou\u017e\u00edvat ten sam\u00fd firemn\u00ed RPM repozit\u00e1\u0159, kter\u00fd je dostupn\u00fd v\u0161em Linux host\u016fm. Tak jsme tak\u00e9 u\u010dinili. Na serveru repozit\u00e1\u0159e je nastaven <b>webhook<\/b> , kter\u00fd stahoval po\u017eadovan\u00fd RPM bal\u00ed\u010dek z ur\u010den\u00e9ho m\u00edsta. Verzi bal\u00ed\u010dku hl\u00e1sil Build agent webhooku.<\/p>\n<p><b>GitLab. <\/b>Pozor! GitLab se zde nepou\u017e\u00edv\u00e1 v\u00fdvoj\u00e1\u0159i, ale provozn\u00edm odd\u011blen\u00edm pro kontrolu verz\u00ed aplikace, verz\u00ed bal\u00ed\u010dk\u016f, kontrolu stavu v\u0161ech Linux stroj\u016f a uchov\u00e1v\u00e1 v n\u011bm recepturu - v\u0161echny manifesty Puppet. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2014 \u0159e\u0161\u00ed v\u0161echny sporn\u00e9 momenty a dod\u00e1v\u00e1 p\u0159esn\u011b tu konfiguraci, kterou chceme, z GitLab.<\/p>\n<p>Za\u010d\u00edn\u00e1me se no\u0159it. Jak prob\u00edh\u00e1 dod\u00e1vka DLL do RPM?<\/p>\n<h3>Dod\u00e1vka DLL do RPM<\/h3>\n<p>\nP\u0159edstavme si, \u017ee m\u00e1me rockovou hv\u011bzdu v\u00fdvoje na .NET. Pou\u017e\u00edv\u00e1 Visual Studio a vytv\u00e1\u0159\u00ed vydanou v\u011btev. Pot\u00e9 ji nahr\u00e1v\u00e1 do Gitu, a Git zde - TFS entita, tedy to je repozit\u00e1\u0159 aplikace, se kter\u00fdm v\u00fdvoj\u00e1\u0159 pracuje.<\/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 \/>\nPot\u00e9 TFS vid\u00ed, \u017ee do\u0161el nov\u00fd commit. Jak\u00e1 aplikace? V nastaven\u00ed TFS je zna\u010dka, jak\u00e9 zdroje m\u00e1 ka\u017ed\u00fd Build agent. V tomto p\u0159\u00edpad\u011b vid\u00ed, \u017ee sestavujeme projekt .NET Core a vyb\u00edr\u00e1 Linux Build agent z poolu. <\/p>\n<p>Build agent z\u00edsk\u00e1v\u00e1 zdroje, stahuje pot\u0159ebn\u00e9 <b>z\u00e1vislosti<\/b> z repozit\u00e1\u0159e .NET, npm atd. a po sestaven\u00ed samotn\u00e9 aplikace a n\u00e1sledn\u00e9m balen\u00ed ode\u0161le RPM bal\u00ed\u010dek do RPM repozit\u00e1\u0159e.<\/p>\n<p>Na druh\u00e9 stran\u011b prob\u00edh\u00e1 n\u00e1sleduj\u00edc\u00ed. In\u017een\u00fdr odd\u011blen\u00ed \u00fadr\u017eby se p\u0159\u00edmo zab\u00fdv\u00e1 nasazen\u00edm projektu: m\u011bn\u00ed verze bal\u00ed\u010dk\u016f v\u00a0<b>Hiera<\/b> v repozit\u00e1\u0159i, kde se uchov\u00e1v\u00e1 recept na aplikaci, po \u010dem\u017e Puppet spou\u0161t\u00ed <b>Yum<\/b>, st\u00e1hne nov\u00fd bal\u00ed\u010dek z repozit\u00e1\u0159e a nov\u00e1 verze aplikace je p\u0159ipravena k pou\u017eit\u00ed.<\/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 slovech je to jednoduch\u00e9, ale co se d\u011bje uvnit\u0159 na samotn\u00e9m Build agentu?<\/p>\n<h3>Balen\u00ed DLL RPM<\/h3>\n<p>\nByly z\u00edsk\u00e1ny zdroje projektu a \u00fakol na sestaven\u00ed od TFS. Build agent <b>spou\u0161t\u00ed sestaven\u00ed samotn\u00e9ho projektu ze zdroj\u016f.<\/b>Sestaven\u00fd projekt je dostupn\u00fd v podob\u011b mnoha <b>DLL soubor\u016f<\/b>, kter\u00e9 jsou zabaleny do zip archivu pro sn\u00ed\u017een\u00ed z\u00e1t\u011b\u017ee na souborov\u00fd syst\u00e9m.<\/p>\n<p>ZIP archiv je um\u00edst\u011bn <b>do adres\u00e1\u0159e sestaven\u00ed bal\u00ed\u010dku RPM.<\/b> D\u00e1le Bash skript inicializuje prom\u011bnn\u00e9 prost\u0159ed\u00ed, najde verzi Build, verzi projektu, cestu do adres\u00e1\u0159e sestaven\u00ed a spou\u0161t\u00ed RPM-build. Po dokon\u010den\u00ed sestaven\u00ed je bal\u00ed\u010dek publikov\u00e1n v\u00a0<b>lok\u00e1ln\u00edm repozit\u00e1\u0159i<\/b>, kter\u00fd se nach\u00e1z\u00ed na Build agentu.<\/p>\n<p>D\u00e1le, z Build agenta na server v RPM repozit\u00e1\u0159i <b>je odesl\u00e1n JSON po\u017eadavek<\/b> s uveden\u00edm n\u00e1zvu verze a buildu. Webhook, o kter\u00e9m jsem mluvil d\u0159\u00edve, stahuje tento bal\u00ed\u010dek z lok\u00e1ln\u00edho repozit\u00e1\u0159e na Build agentu a zp\u0159\u00edstup\u0148uje novou verzi k instalaci.<\/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 \/>\nPro\u010d pr\u00e1v\u011b takov\u00fd zp\u016fsob dod\u00e1n\u00ed bal\u00ed\u010dku do repozit\u00e1\u0159e RPM? Pro\u010d nen\u00ed mo\u017en\u00e9 okam\u017eit\u011b odeslat sestaven\u00fd bal\u00ed\u010dek do repozit\u00e1\u0159e? Jde o podm\u00ednku pro zaji\u0161t\u011bn\u00ed bezpe\u010dnosti. Takov\u00fd sc\u00e9n\u00e1\u0159 omezuje mo\u017enost neopr\u00e1vn\u011bn\u00e9ho na\u010d\u00edt\u00e1n\u00ed RPM bal\u00ed\u010dk\u016f ciz\u00edmi osobami na server, kter\u00fd je dostupn\u00fd v\u0161em Linuxov\u00fdm stroj\u016fm.<\/p>\n<h2>Verzov\u00e1n\u00ed DB<\/h2>\n<p>\nNa konsilu s v\u00fdvojem bylo zji\u0161t\u011bno, \u017ee kluk\u016fm je bli\u017e\u0161\u00ed MS SQL, ale ve v\u011bt\u0161in\u011b non-Windows projekt\u016f jsme ji\u017e pln\u011b pou\u017e\u00edvali PostgreSQL. Jak jsme se ji\u017e rozhodli vzd\u00e1t v\u0161eho placen\u00e9ho, za\u010dali jsme pou\u017e\u00edvat PostgreSQL i zde.<\/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 t\u00e9to \u010d\u00e1sti chci popsat, jak jsme prov\u00e1d\u011bli verzov\u00e1n\u00ed datab\u00e1zov\u00e9ho syst\u00e9mu a jak jsme vyb\u00edrali mezi Flyway a Entity Framework Core. Pod\u00edv\u00e1me se na jejich v\u00fdhody a nev\u00fdhody.<\/p>\n<h3>Nev\u00fdhody<\/h3>\n<p>\nFlyway funguje pouze jedn\u00edm sm\u011brem, my\u00a0<b>nem\u016f\u017eeme se vr\u00e1tit zp\u011bt<\/b>\u00a0\u2014 to je v\u00fdznamn\u00e1 nev\u00fdhoda. Srovn\u00e1vat s Entity Framework Core lze z hlediska jin\u00fdch parametr\u016f \u2014 z pohledu pohodl\u00ed v\u00fdvoj\u00e1\u0159e. Jist\u011b si pamatujete, \u017ee jsme to postavili na prvn\u00ed m\u00edsto a hlavn\u00edm krit\u00e9riem bylo nezm\u011bnit nic pro Windows v\u00fdvoj.<\/p>\n<p>Pro Flyway jsme <b>pot\u0159ebovali n\u011bjak\u00fd obal<\/b>, aby kluci nemuseli ps\u00e1t <b>SQL dotazy<\/b>. Je pro n\u011b mnohem p\u0159irozen\u011bj\u0161\u00ed pracovat s objekty OOP. Napsali jsme n\u00e1vody na pr\u00e1ci s objekty datab\u00e1ze, SQL dotaz se vytvo\u0159il a vykonal. Nov\u00e1 verze datab\u00e1ze je hotov\u00e1, pro\u0161la testem \u2014 v\u0161e funguje.<\/p>\n<p>Entity Framework Core m\u00e1 nev\u00fdhodu \u2014 p\u0159i vysok\u00e9m zat\u00ed\u017een\u00ed generuje\u00a0<b>neoptim\u00e1ln\u00ed SQL dotazy<\/b>, a pokles v\u00fdkonu datab\u00e1ze m\u016f\u017ee b\u00fdt zna\u010dn\u00fd. Ale proto\u017ee nem\u00e1me vysoce zat\u00ed\u017een\u00fd servis, nezapo\u010d\u00edt\u00e1v\u00e1me zat\u00ed\u017een\u00ed v \u0159\u00e1du stovek RPS, p\u0159ijali jsme tato rizika a delegovali probl\u00e9m budouc\u00edm n\u00e1m.<\/p>\n<h3>V\u00fdhody<\/h3>\n<p>\nEntity Framework Core <b>funguje z krabice a je pohodln\u00fd pro v\u00fdvoj<\/b>, zat\u00edmco Flyway <b>se snadno integruje do st\u00e1vaj\u00edc\u00edho CI<\/b>. Ale my d\u011bl\u00e1me v\u011bci pohodln\u011b pro v\u00fdvoj\u00e1\u0159e :)<\/p>\n<h3>Procedura nasazen\u00ed<\/h3>\n<p>\nPuppet vid\u00ed, \u017ee do\u0161lo ke zm\u011bn\u011b verze bal\u00ed\u010dk\u016f, mezi nimi\u017e je ten, kter\u00fd odpov\u00edd\u00e1 za migraci. Nejprve instaluje bal\u00ed\u010dek, kter\u00fd obsahuje migra\u010dn\u00ed skripty a funkce spojen\u00e9 s datab\u00e1z\u00ed. Pot\u00e9 se restartuje aplikace, kter\u00e1 pracuje s datab\u00e1z\u00ed. N\u00e1sleduje instalace zb\u00fdvaj\u00edc\u00edch komponent. Po\u0159ad\u00ed instalace bal\u00ed\u010dk\u016f a spu\u0161t\u011bn\u00ed aplikac\u00ed je pops\u00e1no v manifestu Puppet.<\/p>\n<p>Aplikace pou\u017e\u00edvaj\u00ed citliv\u00e9 \u00fadaje, jako jsou tokeny, hesla k datab\u00e1zi; to v\u0161e se z\u00edsk\u00e1v\u00e1 v konfiguraci z Puppet master, kde jsou uchov\u00e1v\u00e1ny v za\u0161ifrovan\u00e9 podob\u011b.<\/p>\n<h2>Probl\u00e9my TFS<\/h2>\n<p>\nPot\u00e9, co jsme se ujistili, \u017ee n\u00e1m v\u0161echno skute\u010dn\u011b funguje, rozhodl jsem se pod\u00edvat, co se d\u011bje se sestavami v TFS obecn\u011b pro odd\u011blen\u00ed Win v\u00fdvoje u dal\u0161\u00edch projekt\u016f \u2014 jak rychle se sestavujeme \/ uvol\u0148ujeme, a odhalil jsem z\u00e1sadn\u00ed probl\u00e9my se rychlost\u00ed.<\/p>\n<p>Jeden z hlavn\u00edch projekt\u016f se sestavuje 12-15 minut \u2014 to je dlouho, takto ne\u017eijeme. Rychl\u00e1 anal\u00fdza uk\u00e1zala hrozn\u00e9 poklesy I\/O, a to na pol\u00edch.<\/p>\n<p>Analyzoval jsem komponenty a identifikoval t\u0159i ohniska. Prvn\u00ed je <b>\u201eKaspersky antivirus\u201c<\/b>, kter\u00fd na v\u0161ech Windows Build-agentech skenuje zdrojov\u00e9 k\u00f3dy. Druh\u00fd \u2013 <b>Windows<\/b> <b>Indexer.<\/b> Nebyl vypnut\u00fd a na Build-agentech se v re\u00e1ln\u00e9m \u010dase indexovalo v\u0161echno v procesu nasazen\u00ed. <\/p>\n<p>T\u0159et\u00ed \u2013 <b>Npm install. <\/b>Uk\u00e1zalo se, \u017ee ve v\u011bt\u0161in\u011b Pipelines jsme pou\u017e\u00edvali pr\u00e1v\u011b tento sc\u00e9n\u00e1\u0159. \u010c\u00edm je \u0161patn\u00fd? Procedura Npm install se spou\u0161t\u00ed p\u0159i vytv\u00e1\u0159en\u00ed stromu z\u00e1vislost\u00ed v\u00a0<b>package-lock.json<\/b>, kde jsou zaznamen\u00e1ny verze bal\u00ed\u010dk\u016f, kter\u00e9 budou pou\u017eity pro sestaven\u00ed projektu. Nev\u00fdhoda spo\u010d\u00edv\u00e1 v tom, \u017ee Npm install poka\u017ed\u00e9 stahuje aktu\u00e1ln\u00ed verze bal\u00ed\u010dk\u016f z internetu, a to zabere zna\u010dn\u00fd \u010das v p\u0159\u00edpad\u011b velk\u00e9ho projektu.<\/p>\n<blockquote><p>V\u00fdvoj\u00e1\u0159i n\u011bkdy experimentuj\u00ed na m\u00edstn\u00edm stroji, aby otestovali fungov\u00e1n\u00ed jednotliv\u00e9 \u010d\u00e1sti nebo cel\u00e9ho projektu. N\u011bkdy se stalo, \u017ee lok\u00e1ln\u011b v\u0161e fungovalo skv\u011ble, ale p\u0159i sestaven\u00ed, nasazen\u00ed \u2013 nic nefungovalo. Za\u010d\u00edn\u00e1me zji\u0161\u0165ovat, kde je probl\u00e9m \u2013 aha, r\u016fzn\u00e9 verze bal\u00ed\u010dk\u016f se z\u00e1vislostmi.<\/p><\/blockquote>\n<p><\/p>\n<h3>\u0158e\u0161en\u00ed<\/h3>\n<p><\/p>\n<ul>\n<li>Zdrojov\u00e9 k\u00f3dy do v\u00fdjimek AV.\n<\/li>\n<li>Vypnut\u00ed indexace.\n<\/li>\n<li>P\u0159echod na\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nV\u00fdhody npm ci spo\u010d\u00edvaj\u00ed v tom, \u017ee\u00a0<b>vytv\u00e1\u0159\u00edme strom z\u00e1vislost\u00ed jednou<\/b>, a z\u00edsk\u00e1me mo\u017enost poskytnout v\u00fdvoj\u00e1\u0159i <b>aktu\u00e1ln\u00ed seznam bal\u00ed\u010dk\u016f<\/b>, se kter\u00fdm m\u016f\u017ee libovoln\u011b experimentovat lok\u00e1ln\u011b. To <b>\u0161et\u0159\u00ed \u010das<\/b> v\u00fdvoj\u00e1\u0159\u016fm, kte\u0159\u00ed p\u00ed\u0161\u00ed k\u00f3d.<\/p>\n<h3>Konfigurace<\/h3>\n<p>\nNyn\u00ed n\u011bco o konfiguraci repozit\u00e1\u0159e. Historicky pou\u017e\u00edv\u00e1me <b>Nexus<\/b> pro spr\u00e1vu repozit\u00e1\u0159\u016f, v\u010detn\u011b <b>Intern\u00ed REPO<\/b>. Do tohoto intern\u00edho repozit\u00e1\u0159e se dod\u00e1vaj\u00ed v\u0161echny komponenty, kter\u00e9 pou\u017e\u00edv\u00e1me pro intern\u00ed \u00fa\u010dely, nap\u0159\u00edklad vlastn\u00ed monitorovac\u00ed syst\u00e9my.<\/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 \/>\nD\u00e1le tak\u00e9 pou\u017e\u00edv\u00e1me <b>NuGet<\/b>, proto\u017ee l\u00e9pe ke\u0161uje ve srovn\u00e1n\u00ed s jin\u00fdmi spr\u00e1vci bal\u00ed\u010dk\u016f.<\/p>\n<h3>V\u00fdsledek<\/h3>\n<p>\nPo optimalizaci Build-agent\u016f se pr\u016fm\u011brn\u00e1 doba sestaven\u00ed zkr\u00e1tila z 12 minut na 7.<\/p>\n<blockquote><p>Pokud se\u010dteme v\u0161echny stroje, kter\u00e9 bychom mohli pou\u017e\u00edt pro Windows, ale p\u0159evedli jsme je na Linux v tomto projektu, u\u0161et\u0159ili jsme p\u0159ibli\u017en\u011b $10 000. A to jsou jen n\u00e1klady na licence, a pokud vezmeme v \u00favahu \u00fadr\u017ebu \u2013 v\u00edc.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pl\u00e1ny<\/h2>\n<p>\nNa n\u00e1sleduj\u00edc\u00ed \u010dtvrtlet\u00ed jsme napl\u00e1novali pr\u00e1ci na optimalizaci dod\u00e1vky k\u00f3du.<\/p>\n<p><b>P\u0159echod na prebuild Docker-obraz<\/b>. TFS je skv\u011bl\u00e1 v\u011bc se spoustou plugin\u016f, kter\u00e9 umo\u017e\u0148uj\u00ed integraci do Pipeline, v\u010detn\u011b sestaven\u00ed na z\u00e1klad\u011b spou\u0161t\u011b\u010de, \u0159ekn\u011bme, Docker-obraz\u016f. Tento spou\u0161t\u011b\u010d chceme vytvo\u0159it na ten spr\u00e1vn\u00fd <b>package-lock.json<\/b>. Pokud dojde k jak\u00e9koli zm\u011bn\u011b v slo\u017een\u00ed komponent\u016f, kter\u00e9 se pou\u017e\u00edvaj\u00ed pro sestaven\u00ed projektu, vytvo\u0159\u00edme nov\u00fd Docker obr\u00e1zek. Ten je n\u00e1sledn\u011b pou\u017eit pro nasazen\u00ed kontejneru se sestavenou aplikac\u00ed. V sou\u010dasnosti to nen\u00ed realizov\u00e1no, ale pl\u00e1nujeme p\u0159ej\u00edt na mikroslu\u017ebovou architekturu v Kubernetes, kter\u00e1 se aktivn\u011b rozv\u00edj\u00ed v na\u0161\u00ed spole\u010dnosti a ji\u017e dlouho obsluhuje produk\u010dn\u00ed \u0159e\u0161en\u00ed.<\/p>\n<h2>Shrnut\u00ed<\/h2>\n<p>\nVyz\u00fdv\u00e1m v\u0161echny, aby zahodili Windows, ale nen\u00ed to proto, \u017ee bych ji neum\u011bl p\u0159ipravit. D\u016fvodem je, \u017ee v\u011bt\u0161ina \u0159e\u0161en\u00ed v Opensource je <b>Linuxov\u00fd stack<\/b>. U\u0161et\u0159\u00edte t\u00edm <b>spoustu zdroj\u016f<\/b>. Podle m\u00e9ho n\u00e1zoru je budoucnost v \u0159e\u0161en\u00edch Open Source na Linuxu s siln\u00fdm komunitn\u00edm z\u00e1zem\u00edm.<\/p>\n<p><i>Profil mluv\u010d\u00edho Alexandra Sin\u010danova <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">na GitHubu<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0\u2014 je konference o integraci proces\u016f v\u00fdvoje, testov\u00e1n\u00ed a provozu pro profesion\u00e1ly od profesion\u00e1l\u016f. Pr\u00e1v\u011b proto je projekt, o kter\u00e9m mluvil Alexandr, realizov\u00e1n a funguje, a b\u011bhem dne prezentace prob\u011bhly dva \u00fasp\u011b\u0161n\u00e9 releasy. Na\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf na RIT++<\/a><\/noindex> 27. a 28. kv\u011btna bude je\u0161t\u011b v\u00edce takov\u00fdch p\u0159\u00edpad\u016f od praktik\u016f. Je\u0161t\u011b se m\u016f\u017eete dostat do posledn\u00edho vlaku a <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">podat p\u0159\u00edsp\u011bvek<\/a><\/noindex> nebo v klidu <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">rezervovat<\/a><\/noindex> vstupenku. Setk\u00e1me se ve Skolkovo!<\/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.4 - 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\/cs\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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 Linuxu, DevOps na vrcholu | ProHoster","description":"Rozv\u00edjeli jsme DevOps, jak jsme mohli. Bylo n\u00e1s 8, a Va\u0161a byl nejlep\u0161\u00ed v Windows. Najednou Va\u0161a ode\u0161el a j\u00e1 m\u011bl \u00fakol zav\u00e9st nov\u00fd projekt, kter\u00fd dod\u00e1v\u00e1 Windows v\u00fdvoj.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}