{"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\/lv\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core uz Linux, DevOps uz zirga","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u0113s att\u012bst\u012bj\u0101m DevOps, cik vien var\u0113j\u0101m. Mums bija 8 cilv\u0113ki, un Vasi bija vislab\u0101kais Windows jom\u0101. P\u0113k\u0161\u0146i Vasi aizg\u0101ja, un man rad\u0101s uzdevums izstr\u0101d\u0101t jaunu projektu, kas nodro\u0161ina Windows izstr\u0101di. Kad izliku uz galda visu Windows izstr\u0101des steku, sapratu, ka situ\u0101cija ir s\u0101p\u012bga\u2026<\/p>\n<p>\u0160eit s\u0101kas st\u0101sts <b>Aleksandra Sin\u010dinova<\/b> uz <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Kad no uz\u0146\u0113muma aizg\u0101ja galvenais speci\u0101lists par Windows, Aleksandrs uzdeva jaut\u0101jumu, ko dar\u012bt t\u0101l\u0101k. P\u0101rsl\u0113gties uz Linux, protams! Aleksandrs past\u0101st\u012bs, k\u0101 vi\u0146am izdev\u0101s izveidot precedentu un p\u0101rv\u0113rst da\u013cu Windows izstr\u0101des uz Linux, izmantojot 100 000 gala lietot\u0101ju projekta piem\u0113ru.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u0101 viegli un neform\u0101li pieg\u0101d\u0101t projektu RPM, izmantojot TFS, Puppet, Linux .NET core? K\u0101 uztur\u0113t projektu datub\u0101zes versiju kontroli, ja izstr\u0101d\u0101t\u0101ji pirmo reizi dzird par Postgres un Flyway, un termi\u0146\u0161 ir p\u0113c div\u0101m dien\u0101m? K\u0101 integr\u0113t ar Docker? K\u0101 motiv\u0113t .NET izstr\u0101d\u0101t\u0101jus atteikties no Windows un sm\u016btijiem par labu Puppet un Linux? K\u0101 risin\u0101t ideolo\u0123iskos konfliktus, ja nav ne sp\u0113ka, ne v\u0113lmes, ne resursu apkalpot Windows produkcij\u0101? Par to, k\u0101 ar\u012b par Web Deploy, test\u0113\u0161anu, CI, TFS izmanto\u0161anas praktik\u0101m eso\u0161ajos projektos, un, protams, par salauzt\u0101m k\u0101j\u0101m un darbojo\u0161iem risin\u0101jumiem, Aleksandra zi\u0146ojuma transkripcij\u0101.<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=\"Atska\u0146ot video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nT\u0101tad, Vasi aizg\u0101ja, uzdevums ir uz mani, izstr\u0101d\u0101t\u0101ji gaida ar dak\u0161\u0101m un nepaciet\u012bbu. Kad es piln\u012bb\u0101 sapratu, ka Vasi nav iesp\u0113jams atg\u016bt - s\u0101ku darbu. S\u0101kum\u0101 nov\u0113rt\u0113ju Win VM procentu m\u016bsu park\u0101. Skaitlis neizskat\u012bj\u0101s labv\u0113l\u012bgs Windows.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u0101 k\u0101 m\u0113s akt\u012bvi att\u012bst\u0101m DevOps, es sapratu, ka nepiecie\u0161ams main\u012bt pieeju jauna lietojuma izstr\u0101d\u0113. Risin\u0101jums bija viens - cik vien iesp\u0113jams, p\u0101rv\u0113rst uz Linux. Google man pal\u012bdz\u0113ja - taj\u0101 laik\u0101 .Net jau bija port\u0113ts uz Linux, un es sapratu, ka tas ir risin\u0101jums!<\/p>\n<h2>K\u0101p\u0113c .NET core kop\u0101 ar Linux?<\/h2>\n<p>\nTam bija vair\u0101ki iemesli. Starp \"maks\u0101t naudu\" un \"nemaks\u0101t\" liel\u0101k\u0101 da\u013ca izv\u0113l\u0113sies otro - k\u0101 ar\u012b es. Licences maksa par MSDB ir ap 1 000 $, bet Windows virtu\u0101lo ma\u0161\u012bnu apkalpo\u0161ana maks\u0101 simtiem dol\u0101ru. Lielai uz\u0146\u0113mumam tas ir lieli izdevumi. T\u0101d\u0113\u013c <b>ietaup\u012bjums\u00a0<\/b>\u2014<b> ir pirm\u0101 iemesla<\/b>. Ne pats svar\u012bg\u0101kais, bet viens no noz\u012bm\u012bg\u0101kajiem.<\/p>\n<p>Windows virtu\u0101l\u0101s ma\u0161\u012bnas pat\u0113r\u0113 vair\u0101k resursu nek\u0101 to Linux br\u0101\u013ci - <b>t\u0101s ir smagas<\/b>. \u0145emot v\u0113r\u0101 liel\u0101 uz\u0146\u0113muma m\u0113rogu, m\u0113s izv\u0113l\u0113j\u0101mies Linux.<\/p>\n<p><b>Sistema vienk\u0101r\u0161i integr\u0113jas eso\u0161aj\u0101 CI<\/b>. M\u0113s sevi uzskat\u0101m par progres\u012bviem DevOps'iem, izmantojot Bamboo, Jenkins un GitLab CI, t\u0101p\u0113c liel\u0101k\u0101 da\u013ca no m\u016bsu risin\u0101jumiem darbojas uz Linux.<\/p>\n<p>P\u0113d\u0113j\u0101 iemesla d\u0113\u013c \u2013 <b>\u0113rt\u0101 apkalpo\u0161ana. <\/b>Mums bija nepiecie\u0161ams samazin\u0101t iek\u013c\u016b\u0161anas slieksni \"apkalpot\u0101jiem\" \u2013 cilv\u0113kiem, kuri saprot tehnisko da\u013cu, nodro\u0161ina nep\u0101rtraukt\u012bbu un apkalpo pakalpojumus ar otro l\u012bniju. Vi\u0146i jau bija paz\u012bstami ar Linux steku, t\u0101p\u0113c vi\u0146iem ir daudz viegl\u0101k saprast jauno produktu, atbalst\u012bt un apkalpot, nek\u0101 t\u0113r\u0113t papildu resursus, lai izprastu l\u012bdz\u012bgu programmat\u016bras funkcionalit\u0101ti Windows platformai.<\/p>\n<h2>Pras\u012bbas<\/h2>\n<p>\nPirmais un galvenais \u2013 <b>jaun\u0101 risin\u0101juma \u0113rta lieto\u0161an\u0101<\/b>. Ne visi no vi\u0146iem bija gatavi p\u0101rmai\u0146\u0101m, \u012bpa\u0161i p\u0113c izrun\u0101t\u0101 v\u0101rda Linux. Izstr\u0101d\u0101t\u0101ji v\u0113las savu iecien\u012bto Visual Studio, TFS ar autom\u0101tiskajiem testi par b\u016bv\u0113m un sm\u016btijiem. K\u0101 notiek pieg\u0101de ra\u017eo\u0161an\u0101 \u2013 vi\u0146iem tas nav svar\u012bgi. T\u0101d\u0113\u013c m\u0113s nol\u0113m\u0101m nemain\u012bt ierasto procesu un atst\u0101t Windows izstr\u0101dei visu nemain\u012bgu. <\/p>\n<p>Jaunais projekts ir j\u0101 <b>integr\u0113 eso\u0161aj\u0101 CI<\/b>. Sliedes jau bija, un visus darbus nepiecie\u0161ams veikt, \u0146emot v\u0113r\u0101 konfigur\u0101cijas vad\u012bbas sist\u0113mas parametrus, pie\u0146emtos pieg\u0101des standartus un uzraudz\u012bbas sist\u0113mas.<\/p>\n<p><b>Vienk\u0101r\u0161\u012bba atbalst\u012bb\u0101 un ekspluat\u0101cij\u0101<\/b>, k\u0101 nosac\u012bjums minim\u0101la iek\u013c\u016b\u0161anas sliek\u0161\u0146a noteik\u0161anai visiem jaunajiem dal\u012bbniekiem no da\u017e\u0101d\u0101m strukt\u016brvien\u012bb\u0101m un apkalpo\u0161anas departamenta.<\/p>\n<p><b>Termi\u0146\u0161 \u2013 vakar<\/b>.<\/p>\n<h2>Windows izstr\u0101des grupa<\/h2>\n<p>\nAr ko tad str\u0101d\u0101ja Windows komanda?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0160obr\u012bd es varu ar p\u0101rliec\u012bbu teikt, ka <b>IdentityServer4<\/b>\u00a0\u2013 t\u0101 ir lieliska bezmaksas alternat\u012bva ADFS ar l\u012bdz\u012bg\u0101m iesp\u0113j\u0101m, vai ka <b>Entity Framework Core<\/b>\u00a0\u2013 izstr\u0101d\u0101t\u0101ja parad\u012bze, kur var nesatraukties par SQL skriptu rakst\u012b\u0161anu, bet aprakst\u012bt vaic\u0101jumus datu b\u0101z\u0113 objektorient\u0113t\u0101 programm\u0113\u0161anas terminolo\u0123ij\u0101. Bet, tad, sarun\u0101 par r\u012bc\u012bbas pl\u0101nu, es uz \u0161o steku skat\u012bjos k\u0101 uz \u0161umeru klin\u0113\u0161anas rakst\u012bbu, atpaz\u012bstot tikai PostgreSQL un Git.<\/p>\n<p>Taj\u0101 laik\u0101 m\u0113s akt\u012bvi izmantoj\u0101m <b>Puppet<\/b> k\u0101 konfigur\u0101cijas vad\u012bbas sist\u0113mu. Liel\u0101kaj\u0101 da\u013c\u0101 m\u016bsu projektu m\u0113s izmantoj\u0101m <b>GitLab CI<\/b>, <b>Elastic<\/b>, balans\u0113j\u0101m \u013coti noslogotus pakalpojumus ar <b>HAProxy,<\/b> uzraudz\u012bj\u0101m visu ar <b>Zabbix<\/b>, saikni <b>Grafana<\/b> un\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, un viss tas darboj\u0101s uz dzel\u017eiem\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> uz\u00a0<b>VMware<\/b>. Visiem zin\u0101ms \u2013 \u017eanra klasika.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSkat\u012bsim un m\u0113\u0123in\u0101sim saprast, kas notika pirms tam, kad m\u0113s uzs\u0101k\u0101m \u0161os iejauk\u0161anos.<\/p>\n<h2>Kas notika<\/h2>\n<p>\nTFS ir diezgan jaud\u012bga sist\u0113ma, kas ne tikai nodro\u0161ina kodu no izstr\u0101d\u0101t\u0101ja l\u012bdz gal\u012bgajai ra\u017eo\u0161anas ma\u0161\u012bnai, bet ar\u012b pied\u0101v\u0101 \u013coti elast\u012bgu integr\u0101ciju ar da\u017e\u0101diem pakalpojumiem, lai nodro\u0161in\u0101tu CI multiplatformu l\u012bmen\u012b.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIepriek\u0161 t\u0101s bija vienk\u0101r\u0161as logu sist\u0113mas. TFS izmantoja vair\u0101kus Build a\u0123entus, uz kuriem tika b\u016bv\u0113ti daudzi projekti. Katr\u0101 a\u0123ent\u0101 bija 3-4 darbinieki, lai paraleliz\u0113tu uzdevumus un optimiz\u0113tu procesu. Turpm\u0101k, saska\u0146\u0101 ar izlai\u0161anas pl\u0101niem, TFS pieg\u0101d\u0101ja svaigu Build uz Windows lietojumservera.<\/p>\n<h2>Uz ko m\u0113s v\u0113l\u0113j\u0101mies non\u0101kt<\/h2>\n<p>\nLai pieg\u0101d\u0101tu un att\u012bst\u012btu, m\u0113s lietojam TFS, bet lietojumprogrammu palai\u017eam uz Linux lietojumservera, un starp tiem ir k\u0101da ma\u0123ija. \u0160is <b>Magic Box<\/b> ir gaid\u0101m\u0101 darba b\u016bt\u012bba. Pirms to s\u012bki apl\u016bkot, es veicu soli mal\u0101 un saku divus v\u0101rdus par lietojumprogrammu.<\/p>\n<h2>Projekts<\/h2>\n<p>\nLietojumprogramma sniedz funkcionalit\u0101ti darboties ar priek\u0161apmaks\u0101t\u0101m kart\u0113m. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Klients<\/h3>\n<p>\nPast\u0101v\u0113ja divi lietot\u0101ju veidi. <b>Pirmais<\/b> piek\u013cuva, autoriz\u0113joties ar SSL SHA-2 sertifik\u0101tu. Tam\u00a0<b>otr\u0101<\/b> bija piek\u013cuve caur lietot\u0101jv\u0101rdu un paroli.<\/p>\n<h3>HAProxy<\/h3>\n<p>\nP\u0113c tam klienta piepras\u012bjums non\u0101ca HAProxy, kas atrisin\u0101ja \u0161\u0101das probl\u0113mas:<\/p>\n<ul>\n<li>pirm\u0101 autoriz\u0101cija;\n<\/li>\n<li>SSL termin\u0113\u0161ana;\n<\/li>\n<li>HTTP piepras\u012bjumu uzlabo\u0161ana;\n<\/li>\n<li>piepras\u012bjumu p\u0101rs\u016bt\u012b\u0161ana.\n<\/li>\n<\/ul>\n<p>\nKlienta sertifik\u0101ta p\u0101rbaude notika caur \u0137\u0113di. M\u0113s <b>authority <\/b>un m\u0113s varam to palaist, jo pa\u0161i izsniedzam sertifik\u0101tus pakalpojuma klientiem.<\/p>\n<p>L\u016bdzu, piev\u0113rsiet uzman\u012bbu tre\u0161ajam punktam, m\u0113s uz to atgriez\u012bsimies v\u0113l\u0101k.<\/p>\n<h3>Backend<\/h3>\n<p>\nAtpaka\u013cgait\u0101 pl\u0101noj\u0101m veidot uz Linux. Aizmugure sadarbojas ar DB, ieg\u016bst nepiecie\u0161amo privil\u0113\u0123iju sarakstu un tad, atkar\u012bb\u0101 no t\u0101, k\u0101das privil\u0113\u0123ijas ir autoriz\u0113ju\u0161am lietot\u0101jam, nodro\u0161ina piek\u013cuvi finan\u0161u dokumentu parakst\u012b\u0161anai un nos\u016bt\u012b\u0161anai izpildei vai k\u0101da zi\u0146ojuma \u0123ener\u0113\u0161anai.<\/p>\n<h2>Ietaup\u012bjums ar HAProxy<\/h2>\n<p>\nPapildus diviem kontekstei, pa kuriem g\u0101ja katrs no klientiem, past\u0101v\u0113ja v\u0113l konteksts identity. <b>IdentityServer4<\/b> kas tie\u0161i \u013cauj autoriz\u0113ties, ir bezmaksas un jaud\u012bgs analogs priek\u0161 <b>ADFS\u00a0<\/b>\u2014<b> Active Directory Federation Services<\/b>.<\/p>\n<p>Piepras\u012bjums uz identity tika apstr\u0101d\u0101ts vair\u0101kos so\u013cos. Pirmais solis \u2013 <b>klients<\/b> <b>non\u0101ca aizmugur\u0113<\/b>, kas apmain\u012bj\u0101s datiem ar \u0161o serveri un p\u0101rbaud\u012bja, vai klientam ir tokens. Ja neatrada - piepras\u012bjums atgriez\u0101s atpaka\u013c uz to kontekstu, no kura tas n\u0101ca, bet jau ar p\u0101radres\u0101ciju, un ar p\u0101radres\u0101ciju dev\u0101s uz identity.<\/p>\n<p>Otrais posms - piepras\u012bjums non\u0101ca <b>uz autoriz\u0101cijas lapu IdentityServer,<\/b> kur klients re\u0123istr\u0113j\u0101s, un datu b\u0101z\u0113 IdentityServer par\u0101d\u012bj\u0101s ilgi gaid\u012btais tokens. <\/p>\n<p>Tre\u0161ais posms - <b>klients tika p\u0101radres\u0113ts atpaka\u013c <\/b>uz kontekstu, no kura vi\u0146\u0161 n\u0101ca.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 ir \u012bpa\u0161\u012bba: <b>atbilde uz atpaka\u013cpiepras\u012bjumu tiek atgriezta pa HTTP<\/b>. Cik vien cent\u0101mies piel\u0101got serveri, cik vien izgl\u012btoj\u0101mies dokument\u0101cij\u0101, m\u0113s katru reizi sa\u0146\u0113m\u0101m s\u0101kotn\u0113jo klienta piepras\u012bjumu ar URL, kas bija sa\u0146emts pa HTTPS, bet IdentityServer atgrieza to pa\u0161u kontekstu, bet pa HTTP. M\u0113s bij\u0101m \u0161ok\u0101! Un p\u0101rdev\u0101m visu \u0161o uz identity caur HAProxy, un headeros n\u0101c\u0101s modific\u0113t protokolu no HTTP uz HTTPS. <\/p>\n<p>Kas tad uzlaboj\u0101s un kur ietaup\u012bj\u0101m?<\/p>\n<blockquote><p>M\u0113s ietaup\u012bj\u0101m naudu, izmantojot bezmaksas risin\u0101jumu grupas lietot\u0101ju autoriz\u0101cijai, resursus, jo neizveda IdentityServer4 k\u0101 atsevi\u0161\u0137u mezglu atsevi\u0161\u0137\u0101 segment\u0101, bet izmantoj\u0101m to kop\u0101 ar backend uz t\u0101 pa\u0161a servera, kur grie\u017eas lietojumprogrammas backend.<\/p><\/blockquote>\n<p><\/p>\n<h2>K\u0101 tam vajadz\u0113tu darboties<\/h2>\n<p>\nT\u0101tad, k\u0101 es sol\u012bju - Magic Box. M\u0113s jau saprotam, ka garant\u0113ti virz\u0101mies Linux virzien\u0101. N\u0101ciet, formul\u0113sim konkr\u0113tas probl\u0113mas, kuras pras\u012bja risin\u0101jumus.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Puppet manifesti. <\/b>Lai pieg\u0101d\u0101tu un p\u0101rvald\u012btu pakalpojuma un lietojumprogrammas konfigur\u0101ciju, bija j\u0101uzraksta for\u0161i receptes. Ru\u013c\u013ci ar z\u012bmuli izteiksm\u012bgi ilustr\u0113, cik \u0101tri un kvalitat\u012bvi tas tika izdar\u012bts.<\/p>\n<p><b>Pieg\u0101des veids. <\/b>Standarts - tas ir RPM. Visi saprot, ka Linux bez t\u0101 nevar, bet pats projekts p\u0113c izstr\u0101des izskat\u012bj\u0101s k\u0101 izpild\u0101mo DLL failu kopums. To bija apm\u0113ram 150, projekts ir diezgan smags. Vien\u012bgais harmonisks risin\u0101jums - iepakot \u0161o bin\u0101ro kaudzi RPM un no t\u0101s izv\u0113rst lietojumprogrammu.<\/p>\n<p><b>Versiju kontrole. <\/b>Mums bija j\u0101izlaida ar \u013coti bie\u017eu regularit\u0101ti, un vajadz\u0113ja izdom\u0101t, k\u0101 veidot pakotnes nosaukumu. Tas ir integr\u0101cijas l\u012bme\u0146a jaut\u0101jums ar TFS. M\u016bsu Build a\u0123ents bija uz Linux. Kad TFS nos\u016bta uzdevumu apstr\u0101d\u0101t\u0101jam \u2013 worker \u2013 uz Build a\u0123entu, tas nodod ar\u012b main\u012bgo grupu, kas non\u0101k apstr\u0101d\u0101t\u0101ja procesa vid\u0113. \u0160ajos vides main\u012bgajos tiek nodots Build nosaukums, versijas nosaukums un citi main\u012bgie. Vair\u0101k par to ir sada\u013c\u0101 \u201cRPM pakotnes izveide\u201d.<\/p>\n<p><b>TFS iestat\u012bjums<\/b> tika samazin\u0101ts l\u012bdz Pipeline konfigur\u0113\u0161anai. Agr\u0101k m\u0113s apkopoj\u0101m visus Windows projektus uz Windows a\u0123entiem, bet tagad par\u0101d\u0101s Linux a\u0123ents \u2013 Build a\u0123ents, kuru nepiecie\u0161ams iek\u013caut b\u016bvniec\u012bbas grup\u0101, bag\u0101tin\u0101t ar kaut k\u0101diem artefaktiem, pateikt, k\u0101da veida projekti tiks apkopoti uz \u0161\u012b Build a\u0123enta, un kaut k\u0101 modifik\u0113t Pipeline.<\/p>\n<p><b>IdentityServer. <\/b>ADFS nav m\u016bsu ce\u013c\u0161, m\u0113s atbalst\u0101m Open Source.<\/p>\n<p>Apskat\u012bsim komponentus.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nTas sast\u0101v no \u010detriem da\u013c\u0101m.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build a\u0123ents. <\/b>Linux, jo m\u0113s to izmantojam \u2013 lo\u0123iski. \u0160\u012b da\u013ca tika izpild\u012bta tr\u012bs posmos.<\/p>\n<ul>\n<li><b>Iestat\u012bt worker-us<\/b> un ne vienu, jo tika pl\u0101nots sadal\u012bt darbu pie projekta.\n<\/li>\n<li><b>Uzst\u0101d\u012bt .NET Core 1.x<\/b>. K\u0101p\u0113c tie\u0161i 1.x, kad jau ir pieejams 2.0 standartaj\u0101 repozit\u0101r\u0101? Jo, kad m\u0113s s\u0101k\u0101m izstr\u0101di, stabil\u0101 versija bija 1.09, un projekts tika nolemts veidot uz t\u0101s.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repozitorijs. <\/b>RPM paketes bija j\u0101uzglab\u0101. Tika pl\u0101nots, ka m\u0113s izmantosim to pa\u0161u korporat\u012bvo RPM repozitoriju, kas ir pieejams vis\u0101m Linux viesm\u012bl\u0113m. T\u0101 ar\u012b izdar\u012bj\u0101m. Server\u012b repozitorij\u0101 ir iestat\u012bts <b>webhook<\/b> kur\u0161 lejupiel\u0101d\u0113ja nepiecie\u0161amo RPM pakotni no nor\u0101d\u012bt\u0101s vietas. Pakotnes versiju webhook\u2019\u0101 pazi\u0146oja Build a\u0123ents.<\/p>\n<p><b>GitLab. <\/b>Uzman\u012bbu! GitLab \u0161eit izmanto ne izstr\u0101d\u0101t\u0101ji, bet ekspluat\u0101cijas da\u013ca versiju kontroli aplik\u0101cij\u0101m, pakot\u0146u versij\u0101m, visu Linux ma\u0161\u012bnu st\u0101vok\u013ca uzraudz\u012bbai, un taj\u0101 tiek saglab\u0101ts recepte \u2013 visi Puppet manifesti. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2013 k\u0101rto visus str\u012bd\u012bgos jaut\u0101jumus un pieg\u0101d\u0101 tie\u0161i to konfigur\u0101ciju, k\u0101du m\u0113s v\u0113lamies, no GitLab.<\/p>\n<p>S\u0101ksim nirt dzi\u013c\u0101k. K\u0101 notiek DLL pieg\u0101de RPM?<\/p>\n<h3>DLL pieg\u0101de RPM<\/h3>\n<p>\nPie\u0146emsim, ka mums ir rokeris .NET izstr\u0101d\u0113. Vi\u0146\u0161 izmanto Visual Studio un izveido izlai\u0161anas atzarojumu. P\u0113c tam vi\u0146\u0161 to aug\u0161upiel\u0101d\u0113 Git, un Git \u0161eit ir TFS vien\u012bba, tas ir, tas ir aplik\u0101ciju repozitorijs, ar kuru str\u0101d\u0101 izstr\u0101d\u0101t\u0101js.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u0113c tam TFS redz, ka ir ieradies jauns komits. K\u0101da lietotne? TFS iestat\u012bjumos ir atz\u012bme, k\u0101diem resursiem pieder konkr\u0113tais Build a\u0123ents. \u0160aj\u0101 gad\u012bjum\u0101 tas redz, ka m\u0113s veidojam .NET Core projektu un izv\u0113las Linux Build a\u0123entu no baseina. <\/p>\n<p>Build a\u0123ents sa\u0146em avotus, lejupiel\u0101d\u0113 nepiecie\u0161am\u0101s <b>atkar\u012bbas<\/b> no .NET repozitorija, npm u.t.t. un p\u0113c lietotnes apkopes un iesai\u0146o\u0161anas nos\u016bta RPM paketi RPM repozitorij\u0101.<\/p>\n<p>No otras puses notiek sekojo\u0161ais. In\u017eenieris oper\u0101ciju noda\u013c\u0101 tie\u0161i nodarbojas ar projekta izlai\u0161anu: maina pakot\u0146u versijas\u00a0<b>Hiera<\/b> repozitorij\u0101, kur glab\u0101jas lietotnes recepte, p\u0113c tam Puppet aktiviz\u0113 <b>Yum<\/b>, iz\u0146em jauno paketi no repozitorija, un jaun\u0101 versija lietotnes ir gatava lieto\u0161anai.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0101rdiem sakot, viss ir vienk\u0101r\u0161i, bet kas notiek iek\u0161\u0113ji pa\u0161\u0101 Build a\u0123ent\u0101?<\/p>\n<h3>DLL RPM iepako\u0161ana<\/h3>\n<p>\nIr sa\u0146emti projekta avoti un uzdevums par apkopes no TFS. Build a\u0123ents <b>uzs\u0101k projekta apkoci no avotiem.<\/b>Sak\u0146u projekts ir pieejams k\u0101 daudzus <b>DLL failus<\/b>, kas ir sapakoti zip arh\u012bv\u0101, lai samazin\u0101tu slodzi uz failu sist\u0113mu.<\/p>\n<p>ZIP arh\u012bvs tiek izmests <b>uz RPM pakotnes apkopes direktoriju.<\/b> T\u0101l\u0101k Bash skripts inicializ\u0113 vides main\u012bgos, nosaka Build versiju, projekta versiju, ce\u013cu uz apkopes direktoriju un uzs\u0101k RPM-build. P\u0113c apkopes pakete tiek public\u0113ta\u00a0<b>viet\u0113j\u0101 repozitorij\u0101<\/b>, kas atrodas Build a\u0123ent\u0101.<\/p>\n<p>T\u0101l\u0101k, no Build a\u0123enta server\u012b RPM repozitorijam <b>tiek nos\u016bt\u012bts JSON piepras\u012bjums<\/b> ar nor\u0101di uz versijas nosaukumu un build. Webhook, par kuru es iepriek\u0161 run\u0101ju, lejupiel\u0101d\u0113 \u0161o paketi no viet\u0113j\u0101 repozitorija Build a\u0123ent\u0101 un padara jauno apkoci pieejamu instal\u0113\u0161anai.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u0101p\u0113c tie\u0161i \u0161\u0101da pakotnes pieg\u0101des sh\u0113ma uz RPM repozitoriju? K\u0101p\u0113c nevar uzreiz nos\u016bt\u012bt apkopoto paketi uz repozitoriju? Tas ir dro\u0161\u012bbas nodro\u0161in\u0101\u0161anas nosac\u012bjums. \u0160\u0101ds scen\u0101rijs ierobe\u017eo iesp\u0113ju nesankcion\u0113t\u0101 veid\u0101 aug\u0161upiel\u0101d\u0113t RPM paketes no tre\u0161\u0101m person\u0101m server\u012b, kas ir pieejams vis\u0101m Linux ma\u0161\u012bn\u0101m.<\/p>\n<h2>Datu b\u0101zes versiju p\u0101rvald\u012bba<\/h2>\n<p>\nKons\u012blij\u0101 ar izstr\u0101di noskaidroj\u0101m, ka pui\u0161iem lab\u0101k pat\u012bk MS SQL, bet liel\u0101kaj\u0101 da\u013c\u0101 non-Windows projektu m\u0113s jau pla\u0161i izmantoj\u0101m PostgreSQL. T\u0101 k\u0101 m\u0113s jau nol\u0113m\u0101m atteikties no vis\u0101m maksas opcij\u0101m, t\u0101p\u0113c s\u0101ka izmantot PostgreSQL ar\u012b \u0161eit.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0160aj\u0101 da\u013c\u0101 v\u0113los past\u0101st\u012bt, k\u0101 m\u0113s veic\u0101m datub\u0101zu versiju kontroles un k\u0101 izv\u0113l\u0113j\u0101mies starp Flyway un Entity Framework Core. Apskat\u012bsim to priek\u0161roc\u012bbas un tr\u016bkumus.<\/p>\n<h3>M\u012bnusi<\/h3>\n<p>\nFlyway virz\u0101s tikai vien\u0101 virzien\u0101, m\u0113s\u00a0<b>nevaram atgriezties atpaka\u013c<\/b>\u00a0\u2014 tas ir iev\u0113rojams tr\u016bkums. Sal\u012bdzin\u0101t ar Entity Framework Core var citiem parametriem \u2014 no izstr\u0101d\u0101t\u0101ja \u0113rt\u012bbas viedok\u013ca. J\u016bs ta\u010du atceraties, ka m\u0113s to nolik\u0101m par priorit\u0101ti, un galvenais krit\u0113rijs bija nekas nemain\u012bt Windows izstr\u0101dei.<\/p>\n<p>Flyway mums <b>bija nepiecie\u0161ama k\u0101da apvalka<\/b>, lai kolegas neuzrakst\u012btu <b>SQL vaic\u0101jumos<\/b>. Vi\u0146iem ir daudz \u0113rt\u0101k str\u0101d\u0101t OOP terminolo\u0123ij\u0101. Uzrakst\u012bj\u0101m instrukcijas darbam ar datub\u0101zes objektiem, tika sagatavots SQL vaic\u0101jums un tas tika izpild\u012bts. Jaun\u0101 datub\u0101ze ir gatava, viss darbojas.<\/p>\n<p>Entity Framework Core ir tr\u016bkums \u2014 pie liel\u0101m slodz\u0113m tas\u00a0<b>veido neoptim\u0101lus SQL vaic\u0101jumus<\/b>, un datub\u0101zes slodze var b\u016bt iev\u0113rojama. Tom\u0113r, \u0146emot v\u0113r\u0101, ka mums nav augstas slodzes pakalpojuma, m\u0113s neizsakam slodzi simtos RPS, m\u0113s pie\u0146\u0113m\u0101m \u0161os riskus un dele\u0123\u0113j\u0101m probl\u0113mu n\u0101kotnei.<\/p>\n<h3>Priek\u0161roc\u012bbas<\/h3>\n<p>\nEntity Framework Core <b>str\u0101d\u0101 no kastes un ir \u0113rts izstr\u0101dei<\/b>, bet Flyway <b>viegl\u0101k integr\u0113jas eso\u0161aj\u0101 CI<\/b>. Bet m\u0113s ta\u010du dar\u0101m to \u0113rtu izstr\u0101d\u0101t\u0101jiem :)<\/p>\n<h3>Instal\u0101cijas proced\u016bra<\/h3>\n<p>\nPuppet redz, ka tiek sa\u0146emta pakot\u0146u versijas mai\u0146a, starp kur\u0101m ir ar\u012b t\u0101, kas atbild par migr\u0101ciju. S\u0101kum\u0101 tiek instal\u0113ta pakotne, kur\u0101 ir migr\u0101cijas skripti un funkcionalit\u0101te, kas saist\u012bta ar datub\u0101zi. P\u0113c tam restart\u0113jas lietojumprogramma, kas str\u0101d\u0101 ar datub\u0101zi. Tad seko p\u0101r\u0113jo komponentu instal\u0101cija. Pakot\u0146u un lietojumprogrammu palai\u0161anas sec\u012bba ir aprakst\u012bta Puppet manifest\u0101.<\/p>\n<p>Lietojumprogrammas izmanto sensit\u012bvus datus, piem\u0113ram, tokenus, parol\u0113m uz datub\u0101z\u0113m, tas viss tiek ieg\u016bts no konfigur\u0101cijas ar Puppet master, kur tie tiek glab\u0101ti \u0161ifr\u0113t\u0101 veid\u0101.<\/p>\n<h2>TFS probl\u0113mas<\/h2>\n<p>\nP\u0113c tam, kad m\u0113s nol\u0113m\u0101m un saprat\u0101m, ka mums tie\u0161\u0101m viss darbojas, es nol\u0113mu apskat\u012bt, kas notiek ar brigadieriem TFS kopum\u0101 Windows izstr\u0101des departamentam p\u0101r\u0113jiem projektiem \u2014 vai m\u0113s viendien\u0101 \u0101tri sapulc\u0113jamies\/r\u012bkojamies, un atkl\u0101ju b\u016btiskas probl\u0113mas ar \u0101trumu.<\/p>\n<p>Viens no galvenajiem projektiem tiek kompili\u0113ts 12-15 min\u016btes \u2014 tas ir ilgi, t\u0101 nedr\u012bkst b\u016bt. \u0100tra anal\u012bze par\u0101d\u012bja milz\u012bgu samazin\u0101jumu I\/O, un tas bija uz mas\u012bviem.<\/p>\n<p>P\u0113c komponentu anal\u012bzes es izdal\u012bju tr\u012bs fokusus. Pirmais \u2014 <b>\u00abKaspersky antivirus\u00bb<\/b>, kas sken\u0113 avotus visos Windows Build a\u0123entos. Otrais \u2013 <b>Windows<\/b> <b>Indekseris.<\/b> Tas netika atsp\u0113jots, un Build a\u0123entos re\u0101llaik\u0101 tika indeks\u0113ts viss izpildes proces\u0101. <\/p>\n<p>Tre\u0161ais \u2013 <b>Npm install. <\/b>Izr\u0101d\u012bj\u0101s, ka liel\u0101kaj\u0101 da\u013c\u0101 Pipelines m\u0113s izmantoj\u0101m tie\u0161i \u0161o scen\u0101riju. Kas taj\u0101 nav labi? Proceso Npm install palai\u017e, veidojot atkar\u012bbu koku\u00a0<b>package-lock.json<\/b>, kur tiek fiks\u0113tas pakot\u0146u versijas, kas tiks izmantotas projekta mont\u0101\u017e\u0101. M\u012bnuss ir tas, ka Npm install katru reizi pievelk aktu\u0101l\u0101s pakot\u0146u versijas no interneta, un tas prasa laiku, ja projekts ir liels.<\/p>\n<blockquote><p>Izstr\u0101d\u0101t\u0101ji reiz\u0113m eksperiment\u0113 uz lok\u0101l\u0101s ma\u0161\u012bnas, lai p\u0101rbaud\u012btu atsevi\u0161\u0137as da\u013cas vai projekta funkcionalit\u0101ti kopum\u0101. Reiz\u0113m bija t\u0101, ka lok\u0101li viss ir lieliski, bet mont\u0113jot, izpildot \u2013 nekas nedarboj\u0101s. S\u0101kt p\u0113t\u012bt probl\u0113mu \u2013 aha, at\u0161\u0137ir\u012bgas pakot\u0146u versijas ar atkar\u012bb\u0101m.<\/p><\/blockquote>\n<p><\/p>\n<h3>Risin\u0101jums<\/h3>\n<p><\/p>\n<ul>\n<li>Avoti iz\u0146\u0113mumi AV.\n<\/li>\n<li>Indeks\u0113\u0161anas atsp\u0113jo\u0161ana.\n<\/li>\n<li>P\u0101reja uz\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nNpm ci priek\u0161roc\u012bba ir t\u0101, ka m\u0113s\u00a0<b>veidojam atkar\u012bbu koku vienreiz<\/b>, un ieg\u016bstam iesp\u0113ju sniegt izstr\u0101d\u0101t\u0101jam <b>aktu\u0101lo pakot\u0146u sarakstu<\/b>, ar kuru vi\u0146\u0161 var eksperiment\u0113t lok\u0101li cik ilgi vien v\u0113las. Tas <b>ietaupa laiku<\/b> izstr\u0101d\u0101t\u0101jiem, kuri raksta kodu.<\/p>\n<h3>Konfigur\u0101cija<\/h3>\n<p>\nTagad nedaudz par repozitorija konfigur\u0101ciju. V\u0113sturiski m\u0113s izmantojam <b>Nexus<\/b> repozitoriju p\u0101rvald\u012bbai, tostarp <b>Iek\u0161\u0113jais REPO<\/b>. \u0160aj\u0101 iek\u0161\u0113j\u0101 repozitorij\u0101 tiek pieg\u0101d\u0101ti visi komponenti, kurus izmantojam iek\u0161\u0113j\u0101m vajadz\u012bb\u0101m, piem\u0113ram, pa\u0161u monitoringiem.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core uz Linux, DevOps uz zirga\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nM\u0113s ar\u012b izmantojam <b>NuGet<\/b>, jo tas lab\u0101k ke\u0161\u0113 savas at\u0161\u0137ir\u012bbas sal\u012bdzin\u0101jum\u0101 ar citiem pakot\u0146u p\u0101rvaldniekiem.<\/p>\n<h3>Rezult\u0101ts<\/h3>\n<p>\nP\u0113c tam, kad m\u0113s optimiz\u0113j\u0101m Build a\u0123entus, vid\u0113jais mont\u0101\u017eas laiks tika samazin\u0101ts no 12 min\u016bt\u0113m l\u012bdz 7.<\/p>\n<blockquote><p>Ja saskait\u0101m visas ma\u0161\u012bnas, kuras m\u0113s var\u0113tu izmantot Windows, bet p\u0101rg\u0101j\u0101m uz Linux \u0161aj\u0101 projekt\u0101, m\u0113s ietaup\u012bj\u0101m apm\u0113ram $10 000. Un tas ir tikai par licenc\u0113m, bet ja \u0146emam v\u0113r\u0101 uztur\u0113\u0161anas izmaksas \u2013 vair\u0101k.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pl\u0101ni<\/h2>\n<p>\nN\u0101kamajam ceturksnim esam pl\u0101noju\u0161i darbu pie koda pieg\u0101des optimiz\u0101cijas.<\/p>\n<p><b>P\u0101reja uz iepriek\u0161 izstr\u0101d\u0101tu Docker att\u0113lu<\/b>. TFS ir lieliska lieta ar daudziem spraud\u0146iem, kas \u013cauj integr\u0113t to izpild\u0113, tostarp mont\u0101\u017eu p\u0113c trigeru, piem\u0113ram, Docker att\u0113la. \u0160o trigeri m\u0113s v\u0113lamies izveidot tie\u0161i uz to pa\u0161u <b>package-lock.json<\/b>. Ja, ja k\u0101d\u0101 veid\u0101 tiek main\u012bts komponentu sast\u0101vs, kas tiek izmantots projekta mont\u0101\u017eai, mums tiek izveidots jauns Docker att\u0113ls. N\u0101kotn\u0113 tas tiks izmantots, lai izv\u0113rstu tvertni ar izveidoto lietojumprogrammu. \u0160obr\u012bd t\u0101 nav, bet pl\u0101nojam p\u0101riet uz mikroservisu arhitekt\u016bru Kubernetes, kas akt\u012bvi att\u012bst\u0101s m\u016bsu uz\u0146\u0113mum\u0101 un jau sen apkalpo ra\u017eo\u0161anas risin\u0101jumus.<\/p>\n<h2>CV<\/h2>\n<p>\nEs aicinu visus izmest Windows, bet ne t\u0101p\u0113c, ka es to neprotu gatavot. Iemesls ir t\u0101ds, ka liel\u0101k\u0101 da\u013ca Opensource risin\u0101jumu ir <b>Linux steks<\/b>. J\u016bs labi <b>ietaup\u012bsiet resursus<\/b>. Manupr\u0101t, n\u0101kotne pieder Open Source risin\u0101jumiem uz Linux ar sp\u0113c\u012bgu kopienu.<\/p>\n<p><i>Run\u0101t\u0101ja profils Aleksandra Sin\u010dinova <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">GitHub<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0ir konference par izstr\u0101des, test\u0113\u0161anas un ekspluat\u0101cijas procesu integr\u0101ciju profesion\u0101\u013ciem no profesion\u0101\u013ciem. Tie\u0161i t\u0101p\u0113c projekts, par kuru st\u0101st\u012bja Aleksandrs, ir realiz\u0113ts un darbojas, un dien\u0101, kad notika uzst\u0101\u0161an\u0101s, tika veikti divi veiksm\u012bgi laidieni. Uz\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf uz RIT++<\/a><\/noindex> 27. un 28. maij\u0101 b\u016bs v\u0113l vair\u0101k l\u012bdz\u012bgu gad\u012bjumu no prakti\u0137iem. Joproj\u0101m ir iesp\u0113ja p\u0113d\u0113j\u0101 mirkl\u012b <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">iesniegt zi\u0146ojumu<\/a><\/noindex> vai nesteidzoties <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">rezerv\u0113t<\/a><\/noindex> bi\u013ceti. Tiksimies Skolkovo!<\/p><\/blockquote>\n<p>Avots: <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.5 - 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\/lv\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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 uz Linux, DevOps uz vara | ProHoster","description":"M\u0113s att\u012bst\u012bj\u0101m DevOps, cik vien var\u0113j\u0101m. Mums bija 8 cilv\u0113ki, un Vasi bija vislab\u0101kais Windows jom\u0101. P\u0113k\u0161\u0146i Vasi aizg\u0101ja, un man rad\u0101s uzdevums ieviest jaunu projektu, kas nodro\u0161ina Windows izstr\u0101di.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}