{"id":32217,"date":"2019-10-31T21:45:43","date_gmt":"2019-10-31T18:45:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/net-core-na-linux-devops-na-kone\/"},"modified":"2019-10-31T21:45:43","modified_gmt":"2019-10-31T18:45:43","slug":"net-core-na-linux-devops-na-kone","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core Linuxil, DevOps kulmineerub","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Me arendasime DevOps nii h\u00e4sti, kui suudame. Meid oli 8 inimest ja Vassil oli Windowsi alal k\u00f5ige rohkem kogemusi. \u00c4kki lahkus Vassil ja mul tuli \u00fclesanne k\u00e4ivitada uus projekt, mis pakub Windowsi arendust. Kui ma laotasin lauale kogu Windowsi arenduse tehnoloogiapaki, siis sain aru, et olukord on valus\u2026<\/p>\n<p>Nii algab lugu <b>Aleksandr Sin\u010dinov<\/b> j\u00e4rgnevaga <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Kui ettev\u00f5ttest lahkus peamine Windowsi spetsialist, k\u00fcsis Aleksandr endalt, mida n\u00fc\u00fcd teha. Loomulikult tuli minna Linuxile! Aleksandr r\u00e4\u00e4gib, kuidas tal \u00f5nnestus luua eelk\u00e4ija ja viia osa Windowsi arendusest Linuxile, kasutades 100 000 l\u00f5ppkasutajaga elluviidud projekti n\u00e4idet.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas on lihtne ja muretu projekti RPM-i toimetamine, kasutades TFS-i, Puppetit, Linux .NET core'i? Kuidas hallata projekti andmebaasi versioonimist, kui arendajad kuulevad esmakordselt Postgresi ja Flyway s\u00f5nu, ja t\u00e4htaeg on \u00fclehomme? Kuidas integreerida Dockeriga? Kuidas motiveerida .NET arendajaid loobuma Windowsist ja smuutidest Puppetile ja Linuxile \u00fcle minnes? Kuidas lahendada ideoloogilisi konfliktide, kui Windowsi teenindamine tootmises pole enam j\u00f5ud, tahtmine ega ressursid? Sellest ja veel Web Deploy'ist, testimisest, CI-st, TFS-i kasutamise praktikatest olemasolevates projektides ning muidugi purunenud karkudest ja t\u00f6\u00f6tavatest lahendustest r\u00e4\u00e4kis Alexander oma ettekandes.<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=\"Vaata videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nNii et Vasja lahkus, \u00fclesanne on minu, arendajad ootavad talgute ja kannatamatusega. Kui ma l\u00f5puks m\u00f5istsin, et Vasjat ei saa tagasi, asusin t\u00f6\u00f6le. Esiteks hindasin Windows VM-i protsent meie pargis. Arvud ei olnud Windowsi kasuks.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuna me arendame aktiivselt DevOps-i, sain aru, et pean midagi muutma uue rakenduse v\u00e4lja toomise l\u00e4henemises. Lahendus oli \u00fcks - v\u00f5imaluse korral viia k\u00f5ik Linuxile \u00fcle. Google aitas mind - tol hetkel oli .Net juba Linuxile portitud ja m\u00f5istsin, et see on lahendus!<\/p>\n<h2>Miks .NET core koos Linuxiga?<\/h2>\n<p>\nSellel oli mitu p\u00f5hjust. Enamiku jaoks, kes peab valima raha maksmise ja mitte maksmise vahel, valib enamus teise \u2014 nagu ka mina. MSDB litsents maksab umbes 1000 \u20ac, Windowsi virtuaalmasinate hooldus ulatub sadadesse eurodesse. Suure ettev\u00f5tte jaoks on need suured kulud. Seet\u00f5ttu <b>s\u00e4\u00e4st\u00a0<\/b>\u2014<b> esimene p\u00f5hjus<\/b>. See ei ole k\u00f5ige olulisem, aga \u00fcks t\u00e4htsatest.<\/p>\n<p>Windowsi virtuaalmasinad tarbivad rohkem ressursse kui nende Linuxi vennad \u2014 <b>need on rasked<\/b>. Arvestades suure ettev\u00f5tte mastaapi, valisime Linuxi.<\/p>\n<p><b>S\u00fcsteem integreerub lihtsalt olemasolevasse CI<\/b>. Peame end progressiivseteks DevOps'iks, kasutame Bamboo, Jenkins ja GitLab CI, seet\u00f5ttu on enamik meie t\u00f6\u00f6dest Linuxis.<\/p>\n<p>Viimane p\u00f5hjus on <b>mugav j\u00e4lgimine. <\/b>Meil oli vaja v\u00e4hendada \u201ej\u00e4lgijate\u201d sisenemisbarj\u00e4\u00e4ri \u2014 poistele, kes m\u00f5istavad tehnilist osa, tagavad t\u00f6\u00f6kindluse ja hooldavad teenuseid teise taseme kaudu. Nad olid juba tuttavad Linuxi tehnoloogiaga, seega on neil palju lihtsam uue toote m\u00f5istmine, toetamine ja hooldamine kui investeerida t\u00e4iendavaid ressursse Windowsi platvormi sarnase funktsionaalsuse m\u00f5istmiseks.<\/p>\n<h2>N\u00f5uded<\/h2>\n<p>\nEsiteks ja k\u00f5ige t\u00e4htsam \u2014 <b>uue lahenduse mugavus arendajatele<\/b>. Mitte k\u00f5ik neist ei olnud muutusteks valmis, eriti p\u00e4rast s\u00f5na Linux esitamist. Arendajad soovivad oma lemmik Visual Studio't, TFS-i koos testide automaatika ja smuutidega. Kuidas toimub tootmise toimetamine \u2014 see ei huvita neid. Seet\u00f5ttu otsustasime j\u00e4tta harjumusp\u00e4rase protsessi muutmata ja hoida Windowsi arenduses k\u00f5ik endisena. <\/p>\n<p>Uus projekt tuleb <b>integreerida olemasolevasse CI<\/b>. Raudteed olid juba olemas ja kogu t\u00f6\u00f6 pidi toimuma arvestusega s\u00fcsteemihalduse parameetrite, vastuv\u00f5etud kohaletoimetamise standardite ja j\u00e4lgimiss\u00fcsteemide j\u00e4rgi.<\/p>\n<p><b>Lihtsus hoolduses ja kasutuses<\/b>, nagu tingimus, et k\u00f5ik uued osalejad erinevate osakondade ja tugiosakonna poolt saaksid minimaalselt sisse elada.<\/p>\n<p><b>T\u00e4htaeg \u2014 eile<\/b>.<\/p>\n<h2>Windowsi arendusmeeskond<\/h2>\n<p>\nMillega t\u00f6\u00f6tas Windowsi meeskond siis?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPraegu v\u00f5in kindlalt \u00f6elda, et <b>IdentityServer4<\/b>\u00a0\u2014 see on suurep\u00e4rane tasuta ADFS alternatiiv sarnaste v\u00f5imalustega, v\u00f5i et <b>Entity Framework Core<\/b>\u00a0\u2014 arendaja paradiis, kus ei pea muretsema SQL skriptide kirjutamise p\u00e4rast, vaid saab kirjeldada andmebaasi p\u00e4ringuid OOP m\u00f5istetega. Kuid siis, tegevuskava arutelus, vaatasin sellele stackile kui \u0161umeeria kliendikirja, tunnustades vaid PostgreSQL ja Git.<\/p>\n<p>Sel ajal kasutasime aktiivselt <b>Puppet<\/b> konfiguratsioonihalduse s\u00fcsteemina. Enamikus meie projektides kasutasime <b>GitLab CI<\/b>, <b>Elastic<\/b>, koormatud teenuseid tasakaalustades <b>HAProxy,<\/b> j\u00e4lgisime k\u00f5ike <b>Zabbix<\/b>, komplekti <b>Grafana<\/b> ja\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, ja k\u00f5ik see t\u00f6\u00f6tas raua peal\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> j\u00e4rgnevaga\u00a0<b>VMware<\/b>. Ikka tuntud \u2014 \u017eanri klassika.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVaatame ja p\u00fc\u00fcame m\u00f5ista, mis toimus enne, kui me k\u00f5ik need sekkumised ette v\u00f5tsime.<\/p>\n<h2>Mis oli<\/h2>\n<p>\nTFS on \u00fcsna v\u00f5imas s\u00fcsteem, mis mitte ainult ei edasta koodi arendajalt l\u00f5ppkasutaja masinasse, vaid omab ka komplekti v\u00e4ga paindlikuks integreerimiseks erinevate teenustega \u2013 CI tagamiseks ristplatvormi tasandil.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u0435 \u0444\u043e\u0440\u0442\u043e\u0447\u043a\u0438. TFS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Build-\u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0412\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0430\u0433\u0435\u043d\u0442\u0435 \u043f\u043e\u00a03-4 worker-a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u00a0\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0414\u0430\u043b\u044c\u0448\u0435, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u043c \u043f\u043b\u0430\u043d\u0430\u043c, TFS \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0441\u0432\u0435\u0436\u0435\u0438\u0441\u043f\u0435\u0447\u0435\u043d\u043d\u044b\u0439 Build \u043d\u0430\u00a0Windows-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u041a\u00a0\u0447\u0435\u043c\u0443 \u043c\u044b\u00a0\u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u0440\u0438\u0439\u0442\u0438<\/h2>\n<p>\n\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c TFS, \u0430\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0Linux Application server, \u0438\u00a0\u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043c\u0430\u0433\u0438\u044f. \u042d\u0442\u043e\u0442 <b>Magic Box<\/b> \u0438\u00a0\u0435\u0441\u0442\u044c \u0441\u043e\u043b\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u00a0\u0447\u0430\u0441\u0442\u044f\u043c, \u0441\u0434\u0435\u043b\u0430\u044e \u0448\u0430\u0433 \u0432\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438\u00a0\u0441\u043a\u0430\u0436\u0443 \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430 \u043e\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<h2>Projekt<\/h2>\n<p>\n\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u0440\u0442\u0430\u043c\u0438. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Kliendi<\/h3>\n<p>\n\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <b>Esimene<\/b> \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u044f\u0441\u044c \u043f\u043e\u00a0\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0443 SSL SHA-2. \u0423\u00a0<b>teine<\/b> \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u00a0\u043b\u043e\u0433\u0438\u043d\u0443 \u0438\u00a0\u043f\u0430\u0440\u043e\u043b\u044e.<\/p>\n<h3>HAProxy<\/h3>\n<p>\n\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043f\u0430\u0434\u0430\u043b \u0432\u00a0HAProxy, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<ul>\n<li>\u043f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f;\n<\/li>\n<li>\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SSL;\n<\/li>\n<li>\u0442\u044e\u043d\u0438\u043d\u0433 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432;\n<\/li>\n<li>\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n<\/li>\n<\/ul>\n<p>\n\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0448\u043b\u0430 \u043f\u043e\u00a0\u0446\u0435\u043f\u043e\u0447\u043a\u0435. \u041c\u044b\u00a0\u2014 <b>authority <\/b>\u0438\u00a0\u043c\u043e\u0436\u0435\u043c \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0430\u043c\u0438 \u0432\u044b\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>P\u00f6\u00f6rake t\u00e4helepanu kolmandale punktile, toome selle teemani tagasi veidi hiljem.<\/p>\n<h3>Backend<\/h3>\n<p>\nTahtsime tausts\u00fcsteemi teha Linuxil. Tausts\u00fcsteem suhtleb andmebaasiga, laadib vajalikud \u00f5iguste loendid ja seej\u00e4rel, s\u00f5ltuvalt sellest, milliste \u00f5igustega autentitud kasutaja on, annab juurde p\u00e4\u00e4suga finantsdokumentide allkirjastamiseks ja nende t\u00e4itmiseks saatmiseks v\u00f5i mingi aruande genereerimiseks.<\/p>\n<h2>S\u00e4\u00e4stmine c HAProxy<\/h2>\n<p>\nLisaks kahele kontekstile, millega iga klient toimis, oli veel \u00fcks kontekst identity. <b>IdentityServer4<\/b> see v\u00f5imaldab sisse logida, see on tasuta ja v\u00f5imas analoog <b>ADFS\u00a0<\/b>\u2014<b> Active Directory Federation Services<\/b>.<\/p>\n<p>Identiteedi p\u00e4ringut t\u00f6\u00f6deldi mitmes etapis. Esimene etapp, <b>kliendi<\/b> <b>sattus tausts\u00fcsteemi<\/b>, mis vahetas andmeid selle serveriga ja kontrollis kliendi tokeni olemasolu. Kui see ei leitud - p\u00e4ring tagastati tagasi konteksti, kust see tuli, kuid juba suunamisega, ja koos suunamisega l\u00e4ks see identiteedile.<\/p>\n<p>Teine etapp - p\u00e4ring sattus <b>autentimise lehele IdentityServeris,<\/b> kus klient registreerus ja IdentityServeri andmebaasis ilmus see kauaoodatud token. <\/p>\n<p>Kolmas etapp - <b>klient suunati tagasi <\/b>kontekstist, millest ta tuli.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4-l on \u00fcks omadus: <b>vastus tagasiside p\u00e4ringule tuleb l\u00e4bi HTTP<\/b>. \u00dckski meie serveri seadistamise katsest v\u00f5i dokumentatsioonist ei aidanud, me saime iga kord algse kliendi p\u00e4ringu, mille URL tuli HTTPS kaudu, aga IdentityServer tagastas sama konteksti HTTP kaudu. Olime \u0161okis! Ja suunasime selle k\u00f5ik l\u00e4bi identity konteksti HAProxy kaudu, kuid peame protokolli HTTP modifitseerima HTTPS-iks p\u00e4istes. <\/p>\n<p>Mis on parendused ja kus kokkuhoid?<\/p>\n<blockquote><p>Oleme raha kokku hoidnud, kasutades tasuta lahendust kasutajagruppide autoriseerimiseks, ressursse, kuna me ei t\u00f5stnud IdentityServer4 eraldi s\u00f5lmena eraldi segmenti, vaid kasutasime seda koos rakenduse tagarindega samal serveril, kus rakenduse tagariba t\u00f6\u00f6tab.<\/p><\/blockquote>\n<p><\/p>\n<h2>Kuidas see peaks t\u00f6\u00f6tama<\/h2>\n<p>\nNii et, nagu ma lubasin - Magic Box. Me m\u00f5istame n\u00fc\u00fcd, et suundume kindlasti Linuxi poole. Vaatame konkreetsed \u00fclesanded, mis vajasid lahendamist.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Puppet manifestid. <\/b>Teenuste ja rakenduste konfiguratsiooni edastamiseks ja haldamiseks tuli kirjutada suurep\u00e4rased retseptid. Karp pliiatsiga n\u00e4itab selgelt, kui kiiresti ja kvaliteetselt see tehtud sai.<\/p>\n<p><b>Tarnimisviis. <\/b>Standard on RPM. K\u00f5ik m\u00f5istavad, et Linuxis ei saa ilma selleta, kuid ise projekt p\u00e4rast kompileerimist oli komplekt t\u00e4idetud DLL-failidest. Neid oli umbes 150, projekt oli piisavalt mahukas. Ainus harmooniline lahendus oli pakkida see binaar RPM-i ja seej\u00e4rel sealt rakendus \u00fcles t\u00f5sta.<\/p>\n<p><b>Versioonimine. <\/b>Me pidime vabastama v\u00e4ga sageli ja tuli otsustada, kuidas paketi nime kujundada. See on tasemek\u00fcsimus TFS-iga integreerimisel. Meie Build-agendiks oli Linux. Kui TFS saadab \u00fclesande t\u00f6\u00f6tlejale \u2014 worker \u2014 Build-agentile, edastab ta talle ka muutuja massiivi, mis tuleb t\u00f6\u00f6tleja protsessi keskkonda. Nendes keskkonnamuutujates edastatakse Buildi nimi, versiooni nimi ja teised muutujad. T\u00e4iendavat teavet leiate allpool jaotises \u201eRPM-paketi koostamine\u201c.<\/p>\n<p><b>TFS-i seadistamine<\/b> \u00e4\u00e4rmus kulmineerub Pipeline'i seadistusse. Varem kogusime Windows-agentides k\u00f5ik Windows-projektid, kuid n\u00fc\u00fcd lisandub Linux-agent \u2014 Build-agent, mille tuleb lisada kogumisse, rikastada mingite artefaktidega, m\u00e4rkida, millise t\u00fc\u00fcbi projekte sellele Build-agentile kogutakse, ja muuta Pipeline'i.<\/p>\n<p><b>IdentityServer. <\/b>ADFS ei ole meie tee, toetame Open Source'i.<\/p>\n<p>Vaadakem komponente.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nKoosneb neljast osast.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build-agent. <\/b>Linux, sest me kogume selle alla \u2014 loogiline. See osa viidi ellu kolme sammuga.<\/p>\n<ul>\n<li><b>Seadistada worker'id<\/b> ja mitte ainult \u00fcks, kuna eeldati projekti jaotatud t\u00f6\u00f6tamist.\n<\/li>\n<li><b>Installeerida .NET Core 1.x<\/b>. Miks just 1.x, kui 2.0 on juba tavarepositooriumis saadaval? Sest kui me arendamisega alustasime, oli stabiilne versioon 1.09 ja projekti otsustati teha selle alla.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-repositoorium. <\/b>RPM-pakette tuli kuskil hoida. Eeldati, et kasutame sama ettev\u00f5tte RPM-repositooriumi, mis on k\u00f5igile Linuxi hostidele saadaval. Nii ka tegime. Serveris on repositoorium seadistatud <b>webhook<\/b> , mis laadis vajalikud RPM-paketid m\u00e4\u00e4ratud kohast alla. Paketiversiooni teatas Build-agent webhook'ule.<\/p>\n<p><b>GitLab. <\/b>T\u00e4htis! GitLab'i kasutatakse siin mitte arendajate, vaid halduskeskuse poolt rakenduse, paketiversioonide ning k\u00f5ikide Linux-masinate oleku j\u00e4lgimiseks, samuti hoitakse seal retsepte \u2013 k\u00f5iki Puppet'i manifeste. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2014 lahendab k\u00f5ik vaidlusalused k\u00fcsimused ja toob meile just selle konfigureeringu, mida soovime, GitLab'ist.<\/p>\n<p>Alustame s\u00fcvenemist. Kuidas toimub DLL'i tarnimine RPM'i?<\/p>\n<h3>DDL'i tarnimine RPM'i<\/h3>\n<p>\nOletame, et meil on .NET-i arenduse rokkt\u00e4ht. Ta kasutab Visual Studio't ja loob versiooniharu. P\u00e4rast seda laadib ta selle Git'i, kus Git on TFS-\u00fcksus, see t\u00e4hendab rakenduse hoidla, millega arendaja t\u00f6\u00f6tab.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e4rast seda n\u00e4eb TFS, et uus kinnitus on saabunud. Milline rakendus? TFS-i seadetes on m\u00e4rge, milliste ressurssidega on erinevad Build-agendid varustatud. Antud juhul n\u00e4eb ta, et ehitame .NET Core projekti ja valib Linuxi Build-agendi basseinist. <\/p>\n<p>Build-agent saab l\u00e4htekoodid, t\u00f5mbab vajalikud <b>s\u00f5ltuvused<\/b> .NET hoidlast, npm-ist jne, ja p\u00e4rast rakenduse enda koostamist ja j\u00e4rgmist pakkimist saadab RPM-paketi RPM-hoidlasse.<\/p>\n<p>Teiselt poolt toimub j\u00e4rgmist. K\u00e4itamise osakonna insener tegeleb projekti k\u00e4ivitamisega: muudab pakettide versioone\u00a0<b>Hiera<\/b> hoidlas, kus hoitakse rakenduse retseptuuri, p\u00e4rast mida Puppet k\u00e4ivitab <b>Yum<\/b>, t\u00f5mbab uue paketi hoidlast ja uus rakenduse versioon on kasutamiseks valmis.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00e4esolev osa on lihtne, kuid mis toimub tegelikult Build-agentis?<\/p>\n<h3>DLL RPM pakkimine<\/h3>\n<p>\nProjektin allikad on saadud ja koostamise \u00fclesanne TFS-ilt. Build-agent <b>k\u00e4ivitab projekti koostamise allikatest.<\/b>Koostatud projekt on saadaval hulgaliselt <b>DLL faile<\/b>, mis on pakitud zip-arhiivi, et v\u00e4hendada koormust failis\u00fcsteemile.<\/p>\n<p>ZIP-arhiiv visatakse <b>RPM pakendi koostamise katalooge.<\/b> J\u00e4rgmisena Bash-skript initsialiseerib keskkonnamuutujad, leiab Build versiooni, projekti versiooni, tee koostamise kataloogi ja k\u00e4ivitab RPM-buildi. P\u00e4rast koostamise l\u00f5petamist avaldatakse paketid\u00a0<b>kohalikku hoidlasse<\/b>, mis asub Build-agentis.<\/p>\n<p>Seej\u00e4rel saadetakse Build-agentist serverisse RPM-hoidlatesse <b>JSON-p\u00e4ring<\/b> versiooni ja build'i nime m\u00e4\u00e4ramisega. Webhook, millest ma varem r\u00e4\u00e4kisin, t\u00f5mbab selle paketi kohalikust hoidlast Build-ainel ja teeb uue ehituse installimiseks kergesti k\u00e4ttesaadavaks.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMiks just selline paketi kohaletoimetamise skeem RPM hoidlast? Miks ei saa kohe kokku pandud paketti hoidlast saata? Asi on selles, et see on turvalisuse tagamise tingimus. Selline stsenaarium piirab k\u00f5rvaliste isikute v\u00f5imalust mitteautoriseeritud RPM-pakettide \u00fcleslaadimiseks serverisse, mis on k\u00f5igile Linuxi masinatele ligip\u00e4\u00e4setav.<\/p>\n<h2>Andmebaasi versioonimine<\/h2>\n<p>\nArenduskonsiiliumil selgus, et arendajatele meeldib rohkem MS SQL, kuid enamikus non-Windows projektides oleme juba aktiivselt kasutanud PostgreSQL-i. Kuna otsustasime loobuda k\u00f5igest tasulisest, hakkasime ka siin PostgreSQL-i kasutama.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles osas tahan r\u00e4\u00e4kida, kuidas me andmebaasi versioonimist teostasime ja kuidas valisime Flyway ja Entity Framework Core vahel. Vaatame nende plusse ja miinuseid.<\/p>\n<h3>Miinused<\/h3>\n<p>\nFlyway t\u00f6\u00f6tab ainult \u00fches suunas, me\u00a0<b>ei saa tagasi tagasi minna<\/b>\u00a0\u2014 see oluline puudus. Entity Framework Core'i saab v\u00f5rrelda teiste kriteeriumitega \u2014 arendaja mugavuse seisukohalt. Teate ju, et oleme sellele esmat\u00e4htsuse andnud, ja peamine kriteerium oli, et mitte muuta midagi Windowsi arenduse jaoks.<\/p>\n<p>Flyway jaoks meil <b>oli vajalik mingi \u00fcmbris<\/b>, et mehed ei kirjutaks <b>SQL-p\u00e4ringuteks<\/b>. Neil on palju mugavam t\u00f6\u00f6tada OOP-tasandil. Kirjutasime juhised andmebaasi objektide kasutamiseks, SQL-i p\u00e4ring moodustus ja t\u00e4ideti. Uus andmebaasi versioon on valmis, testitud \u2014 k\u00f5ik on h\u00e4sti, k\u00f5ik t\u00f6\u00f6tab.<\/p>\n<p>Entity Framework Core'il on puudus \u2014 suurte koormustega\u00a0<b>teeb ta mitteoptimaalseid SQL-p\u00e4ringuid<\/b>, ja andmebaasi koormus v\u00f5ib olla m\u00e4rkimisv\u00e4\u00e4rne. Kuid kuna meil ei ole k\u00f5rge koormuse teenust, me ei m\u00f5\u00f5da koormust sadade RPS-idega, siis v\u00f5tsime need riskid endale ja delegasime probleemi tulevikus meile.<\/p>\n<h3>Plussid<\/h3>\n<p>\nEntity Framework Core <b>t\u00f6\u00f6tab kohe ja on arendajatele mugav<\/b>, kuid Flyway <b>integreerub kergesti olemasolevasse CI<\/b>. Aga me ju teeme arendajatele mugavamaks :)<\/p>\n<h3>K\u00e4ivitamisprotseduur<\/h3>\n<p>\nPuppet n\u00e4eb, et pakettide versioonide muutus toimub, sealhulgas see, mis vastutab migration'i eest. Esmalt installitakse pakett, kus sisaldub migration'i skriptid ja andmebaasi funktsionaalsus. P\u00e4rast seda taask\u00e4ivitub rakendus, mis t\u00f6\u00f6tab andmebaasiga. J\u00e4rgneb \u00fclej\u00e4\u00e4nud komponentide installimine. Pakettide installimise j\u00e4rjekord ja rakenduste k\u00e4ivitamine on kirjeldatud Puppet'i manifestis.<\/p>\n<p>Rakendused kasutavad tundlikke andmeid, nagu token'id ja andmebaasi paroolid; k\u00f5ik need t\u00f5mmatakse konfiguraatorist Puppet master, kus nad on salastatud.<\/p>\n<h2>TFS probleemid<\/h2>\n<p>\nP\u00e4rast seda, kui olime kindlad ja m\u00f5istsime, et meil t\u00f5epoolest k\u00f5ik t\u00f6\u00f6tab, otsustasin vaadata, mis toimub TFS-i kogumite osas \u00fcldiselt Win-arendusosakonna muude projektide puhul \u2013 kas kokkupanekud\/\u00fclekanded on kiired v\u00f5i mitte \u2013 ja tuvastasin m\u00e4rkimisv\u00e4\u00e4rseid probleeme kiirusest.<\/p>\n<p>\u00dcks olulisi projekte koostatakse 12-15 minuti jooksul \u2013 see on liiga pikk, nii ei saa elada. Kiire anal\u00fc\u00fcs n\u00e4itas kohutavat I\/O langust ja see toimub massiivide peal.<\/p>\n<p>P\u00e4rast komponendi anal\u00fc\u00fcsi eristasin kolm keskpunkti. Esimene \u2013 <b>\u00abKaspersky antivirus\u00bb<\/b>, mis skannib l\u00e4htekoodide k\u00f5igil Windows Build-agentidel. Teine \u2014 <b>Windows<\/b> <b>Indexer.<\/b> See ei olnud v\u00e4lja l\u00fclitatud ja Build-agentidel indekseeriti reaalses ajas k\u00f5ik deploy'imise protsessi jooksul. <\/p>\n<p>Kolmas \u2014 <b>Npm install. <\/b>Selgus, et enamikus Pipelines kasutasime just seda skripti. Mis on selle probleem? Npm install protseduur k\u00e4ivitatakse s\u00f5ltuvuste puu loomisel\u00a0<b>package-lock.json<\/b>, kus fikseeritakse pakettide versioonid, mida projekti kokkupanekuks kasutatakse. Miinus seisneb selles, et Npm install toob iga kord uusimad paketiversioonid internetist, mis kulutab m\u00e4rkimisv\u00e4\u00e4rselt aega suurte projektide korral.<\/p>\n<blockquote><p>Arendajad katsetavad m\u00f5nikord kohalikul masinal, et kontrollida, kuidas t\u00f6\u00f6tavad \u00fcksikud osad v\u00f5i terve projekt. M\u00f5nikord selgus, et kohapeal k\u00f5ik toimib h\u00e4sti, aga kokkupanekul \u2014 mitte midagi ei t\u00f6\u00f6tanud. Alustame probleemi lahendamist \u2014 ah, erinevad paketiversioonid s\u00f5ltuvustega.<\/p><\/blockquote>\n<p><\/p>\n<h3>Lahendus<\/h3>\n<p><\/p>\n<ul>\n<li>L\u00e4htekoodid AV v\u00e4lja j\u00e4tta.\n<\/li>\n<li>Indekseerimise keelamine.\n<\/li>\n<li>\u00dcleminekule\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nNpm ci plussideks on see, et me\u00a0<b>koostame s\u00f5ltuvuste puu \u00fche korra<\/b>, ja saame v\u00f5imaluse esitada arendajale <b>aktuaalne paketilisti<\/b>, millega saab katsetada lokaalselt nii palju kui soovib. See <b>s\u00e4\u00e4stab aega<\/b> arendajatele, kes kirjutavad koodi.<\/p>\n<h3>Konfiguratsioon<\/h3>\n<p>\nNatuke n\u00fc\u00fcd repositooriumi konfiguratsioonist. Ajalooliselt oleme kasutanud <b>Nexus<\/b> repositooriumide haldamiseks, sealhulgas <b>Internaalse REPO<\/b>. Selles sisemises repositooriumis on k\u00f5ik komponendid, mida kasutame siset\u00f6\u00f6deks, n\u00e4iteks kohandatud monitooringud.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core Linuxil, DevOps kulmineerub\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKasutame ka <b>NuGet<\/b>, kuna see on paremini puhverdatud v\u00f5rreldes teiste pakihalduritega.<\/p>\n<h3>Tulemus<\/h3>\n<p>\nP\u00e4rast Build-agentide optimeerimist v\u00e4henes keskmine ehitusaeg 12 minutilt 7 minutile.<\/p>\n<blockquote><p>Kui arvestada k\u00f5iki masiname, mida oleksime saanud Windowsile, aga muutsime Linuxiks selle projekti raames, siis s\u00e4\u00e4stsime umbes 10 000 dollarit. Ja see on ainult litsentside pealt, kui arvestada sisu - veel rohkem.<\/p><\/blockquote>\n<p><\/p>\n<h2>Tunniplaanid<\/h2>\n<p>\nJ\u00e4rgmisse kvartalisse oleme plaaninud koodi kohaletoimetamise optimeerimise.<\/p>\n<p><b>\u00dcleminek eelkoostatud Docker-pildi<\/b>. TFS on \u00e4ge asi koos paljude pluginatega, mis v\u00f5imaldavad integreerida Pipeline'i, sealhulgas ehituse k\u00e4ivitamise n\u00e4iteks Docker-pildi puhul. Soovime teha selle k\u00e4ivitaja sellele. <b>package-lock.json<\/b>. Kui mingil viisil muutub projektis kasutatavate komponentide koosseis, kogume uue Docker-pildi. Edasi kasutatakse seda konteineri juurutamiseks koos kogutud rakendusega. Praegu seda ei ole, kuid plaanime \u00fcle minna mikroteenuste arhitektuurile Kuberneteses, mis meie ettev\u00f5ttes aktiivselt areneb ja juba pikka aega toetab tootmislahendusi.<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nKutsub k\u00f5iki Windowsist loobuma, kuid see pole seet\u00f5ttu, et ma ei oska seda seadistada. P\u00f5hjus on selles, et suur osa avatud l\u00e4htekoodiga lahendustest on <b>Linuxi stack<\/b>. Te s\u00e4\u00e4state h\u00e4sti <b>ressursse<\/b>. Minu arvates on tulevik avatud l\u00e4htekoodiga lahendustes Linuxis, millel on tugev kogukond.<\/p>\n<p><i>L\u00e4biviija profiil Aleksandr Sin\u010dinov <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">GitHubis<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0\u2014 see on konverents arendamise, testimise ja opereerimise protsesside integreerimiseks professionaalidelt professionaalidele. Just seet\u00f5ttu on projekt, millest Aleksandr r\u00e4\u00e4kis, ellu viidud ja t\u00f6\u00f6tab, ning esinemisp\u00e4eva jooksul toimusid kaks edukat versiooni.\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf RIT++-is<\/a><\/noindex> 27. ja 28. mail on veel rohkem selliseid juhtumeid praktikutelt. Veel on v\u00f5imalik viimasele rongile h\u00fcpata ja <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">esituda ettekanne<\/a><\/noindex> v\u00f5i rahulikult. <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">broneerida<\/a><\/noindex> pilet. Kohtume Skolkovo's!<\/p><\/blockquote>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/448496\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b\u00a0\u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438\u00a0\u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e\u00a0Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f\u00a0\u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430\u00a0\u0441\u0442\u043e\u043b \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u043e\u00a0\u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u00a0\u2014 \u0431\u043e\u043b\u044c\u2026 \u0422\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0421\u0438\u043d\u0447\u0438\u043d\u043e\u0432\u0430 \u043d\u0430 DevOpsConf. \u041a\u043e\u0433\u0434\u0430 \u0438\u0437\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0448\u0435\u043b \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e\u00a0Windows, \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u00a0Linux, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24043,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32217","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - 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. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430 \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 \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \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 \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 Windows, \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 Linux,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47.NET Core \u043d\u0430 Linux, DevOps \u043d\u0430 \u043a\u043e\u043d\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430 \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 \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \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 \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 Windows, \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 Linux,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:45:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 .NET Core Linuxil, DevOps tipptasemel | ProHoster","description":"Me arendasime DevOps'i nii h\u00e4sti kui oskasime. Meid oli 8, ja Vassja oli Windowsi parim. \u00dchel hetkel lahkus Vassja, ja mul oli \u00fclesanne alustada uut projekti, mis pakub Windows-arendust. Kui laotasin lauale kogu Windows-arenduse stenki, siis sain aru, et olukord on valus... Nii algab Aleksandr Sin\u0161inovi lugu DevOpsConf'is. Kui ettev\u00f5ttest lahkus Windowsi peamine spetsialist, siis Aleksandr k\u00fcsis, mida n\u00fc\u00fcd teha. Kas minna Linuxile,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47.NET Core \u043d\u0430 Linux, DevOps \u043d\u0430 \u043a\u043e\u043d\u0435 | ProHoster","og:description":"\u041c\u044b \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438 DevOps \u043a\u0430\u043a \u043c\u043e\u0433\u043b\u0438. \u041d\u0430\u0441 \u0431\u044b\u043b\u043e 8 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u0412\u0430\u0441\u044f \u0431\u044b\u043b \u0441\u0430\u043c\u044b\u043c \u043a\u0440\u0443\u0442\u044b\u043c \u043f\u043e Windows. \u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0412\u0430\u0441\u044f \u0443\u0448\u0435\u043b, \u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u044b\u0441\u044b\u043f\u0430\u043b \u043d\u0430 \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 \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \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 \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 Windows, \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 Linux,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:45:43+00:00","article:modified_time":"2019-10-31T18:45:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32217","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 09:49:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:02:47","updated":"2026-01-21 09:49:20"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}