{"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\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ne kemi zhvilluar DevOps sa kemi mundur. Ishim 8 persona, dhe Vasja ishte m\u00eb i shk\u00eblqyeri p\u00ebr Windows. Papritmas Vasja iku, dhe un\u00eb mora nj\u00eb sfid\u00eb p\u00ebr t\u00eb nxjerr\u00eb n\u00eb pah nj\u00eb projekt t\u00eb ri q\u00eb ofron zhvillim p\u00ebr Windows. Kur hodha n\u00eb tryez\u00eb t\u00eb gjith\u00eb grack\u00ebn e zhvillimit p\u00ebr Windows, e kuptova se situata ishte e dhimbshme...<\/p>\n<p>K\u00ebshtu fillon historia <b>Aleksand\u00ebr Sin\u00e7inov<\/b> n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Kur eksperti kryesor i Windows u largua nga kompania, Aleksandri u pyet se \u00e7far\u00eb t\u00eb b\u00ebnte tani. T\u00eb kalonte n\u00eb Linux, sigurisht! Aleksandri do t\u00eb tregoj\u00eb se si arriti t\u00eb krijonte nj\u00eb precedent dhe t\u00eb transferonte nj\u00eb pjes\u00eb t\u00eb zhvillimit p\u00ebr Windows n\u00eb Linux, duke ilustruar me nj\u00eb projekt t\u00eb realizuar p\u00ebr 100,000 p\u00ebrdorues t\u00eb fundit.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi t\u00eb d\u00ebrgosh leht\u00ebsisht dhe n\u00eb m\u00ebnyr\u00eb pa stres projektin n\u00eb RPM, duke p\u00ebrdorur TFS, Puppet, Linux .NET core? Si t\u00eb mbash versionimin e DB t\u00eb projektit, kur zhvilluesit e par\u00eb d\u00ebgjojn\u00eb fjal\u00ebt Postgres dhe Flyway, dhe data e fundit \u00ebsht\u00eb nes\u00ebr? Si t\u00eb integrosh me Docker? Si t\u00eb motivojn\u00eb zhvilluesit .NET t\u00eb braktisin Windows-in dhe smoothies p\u00ebr Puppet dhe Linux? Si t\u00eb zgjidh\u00ebsh konflikte ideologjike, kur nuk ke as forc\u00eb, as d\u00ebshir\u00eb dhe as burime p\u00ebr t\u00eb mb\u00ebshtetur Windows n\u00eb prodhim? P\u00ebr k\u00ebt\u00eb, si dhe p\u00ebr Web Deploy, testimin, CI, praktikat e p\u00ebrdorimit t\u00eb TFS n\u00eb projektet ekzistuese, dhe natyrisht, p\u00ebr k\u00ebmb\u00ebt e thyera dhe zgjidhjet q\u00eb funksionojn\u00eb, n\u00eb transkriptin e fjalimit t\u00eb Aleksandrit.<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=\"Luaj videon\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nPra, Vasja iku, detyra \u00ebsht\u00eb n\u00eb duar t\u00eb mia, zhvilluesit presin me kazma me padurim. Kur e kuptova p\u00ebrfundimisht se Vasja nuk do t\u00eb kthehej, fillova pun\u00ebn. S\u00eb pari vler\u00ebsova p\u00ebrqindjen e Win VM n\u00eb paradin ton\u00eb. Numri nuk ishte n\u00eb favor t\u00eb Windows.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDuke qen\u00eb se ne po zhvillojm\u00eb aktivisht DevOps, e kuptova se duhej t\u00eb ndryshonim qasjen p\u00ebr lansimin e aplikacionit t\u00eb ri. Zgjidhja ishte nj\u00eb - sa m\u00eb shum\u00eb q\u00eb ishte e mundur, t\u00eb kalonim gjith\u00e7ka n\u00eb Linux. Google m\u00eb ndihmoi - n\u00eb at\u00eb koh\u00eb, .Net ishte tashm\u00eb portuar n\u00eb Linux, dhe e kuptova se kjo ishte zgjidhja!<\/p>\n<h2>Pse .NET core me Linux?<\/h2>\n<p>\nP\u00ebr k\u00ebt\u00eb kishte disa arsye. Nd\u00ebrmjet \"t\u00eb paguash\" dhe \"t\u00eb mos paguash\" shumica do t\u00eb zgjedhin t\u00eb dyt\u00ebn - si un\u00eb. Licenca p\u00ebr MSDB kushton rreth 1,000 $, mb\u00ebshtetje e parkut t\u00eb makinave virtuale Windows arrin qindra dollar\u00eb. P\u00ebr nj\u00eb kompani t\u00eb madhe, k\u00ebto jan\u00eb shpenzime t\u00eb m\u00ebdha. Prandaj <b>kursimi\u00a0<\/b>\u2014<b> \u00ebsht\u00eb arsyeja e par\u00eb<\/b>. Nuk \u00ebsht\u00eb m\u00eb e r\u00ebnd\u00ebsishmja, por \u00ebsht\u00eb nj\u00eb nga m\u00eb t\u00eb r\u00ebnd\u00ebsishmet.<\/p>\n<p>Makinat virtuale Windows ndjekin m\u00eb shum\u00eb burime se v\u00ebllez\u00ebrit e tyre nga Linux - <b>jan\u00eb m\u00eb t\u00eb rheavy<\/b>. Duke marr\u00eb parasysh shkall\u00ebn e madhe t\u00eb kompanis\u00eb, ne zgjodh\u00ebm Linux.<\/p>\n<p><b>Sistemi thjesht integrohet n\u00eb CI-n\u00eb ekzistuese<\/b>. Ne e shohim veten si DevOps progresiv, p\u00ebrdorim Bamboo, Jenkins dhe GitLab CI, prandaj pjesa m\u00eb e madhe funksionon n\u00eb Linux.<\/p>\n<p>Arsyeja e fundit \u00ebsht\u00eb <b>shoq\u00ebrimi i leht\u00eb. <\/b>Na nevojitej t\u00eb ulte pragun e hyrjes p\u00ebr \"shoq\u00ebruesit\" - djemt\u00eb q\u00eb kuptojn\u00eb pjes\u00ebn teknike, sigurojn\u00eb vazhdim\u00ebsin\u00eb dhe mb\u00ebshtesin sh\u00ebrbimet nga niveli i dyt\u00eb. Ata tashm\u00eb ishin t\u00eb njohur me stakun Linux, prandaj ishte shum\u00eb m\u00eb e leht\u00eb p\u00ebr ta t\u00eb kuptonin produktin e ri, ta mbanin dhe ta shoq\u00ebronin, sesa t\u00eb shpenzonin burime t\u00eb tjera p\u00ebr t\u00eb kuptuar funksionalitetin e ngjash\u00ebm t\u00eb softuerit p\u00ebr platform\u00ebn Windows.<\/p>\n<h2>K\u00ebrkesat<\/h2>\n<p>\nE para dhe m\u00eb e r\u00ebnd\u00ebsishmja \u00ebsht\u00eb <b>leht\u00ebsia e zgjidhjes s\u00eb re p\u00ebr zhvilluesit<\/b>. Jo t\u00eb gjith\u00eb prej tyre ishin t\u00eb gatsh\u00ebm p\u00ebr ndryshime, ve\u00e7an\u00ebrisht pas fjal\u00ebs Linux. Zhvilluesit duan Visual Studio t\u00eb tyren, TFS me teste automatike p\u00ebr nd\u00ebrtimet dhe smuzi. Si ndodh shp\u00ebrndarja n\u00eb prodhim - nuk \u00ebsht\u00eb e r\u00ebnd\u00ebsishme p\u00ebr ta. Prandaj vendos\u00ebm t\u00eb mos ndryshonim procesin e zakonsh\u00ebm dhe t\u00eb l\u00ebm\u00eb gjith\u00e7ka pa ndryshime p\u00ebr zhvillimin Windows. <\/p>\n<p>Projekti i ri duhet <b>t\u00eb integrohet n\u00eb CI-n\u00eb ekzistuese<\/b>. Railsat ishin tashm\u00eb atje dhe e gjith\u00eb puna duhej t\u00eb kryhej duke marr\u00eb parasysh parametrat e sistemit t\u00eb menaxhimit t\u00eb konfigurimit, standardet e pranueshme t\u00eb shp\u00ebrndarjes dhe sistemet e monitorimit.<\/p>\n<p><b>Thjesht\u00ebsia n\u00eb mb\u00ebshtetje dhe operim<\/b>, si kusht p\u00ebr pragun minimal t\u00eb hyrjes p\u00ebr t\u00eb gjith\u00eb pjes\u00ebmarr\u00ebsit e rinj nga departamente t\u00eb ndryshme dhe departamenti i mb\u00ebshtetjes.<\/p>\n<p><b>Afati \u00ebsht\u00eb - dje<\/b>.<\/p>\n<h2>Grupi i zhvillimit Windows<\/h2>\n<p>\nMe \u00e7far\u00eb ka punuar ekipi Windows?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTani mund t\u00eb them me siguri se <b>IdentityServer4<\/b>\u00a0\u00ebsht\u00eb nj\u00eb alternativ\u00eb e shk\u00eblqyer falas p\u00ebr ADFS me mund\u00ebsi t\u00eb ngjashme, ose q\u00eb <b>Entity Framework Core<\/b>\u00a0\u00ebsht\u00eb nj\u00eb parajs\u00eb p\u00ebr zhvilluesin, ku mund t\u00eb shkruaj\u00eb k\u00ebrkesa n\u00eb DB n\u00eb termat e OOP pa u shqet\u00ebsuar p\u00ebr shkruajtjen e skripteve SQL. Por at\u00ebher\u00eb, gjat\u00eb diskutimit t\u00eb planit t\u00eb veprimit, e shikoja k\u00ebt\u00eb Stak si shkrim t\u00eb vjet\u00ebr, duke njohur vet\u00ebm PostgreSQL dhe Git.<\/p>\n<p>N\u00eb at\u00eb koh\u00eb, ne aktivisht p\u00ebrdornim <b>Puppet<\/b> si sistem menaxhimi t\u00eb konfiguracionit. N\u00eb shumic\u00ebn e projekteve tona p\u00ebrdorim <b>GitLab CI<\/b>, <b>Elastic<\/b>, balancojm\u00eb sh\u00ebrbimet me ngarkesa t\u00eb larta me ndihm\u00ebn e <b>HAProxy,<\/b> monitorojm\u00eb gjith\u00e7ka me ndihm\u00ebn e <b>Zabbix<\/b>, lidhjeve <b>N\u00ebse tashm\u00eb e dini se \u00e7far\u00eb \u00ebsht\u00eb analiza e grupeve dhe se si ta b\u00ebni n\u00eb SQL, kaloni menj\u00ebher\u00eb n\u00eb seksionin e fundit.<\/b> dhe\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, dhe e gjith\u00eb kjo funksionon n\u00eb harduerin\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> n\u00eb\u00a0<b>VMware<\/b>. T\u00eb gjith\u00eb e njohin - klasika e zhanrit.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb shohim dhe t\u00eb p\u00ebrpiqemi t\u00eb kuptojm\u00eb se \u00e7far\u00eb ndodhi para se t\u00eb nisim k\u00ebto p\u00ebrzierje.<\/p>\n<h2>\u00c7far\u00eb ndodhi<\/h2>\n<p>\nTFS \u00ebsht\u00eb nj\u00eb sistem mjaft i fuqish\u00ebm, i cili jo vet\u00ebm q\u00eb d\u00ebrgon kodin nga zhvilluesi n\u00eb makinerin\u00eb p\u00ebrfundimtare t\u00eb prodhimit, por gjithashtu ka nj\u00eb paket\u00eb p\u00ebr nj\u00eb integrim shum\u00eb fleksib\u00ebl me sh\u00ebrbime t\u00eb ndryshme \u2013 p\u00ebr t\u00eb siguruar CI n\u00eb nivelin multi-platform\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNj\u00eb her\u00eb, kishte vet\u00ebm dritare t\u00eb pafundme. TFS p\u00ebrdorte disa agjent\u00eb Build, mbi t\u00eb cil\u00ebt grumbulloheshin shum\u00eb projekte. N\u00eb \u00e7do agjent kishte 3-4 pun\u00ebtor\u00eb p\u00ebr t\u00eb b\u00ebr\u00eb paralelizmin e detyrave dhe p\u00ebr t\u00eb optimizuar procesin. M\u00eb pas, sipas planeve t\u00eb l\u00ebshimit, TFS dor\u00ebzonte nj\u00eb Build t\u00eb sapogatuar n\u00eb serverin e aplikacioneve Windows.<\/p>\n<h2>\u00c7far\u00eb donim t\u00eb arrinim<\/h2>\n<p>\nP\u00ebr d\u00ebrgimin dhe zhvillimin p\u00ebrdorim TFS, nd\u00ebrsa aplikacionin e aktivizojm\u00eb n\u00eb serverin e aplikacioneve Linux, dhe nd\u00ebrmjet tyre ndodhin disa magji. Ky <b>Magic Box<\/b> \u00ebsht\u00eb thelbi i pun\u00ebs s\u00eb ardhshme. Para se ta ndajm\u00eb at\u00eb n\u00eb pjes\u00eb, do t\u00eb b\u00ebj nj\u00eb hap m\u00ebnjan\u00eb dhe do t\u00eb them dy fjal\u00eb mbi aplikacionin.<\/p>\n<h2>Projekti<\/h2>\n<p>\nAplikacioni ofron funksionalitet p\u00ebr operimin e kartave t\u00eb parapaguara. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Client<\/h3>\n<p>\nEkzistuan dy lloje p\u00ebrdoruesish. <b>First<\/b> kishte akses duke u autorizuar me nj\u00eb certifikat\u00eb SSL SHA-2. T\u00eb\u00a0<b>t\u00eb dyt\u00eb<\/b> kishte akses me emrin e p\u00ebrdoruesit dhe fjal\u00ebkalimin.<\/p>\n<h3>HAProxy<\/h3>\n<p>\nM\u00eb pas, k\u00ebrkesa e klientit shkonte n\u00eb HAProxy, i cili zgjidhte detyrat e m\u00ebposhtme:<\/p>\n<ul>\n<li>autorizimi fillestar;\n<\/li>\n<li>terminimi SSL;\n<\/li>\n<li>tuning i k\u00ebrkesave HTTP;\n<\/li>\n<li>transmetimi i k\u00ebrkesave.\n<\/li>\n<\/ul>\n<p>\nVerifikimi i certifikat\u00ebs s\u00eb klientit b\u00ebhej n\u00ebp\u00ebrmjet zinxhirit. Ne <b>authority <\/b>dhe mund ta lejojm\u00eb nj\u00eb gj\u00eb t\u00eb till\u00eb, pasi ne vet\u00eb l\u00ebshojm\u00eb certifikata p\u00ebr klient\u00ebt e sh\u00ebrbimit.<\/p>\n<p>Kujdes mbi pik\u00ebn e tret\u00eb, do t\u00eb kthehemi tek ajo m\u00eb von\u00eb.<\/p>\n<h3>Backend<\/h3>\n<p>\nBackend-in planifikonim ta b\u00ebm\u00eb n\u00eb Linux. Backend-i bashk\u00ebvepronte me DB, ngarkonte list\u00ebn e nevojshme t\u00eb privilegjeve dhe m\u00eb pas, n\u00eb p\u00ebrputhje me privilegjet e p\u00ebrdoruesit t\u00eb autorizuar, jepte akses p\u00ebr n\u00ebnshkrimin e dokumenteve financiare dhe d\u00ebrgimin e tyre p\u00ebr ekzekutim, ose gjenerimin e ndonj\u00eb raporti.<\/p>\n<h2>Kursimi me HAProxy<\/h2>\n<p>\nP\u00ebrve\u00e7 dy konteksteve, me t\u00eb cil\u00ebt ecin \u00e7do klient, ekzistonte edhe konteksti identity. <b>IdentityServer4<\/b> q\u00eb pik\u00ebrisht lejon autorizimin, \u00ebsht\u00eb nj\u00eb alternativ\u00eb falas dhe e fuqishme p\u00ebr <b>ADFS\u00a0<\/b>\u2014<b> Sh\u00ebrbimet e Federat\u00ebs s\u00eb Drejtoris\u00eb Aktivitetit<\/b>.<\/p>\n<p>K\u00ebrkesa n\u00eb identity p\u00ebrpunoheshin n\u00eb disa hapa. Hapi i par\u00eb \u2013 <b>klient<\/b> <b>shkonte n\u00eb backend<\/b>, i cili shk\u00ebmbeu t\u00eb dh\u00ebna me k\u00ebt\u00eb server dhe kontrolloi p\u00ebr pranin\u00eb e tokenit p\u00ebr klientin. N\u00ebse nuk e gjente - k\u00ebrkesa kthehej mbrapsht n\u00eb kontekstin nga i cili erdhi, por tashm\u00eb me nj\u00eb ridrejtim, dhe me ridrejtim shkonte te identity.<\/p>\n<p>Hapi i dyt\u00eb - k\u00ebrkesa shkonte <b>n\u00eb faqen e autorizimit n\u00eb IdentityServer,<\/b> ku klienti regjistrohej, dhe n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb IdentityServer shfaqej ai tokeni i shum\u00ebpritur. <\/p>\n<p>Hapi i tret\u00eb - <b>klienti ridirektohej mbrapsht <\/b>n\u00eb kontekstin nga i cili erdhi.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 ka nj\u00eb ve\u00e7ori: <b>p\u00ebrgjigjja n\u00eb k\u00ebrkes\u00ebn e kthimit e kthen n\u00ebp\u00ebrmjet HTTP<\/b>. Pavar\u00ebsisht se si u p\u00ebrpoqa me konfigurimin e serverit, pavar\u00ebsisht se sa p\u00ebrmenda dokumentacionin, \u00e7do her\u00eb merrnim k\u00ebrkes\u00ebn fillestare t\u00eb klientit me URL, e cila erdhi p\u00ebrmes HTTPS, nd\u00ebrsa IdentityServer ktheu t\u00eb nj\u00ebjtin kontekst, por me HTTP. Ishim t\u00eb shokuar! Dhe e kaluam gjith\u00eb k\u00ebt\u00eb p\u00ebrmes kontekstit t\u00eb identitetit te HAProxy, dhe n\u00eb header-at dh obliged m\u00eb modifikuar protokollin HTTP n\u00eb HTTPS. <\/p>\n<p>Cila \u00ebsht\u00eb p\u00ebrmir\u00ebsimi dhe ku kursyem?<\/p>\n<blockquote><p>Kursyem para, duke p\u00ebrdorur nj\u00eb zgjidhje falas p\u00ebr autorizimin e grupit t\u00eb p\u00ebrdoruesve, burimet, pasi nuk e nxorr\u00ebm IdentityServer4 si nj\u00eb nod t\u00eb ve\u00e7ant\u00eb n\u00eb nj\u00eb segment t\u00eb ve\u00e7ant\u00eb, por e p\u00ebrdor\u00ebm at\u00eb n\u00eb p\u00ebrputhje me backend-in n\u00eb t\u00eb nj\u00ebjtin server ku funksionon backend-i i aplikacionit.<\/p><\/blockquote>\n<p><\/p>\n<h2>Si duhet t\u00eb punoj\u00eb<\/h2>\n<p>\nPra, si\u00e7 e premtova - Magic Box. Tani e kuptojm\u00eb se sigurisht po i afrohemi Linux-it. Le t\u00eb formulojm\u00eb detyrat specifike q\u00eb k\u00ebrkonin zgjidhje.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Manifestet Puppet. <\/b>P\u00ebr t\u00eb shp\u00ebrndar\u00eb dhe menaxhuar konfigurimin e sh\u00ebrbimit dhe aplikacionit, duhej t\u00eb shkruhen receta t\u00eb shk\u00eblqyera. Rul me laps tregon qart\u00eb se sa shpejt dhe cil\u00ebsisht u realizua kjo.<\/p>\n<p><b>Metoda e shp\u00ebrndarjes. <\/b>Standardi \u00ebsht\u00eb RPM. T\u00eb gjith\u00eb e din\u00eb se n\u00eb Linux nuk ka si t\u00eb ndodhi pa t\u00eb, por projekti vet\u00eb pas nd\u00ebrtimit p\u00ebrb\u00ebnte nj\u00eb grup DLL-skedash ekzekutiv. Ishin rreth 150; projekti \u00ebsht\u00eb mjaft i r\u00ebnd\u00eb. Zgjidhja e vetme harmonike \u00ebsht\u00eb t\u00eb paketosh k\u00ebt\u00eb binar n\u00eb RPM dhe t\u00eb nis\u00ebsh aplikacionin nga ajo.<\/p>\n<p><b>Versionimi. <\/b>Na n\u00ebn\u00ebn si do t\u00eb lirohemi shum\u00eb shpesh, dhe duhej t\u00eb vendosnim se si do t\u00eb formojm\u00eb emrin e paket\u00ebs. Ky \u00ebsht\u00eb nj\u00eb \u00e7\u00ebshtje q\u00eb lidhet me integrimin me TFS. Build-agentin e kishim n\u00eb Linux. Kur TFS d\u00ebrgon nj\u00eb detyr\u00eb n\u00eb trajtuesin \u2013 worker \u2013 n\u00eb Build-agent, ai i d\u00ebrgon edhe nj\u00eb grup variablash, t\u00eb cilat kalojn\u00eb n\u00eb ambientin e procesit t\u00eb trajtuesit. N\u00eb k\u00ebto variabla ambienti kalon emri i Build, emri i versionit dhe variabla t\u00eb tjera. M\u00eb shum\u00eb rreth k\u00ebsaj n\u00eb seksionin 'nd\u00ebrtimi i paket\u00ebs RPM'.<\/p>\n<p><b>Konfigurimi i TFS<\/b> u p\u00ebrqendrua n\u00eb konfigurimin e Pipeline. M\u00eb par\u00eb ne nd\u00ebrtuam t\u00eb gjitha projektet Windows n\u00eb agent\u00ebt Windows, nd\u00ebrsa tani po shfaqet agenti Linux \u2013 Build-agent, i cili duhet t\u00eb p\u00ebrfshihet n\u00eb grupin e nd\u00ebrtimit, t\u00eb pasurohet me disa artefakte, t\u00eb tregohet se \u00e7far\u00eb lloj projektesh do t\u00eb nd\u00ebrtohet n\u00eb k\u00ebt\u00eb Build-agent, dhe si duhet modifikuar Pipeline.<\/p>\n<p><b>IdentityServer. <\/b>ADFS nuk \u00ebsht\u00eb rruga jon\u00eb, mb\u00ebshtesim Open Source.<\/p>\n<p>Le t\u00eb kalojm\u00eb p\u00ebrmes komponenteve.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nP\u00ebrb\u00ebhet nga kat\u00ebr pjes\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build-agent. <\/b>Linux, sepse jemi duke nd\u00ebrtuar p\u00ebr t\u00eb \u2013 logjikisht. Kjo pjes\u00eb u realizua n\u00eb tre hapa.<\/p>\n<ul>\n<li><b>T\u00eb konfiguroni worker-at<\/b> dhe jo nj\u00eb, pasi parashikohej q\u00eb t\u00eb punohet n\u00eb m\u00ebnyr\u00eb t\u00eb shp\u00ebrndar\u00eb mbi projektin.\n<\/li>\n<li><b>Instaloni .NET Core 1.x<\/b>. Pse pik\u00ebrisht 1.x, kur tashm\u00eb \u00ebsht\u00eb n\u00eb dispozicion 2.0 n\u00eb depozit\u00ebn standarde? Sepse, kur filluam zhvillimin, versioni stabil ishte 1.09, dhe projekti u vendos t\u00eb b\u00ebhej p\u00ebr t\u00eb.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-depozita. <\/b>RPM-paketat duhej t\u00eb ruheshin diku. Parashikohej q\u00eb ne do t\u00eb p\u00ebrdorim t\u00eb nj\u00ebjt\u00ebn depo t\u00eb korporat\u00ebs RPM, e cila \u00ebsht\u00eb e qasshme p\u00ebr t\u00eb gjitha hostet Linux. E b\u00ebm\u00eb k\u00ebshtu. N\u00eb serverin e depozit\u00ebs \u00ebsht\u00eb e vendosur <b>webhook<\/b> i cili shkarkonte paket\u00ebn RPM t\u00eb k\u00ebrkuar nga vendi i caktuar. Versioni i paket\u00ebs i raportohej webhook-ut nga Build-agent.<\/p>\n<p><b>GitLab. <\/b>Kujdes! GitLab k\u00ebtu p\u00ebrdoret jo nga zhvilluesit, por nga departamenti i operacioneve p\u00ebr t\u00eb kontrolluar versionet e aplikacionit, versionet e paketave, kontrollin e gjendjes s\u00eb t\u00eb gjitha makinerive Linux dhe aty ruhet receta \u2013 t\u00eb gjitha manifestet e Puppet. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2013 zgjidh t\u00eb gjitha momentet e kontestueshme dhe sjell pik\u00ebrisht at\u00eb konfigurim q\u00eb duam, nga GitLab.<\/p>\n<p>T\u00eb fillojm\u00eb t\u00eb zhytemi. Si ndodh d\u00ebrgimi i DLL n\u00eb RPM?<\/p>\n<h3>D\u00ebrgimi i DDL n\u00eb RPM<\/h3>\n<p>\nSupozoni se kemi nj\u00eb rock star zhvillimi n\u00eb .NET. Ai p\u00ebrdor Visual Studio dhe krijon nj\u00eb deg\u00eb l\u00ebshimi. Pas k\u00ebsaj e ngarkon at\u00eb n\u00eb Git, dhe Git k\u00ebtu \u00ebsht\u00eb nj\u00eb entitet TFS, dmth kjo \u00ebsht\u00eb depoja e aplikacionit, me t\u00eb cilin punon zhvilluesi.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPas nj\u00eb moment, TFS sheh se nj\u00eb komit i ri ka arritur. \u00c7far\u00eb aplikacioni? N\u00eb configurimet TFS ka nj\u00eb etiket\u00eb q\u00eb tregon se cilat burime ka ndonj\u00eb Build-agent. N\u00eb k\u00ebt\u00eb rast, ai sheh se po nd\u00ebrtojm\u00eb nj\u00eb projekt .NET Core dhe zgjidh nj\u00eb Build-agent Linux nga grupi. <\/p>\n<p>Build-agent merr burimet, shkarkon t\u00eb nevojshmet <b>dependencies<\/b> nga repository .NET, npm etj., dhe pas nd\u00ebrtimit t\u00eb vet\u00eb aplikacionit dhe paketimit t\u00eb m\u00ebpassh\u00ebm d\u00ebrgon paket\u00ebn RPM n\u00eb repository-n\u00eb RPM.<\/p>\n<p>Nga ana tjet\u00ebr ndodhin gj\u00ebrat e m\u00ebposhtme. Inxhinieri i departamentit t\u00eb operacioneve merret drejtp\u00ebrdrejt me p\u00ebrgatitjen e projektit: ndryshon versionet e paketave n\u00eb\u00a0<b>Hiera<\/b> n\u00eb repository-n\u00eb ku ruhet receta e aplikacionit, pas s\u00eb cil\u00ebs Puppet aktivizon <b>Yum<\/b>, merr paket\u00ebn e re nga repository, dhe versioni i ri i aplikacionit \u00ebsht\u00eb gati p\u00ebr t'u p\u00ebrdorur.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe fjal\u00eb, gjith\u00e7ka \u00ebsht\u00eb e thjesht\u00eb, por \u00e7far\u00eb ndodh brenda Build-agentit?<\/p>\n<h3>Paketimi DLL RPM<\/h3>\n<p>\nBurimet e projektit jan\u00eb marr\u00eb dhe ka nj\u00eb detyr\u00eb p\u00ebr nd\u00ebrtim nga TFS. Build-agent <b>fillon nd\u00ebrtimin e vet\u00eb projektit nga burimet<\/b>. Projekti i nd\u00ebrtuar \u00ebsht\u00eb i disponuesh\u00ebm n\u00eb form\u00ebn e shum\u00eb <b>fileve DLL<\/b>, t\u00eb cilat jan\u00eb paketuar n\u00eb nj\u00eb arkiv zip p\u00ebr t\u00eb reduktuar ngarkes\u00ebn n\u00eb sistemin e skedar\u00ebve.<\/p>\n<p>Arkivi ZIP hidhet <b>n\u00eb direktorin\u00eb e nd\u00ebrtimit t\u00eb paket\u00ebs RPM.<\/b> Pastaj, skripti Bash inicializon variablat e ambientit, gjen versionin e Build, versionin e projektit, rrug\u00ebn e drejtoris\u00eb s\u00eb nd\u00ebrtimit dhe aktivizon RPM-build. Pas p\u00ebrfundimit t\u00eb nd\u00ebrtimit, paketa publikohet n\u00eb\u00a0<b>repository-n\u00eb lokale<\/b>, e cila ndodhet n\u00eb Build-agent.<\/p>\n<p>Pastaj, nga Build-agent n\u00eb serverin e RPM-repository-s\u00eb <b>d\u00ebrgohet nj\u00eb k\u00ebrkes\u00eb JSON<\/b> me n\u00ebnshkrimin e emrit t\u00eb versionit dhe nd\u00ebrtimit. Webhook, p\u00ebr t\u00eb cilin kam folur m\u00eb par\u00eb, t\u00ebrheq k\u00ebt\u00eb paket\u00eb nga repository-n\u00eb lokale n\u00eb Build-agent dhe e b\u00ebn nd\u00ebrtimin e ri t\u00eb disponuesh\u00ebm p\u00ebr instalim.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPse pik\u00ebrisht ky skem\u00eb e shp\u00ebrndarjes s\u00eb paketave n\u00eb repository-n\u00eb RPM? Pse nuk mund t\u00eb d\u00ebrgohet menj\u00ebher\u00eb paketa e nd\u00ebrtuar n\u00eb repository? \u00c7\u00ebshtja \u00ebsht\u00eb se kjo \u00ebsht\u00eb nj\u00eb kusht p\u00ebr sigurimin e siguris\u00eb. Ky skenar kufizon mund\u00ebsin\u00eb e ngarkimit t\u00eb paautorizuar t\u00eb pakove RPM nga persona t\u00eb jasht\u00ebm n\u00eb serverin e cili \u00ebsht\u00eb i disponuesh\u00ebm p\u00ebr t\u00eb gjitha makinat Linux.<\/p>\n<h2>Versionimi i DB<\/h2>\n<p>\nN\u00eb nj\u00eb konsilium me zhvillimin doli se ekipi preferonte MS SQL, por n\u00eb shumic\u00ebn e projekteve non-Windows ne tashm\u00eb ishim duke p\u00ebrdorur PostgreSQL. Duke q\u00ebn\u00eb se kemi vendosur t\u00eb heqim dor\u00eb nga \u00e7do gj\u00eb me pages\u00eb, filluam t\u00eb p\u00ebrdorim PostgreSQL edhe k\u00ebtu.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb k\u00ebt\u00eb pjes\u00eb dua t\u00eb flas p\u00ebr m\u00ebnyr\u00ebn se si ne realizuam versionimin e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave dhe si vendos\u00ebm midis Flyway dhe Entity Framework Core. Le t\u00eb shohim avantajet dhe disavantazhet e tyre.<\/p>\n<h3>Disavantazhet<\/h3>\n<p>\nFlyway shkon vet\u00ebm n\u00eb nj\u00eb drejtim, ne\u00a0<b>nuk mund t\u00eb kthehemi prapa<\/b>\u00a0\u2014 kjo \u00ebsht\u00eb nj\u00eb disavantazh i r\u00ebnd\u00ebsish\u00ebm. Krahasimi me Entity Framework Core mund t\u00eb b\u00ebhet sipas parametrave t\u00eb tjer\u00eb \u2014 nga k\u00ebndv\u00ebshtrimi i komoditetit p\u00ebr zhvilluesin. Ju e mbani mend se ne e vendos\u00ebm k\u00ebt\u00eb n\u00eb qend\u00ebr t\u00eb v\u00ebmendjes, dhe kriteri kryesor ishte t\u00eb mos ndryshonim asgj\u00eb p\u00ebr zhvillimin n\u00eb Windows.<\/p>\n<p>P\u00ebr Flyway na <b>duhej nj\u00eb lloj mb\u00ebshtjell\u00ebs<\/b>, q\u00eb djemt\u00eb t\u00eb mos shkruanin <b>k\u00ebrkesa SQL<\/b>. Ata jan\u00eb shum\u00eb m\u00eb af\u00ebr t\u00eb operojn\u00eb n\u00eb terma OOP. Krijuam udh\u00ebzime p\u00ebr t\u00eb punuar me objektet e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, k\u00ebrkesa SQL u formua dhe u ekzekutua. Versioni i ri i baz\u00ebs s\u00eb t\u00eb dh\u00ebnave \u00ebsht\u00eb gati, kaloi t\u00eb gjitha testet \u2014 gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull, gjith\u00e7ka funksionon.<\/p>\n<p>Entity Framework Core ka nj\u00eb disavantazh \u2014 n\u00eb ngarkesa t\u00eb m\u00ebdha ai\u00a0<b>nd\u00ebrton k\u00ebrkesa SQL jo optimale<\/b>, dhe r\u00ebnia n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave mund t\u00eb jet\u00eb e konsiderueshme. Por, pasi sh\u00ebrbimi yn\u00eb nuk \u00ebsht\u00eb me ngarkes\u00eb t\u00eb lart\u00eb, ne nuk e matim ngarkes\u00ebn me qindra RPS, pranuam k\u00ebto rreziqe dhe deleguam problemin p\u00ebr n\u00eb t\u00eb ardhmen.<\/p>\n<h3>Pikat pozitive<\/h3>\n<p>\nEntity Framework Core <b>funksionon nga kutia dhe \u00ebsht\u00eb i leht\u00eb p\u00ebr zhvilluesit<\/b>, nd\u00ebrsa Flyway <b>integrohet leht\u00ebsisht n\u00eb CI e ekzistueshme<\/b>. Por ne po b\u00ebjm\u00eb gjith\u00e7ka t\u00eb leht\u00eb p\u00ebr zhvilluesit :)<\/p>\n<h3>Procedura e instalimit<\/h3>\n<p>\nPuppet sheh q\u00eb po vjen nj\u00eb ndryshim versioni t\u00eb paketave, p\u00ebrfshir\u00eb at\u00eb q\u00eb \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr migrimin. Fillimisht instalon paket\u00ebn, ku ndodhen skriptet e migrimit dhe funksionaliteti i lidhur me baz\u00ebn e t\u00eb dh\u00ebnave. Pas k\u00ebsaj, aplikacioni q\u00eb punon me baz\u00ebn e t\u00eb dh\u00ebnave rindez. M\u00eb pas vazhdon instalimin e komponenteve t\u00eb tjera. Renditja e instalimit t\u00eb paketave dhe hapjes s\u00eb aplikacioneve \u00ebsht\u00eb e p\u00ebrshkruar n\u00eb manifestin e Puppet.<\/p>\n<p>Aplikacionet p\u00ebrdorin t\u00eb dh\u00ebna t\u00eb ndjeshme, si\u00e7 jan\u00eb token\u00ebt, fjal\u00ebkalimet p\u00ebr baz\u00ebn e t\u00eb dh\u00ebnave, t\u00eb gjitha k\u00ebto t\u00ebrhiqen n\u00eb konfigurimin me Puppet master, ku ato ruhen n\u00eb form\u00eb t\u00eb enkriptuar.<\/p>\n<h2>Problemet TFS<\/h2>\n<p>\nPas p\u00ebrcaktimit dhe kuptimit se gjith\u00e7ka funksionon si\u00e7 duhet, vendosa t\u00eb shoh \u00e7far\u00eb po ndodhte me nd\u00ebrtimet n\u00eb TFS n\u00eb p\u00ebrgjith\u00ebsi p\u00ebr departamentin e zhvillimit t\u00eb Windows p\u00ebr projekte t\u00eb tjera \u2014 n\u00ebse po nd\u00ebrtojm\u00eb \/ publikojm\u00eb shpejt, dhe zbulova probleme t\u00eb konsiderueshme me shpejt\u00ebsin\u00eb.<\/p>\n<p>Nj\u00eb nga projektet kryesore nd\u00ebrtohet p\u00ebr 12-15 minuta \u2014 kjo \u00ebsht\u00eb shum\u00eb, nuk mund t\u00eb jetojm\u00eb k\u00ebshtu. Nj\u00eb analiz\u00eb e shpejt\u00eb tregoi nj\u00eb r\u00ebnien t\u00eb tmerrshme n\u00eb I\/O, dhe kjo na masivizet.<\/p>\n<p>Pas nj\u00eb analize komponenti p\u00ebr komponent, identifikova tre pika t\u00eb nxehta. E para \u2014 <b>\u00abKaspersky antivirus\u00bb<\/b>, i cili skanon burimet n\u00eb t\u00eb gjitha agjent\u00ebt Windows Build. Tjetri \u2014 <b>Windows<\/b> <b>Indexer.<\/b> Ai nuk ishte \u00e7aktivizuar dhe gjith\u00e7ka u indeksua n\u00eb koh\u00eb reale n\u00eb agjent\u00ebt Build gjat\u00eb procesit t\u00eb shp\u00ebrndarjes. <\/p>\n<p>T\u00eb tretin \u2014 <b>Npm install. <\/b>Doli se n\u00eb shumic\u00ebn e Pipelines ne p\u00ebrdornim pik\u00ebrisht k\u00ebt\u00eb skenar. Cila \u00ebsht\u00eb e keqja? Procedura e Npm install fillon gjat\u00eb formimit t\u00eb pem\u00ebs s\u00eb var\u00ebsive n\u00eb\u00a0<b>package-lock.json<\/b>, ku regjistrohen versionet e paketave q\u00eb do t\u00eb p\u00ebrdoren p\u00ebr nd\u00ebrtimin e projektit. Minus \u00ebsht\u00eb se Npm install \u00e7do her\u00eb merr versionet aktuale t\u00eb paketave nga interneti, dhe kjo z\u00eb koh\u00eb t\u00eb konsiderueshme n\u00eb rastin e nj\u00eb projekti t\u00eb madh.<\/p>\n<blockquote><p>Krijuesit ndonj\u00ebher\u00eb eksperimentojn\u00eb n\u00eb makin\u00ebn lokale p\u00ebr t\u00eb kontrolluar funksionimin e nj\u00eb pjese t\u00eb ve\u00e7ant\u00eb ose t\u00eb t\u00ebr\u00eb projektit. Ndonj\u00ebher\u00eb ndodhte q\u00eb lokalish everything is cool, por kur e nd\u00ebrtuam, gj\u00ebrat nuk funksiononin. Fillojm\u00eb t\u00eb marrim vesh se cila \u00ebsht\u00eb problemi \u2014 aha, versionet e ndryshme t\u00eb paketave me var\u00ebsi.<\/p><\/blockquote>\n<p><\/p>\n<h3>Zgjidhja<\/h3>\n<p><\/p>\n<ul>\n<li>Burimet n\u00eb p\u00ebrjashtimet AV.\n<\/li>\n<li>\u00c7aktivizimi i indeksimit.\n<\/li>\n<li>Kalimi n\u00eb\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nPikat e forta t\u00eb npm ci jan\u00eb se ne\u00a0<b>nd\u00ebrtojm\u00eb pem\u00ebn e var\u00ebsive nj\u00eb her\u00eb<\/b>, dhe kemi mund\u00ebsin\u00eb t\u00eb ofrojm\u00eb zhvilluesit <b>nj\u00eb list\u00eb aktuale t\u00eb paketave<\/b>, me t\u00eb cil\u00ebn ai mund t\u00eb eksperimentoj\u00eb sa t\u00eb d\u00ebshiroj\u00eb lokalisht. Kjo <b>kursehet koh\u00eb<\/b> p\u00ebr zhvilluesit q\u00eb shkruajn\u00eb kod.<\/p>\n<h3>Konfigurimi<\/h3>\n<p>\nTani pak p\u00ebr konfigurimin e depozit\u00ebs. Historikisht ne p\u00ebrdorim <b>Nexus<\/b> p\u00ebr menaxhimin e depozitave, duke p\u00ebrfshir\u00eb <b>Internal REPO<\/b>. N\u00eb k\u00ebt\u00eb depo t\u00eb brendshme d\u00ebrgohen t\u00eb gjitha komponent\u00ebt q\u00eb ne p\u00ebrdorim p\u00ebr q\u00ebllime t\u00eb brendshme, p\u00ebr shembull, monitorimet e krijuara vet\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core n\u00eb Linux, DevOps n\u00eb maj\u00eb\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe gjithashtu p\u00ebrdorim <b>NuGet<\/b>, pasi ai cache m\u00eb mir\u00eb krahasuar me menaxher\u00ebt e tjer\u00eb t\u00eb paketave.<\/p>\n<h3>Rezultati<\/h3>\n<p>\nPas optimizimit t\u00eb agjent\u00ebve Build, koha mesatare e nd\u00ebrtimit \u00ebsht\u00eb ulur nga 12 minuta n\u00eb 7.<\/p>\n<blockquote><p>N\u00ebse llogaritim t\u00eb gjitha makinat q\u00eb mund t\u00eb p\u00ebrdornim p\u00ebr Windows, por i kaluam n\u00eb Linux n\u00eb k\u00ebt\u00eb projekt, ne kursyem rreth $10,000. Dhe kjo \u00ebsht\u00eb vet\u00ebm p\u00ebr licencat, p\u00ebr m\u00eb tep\u00ebr duke marr\u00eb parasysh mbajtjen \u2014 m\u00eb shum\u00eb.<\/p><\/blockquote>\n<p><\/p>\n<h2>Planet<\/h2>\n<p>\nP\u00ebr kvartalin e ardhsh\u00ebm kemi planifikuar pun\u00ebn n\u00eb optimizimin e shp\u00ebrndarjes s\u00eb kodit.<\/p>\n<p><b>Kalimi n\u00eb nj\u00eb imazh Docker t\u00eb pregatitur<\/b>. TFS \u00ebsht\u00eb nj\u00eb gj\u00eb e shk\u00eblqyer me shum\u00eb plugins q\u00eb lejojn\u00eb integrimin n\u00eb Pipeline, duke p\u00ebrfshir\u00eb nd\u00ebrtimin n\u00ebp\u00ebrmjet nj\u00eb nxit\u00ebsi, le t\u00eb themi, imazhit Docker. Ky nxit\u00ebs do t\u00eb dojemi t\u00eb b\u00ebjm\u00eb n\u00eb at\u00eb t\u00eb djath\u00eb <b>package-lock.json<\/b>. N\u00ebse ndodhi q\u00eb nd\u00ebrron p\u00ebrb\u00ebrja e komponenteve q\u00eb p\u00ebrdoren p\u00ebr nd\u00ebrtimin e projektit \u2013 ne krijojm\u00eb nj\u00eb imazh t\u00eb ri Docker. M\u00eb pas, ky imazh p\u00ebrdoret p\u00ebr t\u00eb shp\u00ebrndar\u00eb nj\u00eb kontejner me aplikacionin e nd\u00ebrtuar. Tani kjo nuk ekziston, por planifikojm\u00eb t\u00eb kalojm\u00eb n\u00eb nj\u00eb arkitektur\u00eb mikrosh\u00ebrbimesh n\u00eb Kubernetes, i cili po zhvillohet aktivisht n\u00eb kompanin\u00eb ton\u00eb dhe p\u00ebr shum\u00eb koh\u00eb ka sh\u00ebrbyer p\u00ebr zgjidhje n\u00eb prodhim.<\/p>\n<h2>CV<\/h2>\n<p>\nI b\u00ebj thirrje t\u00eb gjith\u00ebve t\u00eb heqin dor\u00eb nga Windows, por kjo nuk \u00ebsht\u00eb sepse nuk di ta p\u00ebrgatis. Arsyeja \u00ebsht\u00eb se pjesa m\u00eb e madhe e zgjidhjeve Opensource \u2013 kjo \u00ebsht\u00eb <b>stogu Linux<\/b>. Do t\u00eb kurseni burime <b>n\u00eb m\u00ebnyr\u00eb t\u00eb konsiderueshme.<\/b>Sipas mendimit tim, e ardhmja \u00ebsht\u00eb te zgjidhjet Open Source mbi Linux me nj\u00eb komunitet t\u00eb fuqish\u00ebm.<\/p>\n<p><i>Profili i fol\u00ebsit Aleksand\u00ebr Sin\u00e7inov <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">n\u00eb GitHub<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0\u00ebsht\u00eb nj\u00eb konferenc\u00eb mbi integrimin e proceseve t\u00eb zhvillimit, testimit dhe funksionimit p\u00ebr profesionist\u00eb nga profesionist\u00ebt. Pik\u00ebrisht p\u00ebr k\u00ebt\u00eb arsye, projekti, p\u00ebr t\u00eb cilin foli Aleksandri, \u00ebsht\u00eb realizuar dhe funkcional, dhe n\u00eb dit\u00ebn e prezantimit jan\u00eb b\u00ebr\u00eb dy l\u00ebshime t\u00eb suksesshme. N\u00eb\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf n\u00eb RIT++<\/a><\/noindex> n\u00eb 27 dhe 28 maj do t\u00eb ket\u00eb edhe m\u00eb shum\u00eb raste t\u00eb ngjashme nga praktikuesit. Ka ende koh\u00eb p\u00ebr t\u00eb hipur n\u00eb vagoni i fundit dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">paraqit nj\u00eb raport<\/a><\/noindex> ose me qet\u00ebsi <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">rezervoni<\/a><\/noindex> bileti. Do t\u00eb takohemi n\u00eb Skolkovo!<\/p><\/blockquote>\n<p>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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 mbi Linux, DevOps \u00ebsht\u00eb n\u00eb lart\u00ebsi | ProHoster","description":"Ne zhvilluam DevOps sa mund\u00ebm. Ishin 8 persona dhe Vasja ishte m\u00eb i miri p\u00ebr Windows. Papritur Vasja iku dhe un\u00eb mora nj\u00eb detyr\u00eb p\u00ebr t\u00eb nxjerr\u00eb nj\u00eb projekt t\u00eb ri, i cili ofron zhvillimin n\u00eb Windows.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}