{"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\/de\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","title":{"rendered":".NET Core auf Linux, DevOps auf dem Vormarsch","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wir haben DevOps so gut wir konnten entwickelt. Wir waren 8 Personen, und Vasja war der Beste bei Windows. Pl\u00f6tzlich ging Vasja, und ich bekam die Aufgabe, ein neues Projekt zu starten, das Windows-Entwicklung liefert. Als ich den gesamten Windows-Entwicklungsstack auf den Tisch ausbreitete, wurde mir klar, dass die Situation schmerzhaft war\u2026<\/p>\n<p>So beginnt die Geschichte <b>Alexander Sinchinov<\/b> auf <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Als der f\u00fchrende Windows-Spezialist die Firma verlie\u00df, fragte sich Alexander, was er nun tun sollte. Nat\u00fcrlich auf Linux umsteigen! Alexander wird erz\u00e4hlen, wie es ihm gelang, einen Pr\u00e4zedenzfall zu schaffen und einen Teil der Windows-Entwicklung auf Linux am Beispiel eines Projekts mit 100.000 Endbenutzern zu migrieren.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/3c944351864df95217e133236542c9b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWie kann man ein Projekt einfach und entspannt in RPM ausliefern, indem man TFS, Puppet und Linux .NET Core verwendet? Wie kann man die Versionierung der Projekt-Datenbank unterst\u00fctzen, wenn die Entwickler zum ersten Mal von Postgres und Flyway h\u00f6ren und die Deadline \u00fcbermorgen ist? Wie integriert man mit Docker? Wie motiviert man .NET-Entwickler, auf Windows und Smoothies zu verzichten zugunsten von Puppet und Linux? Wie l\u00f6st man ideologische Konflikte, wenn man Windows im Produktionsbetrieb nicht mehr unterst\u00fctzen m\u00f6chte? Dar\u00fcber, sowie \u00fcber Web Deploy, Testing, CI, \u00fcber die Praktiken der Nutzung von TFS in bestehenden Projekten und nat\u00fcrlich \u00fcber kaputte Kr\u00fccken und funktionierende L\u00f6sungen wird Alexander in seiner Pr\u00e4sentation sprechen.<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=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nAlso, Vasja ist gegangen, die Aufgabe liegt nun bei mir, die Entwickler warten ungeduldig mit Forken. Als ich endg\u00fcltig realisierte, dass ich Vasja nicht zur\u00fcckbringen kann, machte ich mich an die Arbeit. Zuerst bewertete ich den Anteil der Windows-VMs in unserem Portfolio. Die Bilanz war nicht zu Gunsten von Windows.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/836e47372126b6ba369ac494b91c7d3c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDa wir DevOps aktiv entwickeln, wurde mir klar, dass sich etwas in der Herangehensweise an die Einf\u00fchrung einer neuen Anwendung \u00e4ndern muss. Es gab nur eine L\u00f6sung \u2013 wenn m\u00f6glich, alles auf Linux zu portieren. Google half mir \u2013 zu diesem Zeitpunkt war .NET bereits f\u00fcr Linux portiert, und ich begriff, dass dies die L\u00f6sung ist!<\/p>\n<h2>Warum .NET Core in Verbindung mit Linux?<\/h2>\n<p>\nEs gab mehrere Gr\u00fcnde daf\u00fcr. Zwischen \u201eGeld ausgeben\u201c und \u201ekein Geld ausgeben\u201c w\u00fcrden die meisten die zweite Option w\u00e4hlen \u2013 so wie ich. Eine Lizenz f\u00fcr MSDB kostet etwa 1.000 $. Die Wartung eines Parks von Windows-VMs bel\u00e4uft sich auf Hunderte Dollar. F\u00fcr ein gro\u00dfes Unternehmen sind das erhebliche Kosten. Daher <b>Einsparungen\u00a0<\/b>\u2014<b> der erste Grund<\/b>. Nicht der wichtigste, aber einer der gewichtigen.<\/p>\n<p>Windows-VMs ben\u00f6tigen mehr Ressourcen als ihre Linux-Pendants \u2013 <b>sie sind schwerf\u00e4llig<\/b>. Angesichts des Umfangs eines gro\u00dfen Unternehmens haben wir Linux ausgew\u00e4hlt.<\/p>\n<p><b>Das System l\u00e4sst sich einfach in die bestehende CI integrieren<\/b>. Wir betrachten uns als fortschrittliche DevOps-Profis, nutzen Bamboo, Jenkins und GitLab CI, daher l\u00e4uft der Gro\u00dfteil bei uns auf Linux.<\/p>\n<p>Der letzte Grund ist <b>die bequeme Wartung. <\/b>Wir mussten die Einstiegsh\u00fcrde f\u00fcr die \u201eWartenden\u201c senken \u2013 die Jungs, die die technische Seite verstehen, f\u00fcr die Betriebssicherheit sorgen und die Dienste der zweiten Linie betreuen. Sie waren bereits mit dem Linux-Stack vertraut, daher fiel es ihnen viel einfacher, das neue Produkt zu verstehen, zu unterst\u00fctzen und zu warten, als zus\u00e4tzliche Ressourcen aufzuwenden, um \u00e4hnliche Funktionen von Software f\u00fcr die Windows-Plattform zu verstehen.<\/p>\n<h2>Anforderungen<\/h2>\n<p>\nDas erste und wichtigste ist <b>der Komfort der neuen L\u00f6sung f\u00fcr die Entwickler<\/b>. Nicht alle von ihnen waren bereit f\u00fcr Ver\u00e4nderungen, besonders nach dem Wort Linux. Die Entwickler wollen ihr geliebtes Visual Studio, TFS mit automatisierten Tests f\u00fcr die Builds und Smoothies. Wie die Lieferung in die Produktion erfolgt \u2013 es interessiert sie nicht. Deshalb haben wir beschlossen, den gewohnten Prozess nicht zu \u00e4ndern und alles f\u00fcr die Windows-Entwicklung unver\u00e4ndert zu lassen. <\/p>\n<p>Das neue Projekt muss <b>in die bestehende CI integriert werden<\/b>. Die Rails waren bereits vorhanden, und die gesamte Arbeit musste unter Ber\u00fccksichtigung der Parameter des Configuration Management Systems, der angenommenen Bereitstellungsstandards und der \u00dcberwachungssysteme durchgef\u00fchrt werden.<\/p>\n<p><b>Die Einfachheit in Wartung und Betrieb<\/b>, als Bedingung f\u00fcr die minimale Einstiegsh\u00fcrde f\u00fcr alle neuen Teilnehmer aus verschiedenen Abteilungen und dem Wartungsservice.<\/p>\n<p><b>Die Frist war gestern<\/b>.<\/p>\n<h2>Die Windows-Entwicklungsgruppe<\/h2>\n<p>\nWoran hat das Windows-Team dann gearbeitet?<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/6e6e128ef3d49410c260d05114f819a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJetzt kann ich mit Zuversicht sagen, dass <b>IdentityServer4<\/b>\u00a0eine gro\u00dfartige kostenlose Alternative zu ADFS mit \u00e4hnlichen M\u00f6glichkeiten ist, oder dass <b>Entity Framework Core<\/b>\u00a0ein Paradies f\u00fcr Entwickler ist, wo man sich nicht um das Schreiben von SQL-Skripten k\u00fcmmern muss, sondern Abfragen in der Datenbank in objektorientierten Begriffen beschreibt. Aber damals, bei der Diskussion des Aktionsplans, sah ich diesen Stack wie sumerische Keilschrift an, wobei ich nur PostgreSQL und Git kannte.<\/p>\n<p>Zu diesem Zeitpunkt verwendeten wir aktiv <b>Puppet<\/b> als Konfigurationsmanagementsystem. In den meisten unserer Projekte setzten wir <b>GitLab CI<\/b>, <b>Elastic<\/b>, balancierten stark ausgelastete Dienste mit Hilfe von <b>HAProxy,<\/b> \u00fcberwachten alles mit Hilfe von <b>Zabbix<\/b>, einer Kombination mit <b>Grafana<\/b> und\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, und das Ganze lief auf Hardware von\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> auf\u00a0<b>VMware<\/b>. Allen bekannt \u2013 Klassiker der Branche.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/f4ffcac7a7fbb4fa48d47f07bed52610.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLass uns sehen und versuchen zu verstehen, was passiert ist, bevor wir all diese Eingriffe vorgenommen haben.<\/p>\n<h2>Was war<\/h2>\n<p>\nTFS ist ein ziemlich m\u00e4chtiges System, das nicht nur den Code vom Entwickler zur Produktionsmaschine bringt, sondern auch ein Set f\u00fcr eine sehr flexible Integration mit verschiedenen Dienstleistungen bietet \u2013 um CI auf plattform\u00fcbergreifendem Niveau zu gew\u00e4hrleisten.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/ea448b38e321a8350468d69f3e45e429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFr\u00fcher war es eine ganze Reihe von Fenstern. TFS verwendete mehrere Build-Agenten, auf denen viele Projekte gebaut wurden. Jeder Agent hatte 3-4 Worker, um Aufgaben parallel zu bearbeiten und den Prozess zu optimieren. Danach lieferte TFS gem\u00e4\u00df den Release-Pl\u00e4nen den frisch gebackenen Build auf dem Windows-Anwendungsserver aus.<\/p>\n<h2>Wohin wollten wir gelangen<\/h2>\n<p>\nF\u00fcr die Bereitstellung und Entwicklung verwenden wir TFS, und die Anwendung l\u00e4uft auf einem Linux-Anwendungsserver, dazwischen liegt eine Art Magie. Diese <b>Magic Box<\/b> ist die Essenz der bevorstehenden Arbeit. Bevor ich es in seine Teile zerlege, mache ich einen Schritt zur Seite und sage zwei Worte \u00fcber die Anwendung.<\/p>\n<h2>Projekt<\/h2>\n<p>\nDie Anwendung bietet Funktionalit\u00e4t f\u00fcr die Verwaltung von prepaid Karten. <\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/c93aa67b340c45ad279330466fc4f776.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Client<\/h3>\n<p>\nEs gab zwei Arten von Benutzern. <b>Erster<\/b> erhielt Zugang, indem er sich mit einem SSL-Zertifikat SHA-2 authentifizierte. Der\u00a0<b>zweiten<\/b> hatte Zugang \u00fcber Benutzername und Passwort.<\/p>\n<h3>HAProxy<\/h3>\n<p>\nDann gelangte die Kundenanfrage zu HAProxy, das folgende Aufgaben l\u00f6ste:<\/p>\n<ul>\n<li>Prim\u00e4rautorisierung;\n<\/li>\n<li>SSL-Terminierung;\n<\/li>\n<li>Tuning von HTTP-Anfragen;\n<\/li>\n<li>Anfragenweiterleitung.\n<\/li>\n<\/ul>\n<p>\nDie \u00dcberpr\u00fcfung des Kunden-Zertifikats erfolgte \u00fcber die Kette. Wir sind <b>Beh\u00f6rde <\/b>und k\u00f6nnen uns das erlauben, da wir selbst die Zertifikate an die Kunden des Dienstes ausstellen.<\/p>\n<p>Bitte beachten Sie den dritten Punkt, darauf kommen wir sp\u00e4ter zur\u00fcck.<\/p>\n<h3>Backend<\/h3>\n<p>\nDas Backend sollte auf Linux entwickelt werden. Das Backend interagiert mit der Datenbank, l\u00e4dt die erforderliche Liste von Berechtigungen und stellt dann, abh\u00e4ngig von den Berechtigungen des authentifizierten Benutzers, den Zugang zum Unterzeichnen von Finanzdokumenten und deren Einreichung zur Ausf\u00fchrung oder zur Generierung eines Berichts zur Verf\u00fcgung.<\/p>\n<h2>Einsparungen mit HAProxy<\/h2>\n<p>\nNeben den zwei Kontexten, durch die jeder der Clients agierte, gab es auch den Kontext Identity. <b>IdentityServer4<\/b> der genau die Authentifizierung erm\u00f6glicht, ist ein kostenloses und leistungsstarkes Pendant zu <b>ADFS\u00a0<\/b>\u2014<b> Active Directory Federation Services<\/b>.<\/p>\n<p>Die Anfrage an Identity wurde in mehreren Schritten bearbeitet. Der erste Schritt \u2013 <b>Client<\/b> <b>gelangte ins Backend<\/b>, der mit diesem Server Daten austauschte und \u00fcberpr\u00fcfte, ob ein Token f\u00fcr den Client vorhanden war. Wenn er es nicht fand, wurde die Anfrage zur\u00fcck an den Kontext geschickt, von dem sie gekommen war, jedoch bereits mit Redirect, und der Redirect ging auf identity.<\/p>\n<p>Der zweite Schritt \u2013 die Anfrage landete <b>auf der Anmeldeseite im IdentityServer,<\/b> wo der Client sich registrierte, und in der Datenbank des IdentityServers erschien das lang ersehnte Token. <\/p>\n<p>Der dritte Schritt \u2013 <b>der Client wurde zur\u00fcckgeleitet <\/b>zum Kontext, von dem er gekommen war.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/e052c408d67485ab9aa10d0fd25df57e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIdentityServer4 hat eine Besonderheit: <b>die Antwort auf die R\u00fcckanfrage wird \u00fcber HTTP zur\u00fcckgegeben<\/b>. So sehr wir auch mit der Serverkonfiguration k\u00e4mpften, wie sehr wir uns auch mit der Dokumentation besch\u00e4ftigten, jedes Mal erhielten wir die urspr\u00fcngliche Anfrage des Clients mit der URL, die \u00fcber HTTPS kam, w\u00e4hrend der IdentityServer denselben Kontext zur\u00fcckgab, jedoch mit HTTP. Wir waren schockiert! Und wir haben all das \u00fcber den Identity-Kontext auf HAProxy weitergeleitet, und in den Headern mussten wir das Protokoll von HTTP auf HTTPS \u00e4ndern. <\/p>\n<p>Was ist die Verbesserung und wo haben wir gespart?<\/p>\n<blockquote><p>Wir haben Geld gespart, indem wir eine kostenlose L\u00f6sung f\u00fcr die Autorisierung einer Benutzergruppe verwendet haben, Ressourcen, da wir den IdentityServer4 nicht als separaten Knoten in ein separates Segment ausgegliedert haben, sondern ihn gemeinsam mit dem Backend auf demselben Server genutzt haben, auf dem das Backend der Anwendung l\u00e4uft.<\/p><\/blockquote>\n<p><\/p>\n<h2>So sollte es funktionieren<\/h2>\n<p>\nAlso, wie ich versprochen habe \u2013 der Magic Box. Wir verstehen bereits, dass wir garantiert in Richtung Linux gehen. Lassen Sie uns konkrete Aufgaben formulieren, die gel\u00f6st werden mussten.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/cc59632aa0e5c65fe0efc754311ecf5e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Manifest von Puppet. <\/b>Um die Konfiguration des Dienstes und der Anwendung bereitzustellen und zu verwalten, mussten gro\u00dfartige Rezepte geschrieben werden. Der kleine Zettel mit dem Bleistift zeigt eindrucksvoll, wie schnell und qualitativ das umgesetzt wurde.<\/p>\n<p><b>Liefermethode. <\/b>Der Standard ist RPM. Alle verstehen, dass man in Linux nicht ohne ihn auskommt, aber das Projekt bestand nach der Erstellung aus einem Satz ausf\u00fchrbarer DLL-Dateien. Es waren etwa 150, das Projekt ist recht schwer. Die einzige harmonische L\u00f6sung bestand darin, dieses Bin\u00e4rzeug in RPM zu verpacken und die Anwendung daraus zu entpacken.<\/p>\n<p><b>Versionierung. <\/b>Wir mussten sehr h\u00e4ufig ver\u00f6ffentlichen und es war notwendig, eine Methode zur Bildung des Paketnamens zu finden. Dies ist eine Frage der Integration mit TFS. Unser Build-Agent lief unter Linux. Wenn TFS eine Aufgabe an den Bearbeiter \u2013 Worker \u2013 auf dem Build-Agent sendet, \u00fcbergibt er auch eine Sammlung von Variablen, die in die Umgebung des Prozesses des Bearbeiters gelangen. In diesen Umgebungsvariablen wird der Name des Builds, die Version und andere Variablen \u00fcbergeben. N\u00e4here Informationen dazu im Abschnitt \u201eRPM-Paketbau\u201c.<\/p>\n<p><b>TFS-Einstellungen<\/b> beschr\u00e4nkten sich auf die Konfiguration der Pipeline. Fr\u00fcher haben wir alle Windows-Projekte auf Windows-Agenten gebaut, jetzt haben wir einen Linux-Agenten \u2013 Build-Agent, den wir in die Build-Gruppe einf\u00fcgen, mit Artefakten anreichern, angeben m\u00fcssen, welche Art von Projekten auf diesem Build-Agent gebaut werden sollen, und die Pipeline irgendwie modifizieren m\u00fcssen.<\/p>\n<p><b>IdentityServer. <\/b>ADFS ist nicht unser Weg, wir setzen auf Open Source.<\/p>\n<p>Lass uns die Komponenten durchgehen.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nBesteht aus vier Teilen.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/22ea63bcf184046c15e034ec093352bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Linux Build-Agent. <\/b>Linux, weil wir daf\u00fcr bauen \u2013 logisch. Dieser Teil wurde in drei Schritten durchgef\u00fchrt.<\/p>\n<ul>\n<li><b>Worker konfigurieren<\/b> und nicht nur einen, da eine verteilte Arbeit am Projekt vorgesehen war.\n<\/li>\n<li><b>Installiere .NET Core 1.x<\/b>. Warum gerade 1.x, wenn bereits 2.0 im Standardrepository verf\u00fcgbar ist? Weil zur Zeit des Anfangs der Entwicklung die stabile Version 1.09 war und beschlossen wurde, das Projekt darauf aufzubauen.\n<\/li>\n<li><b>Git 2.x<\/b>.\n<\/li>\n<\/ul>\n<p>\n<b>RPM-Repository. <\/b>RPM-Pakete mussten irgendwo gespeichert werden. Es wurde angenommen, dass wir dasselbe Unternehmens-RPM-Repository verwenden, das f\u00fcr alle Linux-Hosts zug\u00e4nglich ist. So haben wir es auch gemacht. Auf dem Repository-Server ist konfiguriert <b>webhook<\/b> das die ben\u00f6tigten RPM-Pakete aus dem angegebenen Ort herunterl\u00e4dt. Die Versionsnummer des Pakets wurde dem Webhook vom Build-Agent mitgeteilt.<\/p>\n<p><b>GitLab betroffen hat. <\/b>Achtung! GitLab wird hier nicht von Entwicklern, sondern von der Betriebsabteilung zur Versionskontrolle der Anwendung, der Paketversionen, zur \u00dcberwachung des Status aller Linux-Maschinen verwendet, und darin wird das Rezept aufbewahrt \u2013 alle Puppet-Manifestdateien. <\/p>\n<p><b>Puppet<\/b>\u00a0\u2013 kl\u00e4rt alle strittigen Punkte und liefert genau die Konfiguration, die wir aus GitLab m\u00f6chten.<\/p>\n<p>Lass uns eintauchen. Wie erfolgt die Lieferung der DLL in RPM?<\/p>\n<h3>Lieferung von DLL in RPM<\/h3>\n<p>\nAngenommen, wir haben einen Rock-Star in der .NET-Entwicklung. Er verwendet Visual Studio und erstellt einen Release-Zweig. Danach l\u00e4dt er ihn in Git hoch, und Git ist hier eine TFS-Entit\u00e4t, das hei\u00dft, es ist das Repository der Anwendung, mit dem der Entwickler arbeitet.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/978240886981d41fc6d7b17d0a4fcb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNachdem TFS sieht, dass ein neuer Commit eingegangen ist. Welche Anwendung? In den TFS-Einstellungen gibt es ein Tag, welche Ressourcen der jeweilige Build-Agent hat. In diesem Fall sieht er, dass wir ein .NET Core-Projekt erstellen und w\u00e4hlt den Linux-Build-Agent aus dem Pool aus. <\/p>\n<p>Der Build-Agent erh\u00e4lt die Quellcodes, l\u00e4dt die notwendigen <b>dependencies<\/b> aus dem .NET-Repository, npm usw. herunter, und nach dem Erstellen der Anwendung und der anschlie\u00dfenden Verpackung sendet er das RPM-Paket an das RPM-Repository.<\/p>\n<p>Auf der anderen Seite passiert Folgendes. Der Ingenieur der Betriebstechnik besch\u00e4ftigt sich direkt mit dem Rollout des Projekts: Er \u00e4ndert die Paketversionen in\u00a0<b>Hiera<\/b> im Repository, wo die Rezeptur der Anwendung gespeichert ist, woraufhin Puppet <b>Yum<\/b>ausl\u00f6st, das neue Paket aus dem Repository abruft und die neue Version der Anwendung zur Verwendung bereit ist.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/6c2db3ce4bd7d4268e88c6c3d3ecbeba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAuf Worte klingt alles einfach, aber was passiert wirklich im Build-Agent?<\/p>\n<h3>Verpackung der DLL RPM<\/h3>\n<p>\nDie Quellcodes des Projekts sind erhalten und die Aufgabe zur Erstellung kommt von TFS. Der Build-Agent <b>startet den Build des Projekts aus den Quellcodes.<\/b>Das gebaute Projekt steht in Form einer Vielzahl von <b>DLL-Dateien<\/b>, die in ein ZIP-Archiv verpackt sind, um die Belastung des Dateisystems zu reduzieren.<\/p>\n<p>Das ZIP-Archiv wird <b>in das Verzeichnis des RPM-Paket-Builds verschoben.<\/b> Danach initialisiert ein Bash-Skript die Umgebungsvariablen, ermittelt die Build-Version, die Projektversion, den Pfad zum Build-Verzeichnis und startet RPM-build. Nach Abschluss des Builds wird das Paket im\u00a0<b>lokalen Repository<\/b>, das sich auf dem Build-Agent befindet, ver\u00f6ffentlicht.<\/p>\n<p>Dann wird ein JSON-Request vom Build-Agent an den Server im RPM-Repository <b>gesendet,<\/b> mit Angabe des Namens der Version und des Builds. Der Webhook, von dem ich zuvor sprach, l\u00e4dt dieses Paket aus dem lokalen Repository des Build-Agents herunter und stellt den neuen Build zur Installation bereit.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/b69cacdadd171f4cbc9913b2ff4b7a79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWarum gerade ein solches Modell zur Paketlieferung im RPM-Repository? Warum kann das gebaute Paket nicht sofort ins Repository gesendet werden? Das liegt daran, dass dieses Verfahren zur Sicherstellung der Sicherheit dient. Ein solches Szenario beschr\u00e4nkt die M\u00f6glichkeit f\u00fcr Unbefugte, RPM-Pakete auf den Server hochzuladen, der f\u00fcr alle Linux-Maschinen zug\u00e4nglich ist.<\/p>\n<h2>Versionierung der Datenbank<\/h2>\n<p>\nIn einem Konsil mit der Entwicklung stellte sich heraus, dass die Leute MS SQL bevorzugen, aber in den meisten Non-Windows-Projekten bereits PostgreSQL intensiv genutzt wurde. Da wir uns bereits entschieden hatten, auf alles Kostenpflichtige zu verzichten, begannen wir auch hier, PostgreSQL zu verwenden.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/6b6c081344f2408c399248a70a63dccc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn diesem Teil m\u00f6chte ich erz\u00e4hlen, wie wir die Versionierung der Datenbank durchgef\u00fchrt haben und wie wir zwischen Flyway und Entity Framework Core ausgew\u00e4hlt haben. Lassen Sie uns ihre Vor- und Nachteile betrachten.<\/p>\n<h3>Nachteile<\/h3>\n<p>\nFlyway funktioniert nur in eine Richtung, wir\u00a0<b>k\u00f6nnen nicht zur\u00fcckrollen<\/b>\u00a0\u2014 das ist ein wesentlicher Nachteil. Man kann jedoch andere Parameter wie die Benutzerfreundlichkeit des Entwicklers mit Entity Framework Core vergleichen. Sie erinnern sich, dass wir dies in den Vordergrund gestellt haben, und das Hauptkriterium war, nichts f\u00fcr die Windows-Entwicklung zu \u00e4ndern.<\/p>\n<p>F\u00fcr Flyway ben\u00f6tigten wir <b>eine Art Wrapper<\/b>, damit die Leute nicht <b>SQL-Anfragen<\/b>. Es ist ihnen viel lieber, in objektorientierten Begriffen zu arbeiten. Sie schrieben Anleitungen zur Arbeit mit Datenbankobjekten, die SQL-Abfrage wurde gebildet und ausgef\u00fchrt. Die neue Version der Datenbank ist bereit, sie hat funktioniert \u2013 alles gut, alles l\u00e4uft.<\/p>\n<p>Entity Framework Core hat einen Nachteil \u2013 unter hoher Last\u00a0<b>generiert es nicht optimale SQL-Abfragen<\/b>, und die Belastung der Datenbank kann erheblich sein. Da wir jedoch keinen hoch ausgelasteten Dienst haben, messen wir die Belastung nicht in Hunderten von RPS, haben wir diese Risiken akzeptiert und das Problem an zuk\u00fcnftige uns delegiert.<\/p>\n<h3>Vorteile<\/h3>\n<p>\nEntity Framework Core <b>arbeitet out-of-the-box und ist f\u00fcr die Entwicklung praktisch<\/b>, w\u00e4hrend Flyway <b>einfach in das bestehende CI integriert werden kann<\/b>. Aber wir machen es den Entwicklern bequem :)<\/p>\n<h3>Der Bereitstellungsprozess<\/h3>\n<p>\nPuppet sieht, dass eine \u00c4nderung der Paketversionen kommt, unter denen dasjenige ist, das f\u00fcr die Migration verantwortlich ist. Zuerst wird das Paket installiert, das die Migrationsskripte und die mit der Datenbank verkn\u00fcpfte Funktionalit\u00e4t enth\u00e4lt. Danach wird die Anwendung, die mit der Datenbank arbeitet, neu gestartet. Dann erfolgt die Installation der verbleibenden Komponenten. Die Reihenfolge der Paketinstallation und des Anwendungstarts ist im Puppet-Manifest beschrieben.<\/p>\n<p>Die Anwendungen verwenden sensible Daten wie Tokens, Datenbankpassw\u00f6rter, all dies wird im Konfigurationsfile mit dem Puppet Master abgerufen, wo sie in verschl\u00fcsselter Form gespeichert sind.<\/p>\n<h2>Probleme mit TFS<\/h2>\n<p>\nNachdem wir uns entschieden und verstanden haben, dass alles bei uns wirklich funktioniert, beschloss ich, mir anzusehen, was mit den Builds in TFS im Allgemeinen f\u00fcr die Abteilung f\u00fcr Windows-Entwicklung bei anderen Projekten los ist - ob wir schnell bauen\/releasen oder nicht, und ich entdeckte erhebliche Probleme mit der Geschwindigkeit.<\/p>\n<p>Eines der Hauptprojekte ben\u00f6tigt 12-15 Minuten zum Bauen \u2013 das ist zu lang, so kann es nicht weitergehen. Eine schnelle Analyse zeigte einen schrecklichen R\u00fcckgang bei I\/O, und das bei gro\u00dfen Arrays.<\/p>\n<p>Nach einer komponentenweisen Analyse identifizierte ich drei Brennpunkte. Der erste \u2013 <b>\u201eKaspersky Antivirus\u201c<\/b>, der auf allen Windows-Build-Agenten den Quellcode scannt. Zweiter\u00a0\u2014 <b>Windows<\/b> <b>Indexer.<\/b> Er wurde nicht deaktiviert, und auf den Build-Agenten wurde in Echtzeit alles im Deploy-Prozess indexiert. <\/p>\n<p>Dritter\u00a0\u2014 <b>Npm install. <\/b>Es stellte sich heraus, dass wir in den meisten Pipelines genau dieses Skript verwendet haben. Was ist daran schlecht? Das Npm install Verfahren wird beim Erstellen des Abh\u00e4ngigkeitsbaums in\u00a0<b>package-lock.json<\/b>, wo die Versionen der Pakete festgehalten werden, die f\u00fcr den Bau des Projekts verwendet werden. Der Nachteil ist, dass Npm install jedes Mal die aktuellen Versionen der Pakete aus dem Internet holt, und das kostet viel Zeit bei gro\u00dfen Projekten.<\/p>\n<blockquote><p>Entwickler experimentieren manchmal auf ihrer lokalen Maschine, um den Betrieb eines bestimmten Teils oder des gesamten Projekts zu \u00fcberpr\u00fcfen. Manchmal stellte sich heraus, dass lokal alles toll war, aber beim Bauen und Ausrollen funktionierte nichts. Wir fangen an zu kl\u00e4ren, wo das Problem liegt\u00a0\u2014 aha, verschiedene Versionen der Abh\u00e4ngigkeits-Pakete.<\/p><\/blockquote>\n<p><\/p>\n<h3>L\u00f6sung<\/h3>\n<p><\/p>\n<ul>\n<li>Quellcodes in den Ausnahmen AV.\n<\/li>\n<li>Deaktivierung der Indizierung.\n<\/li>\n<li>\u00dcberwechseln zu\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nDie Vorteile von npm ci bestehen darin, dass wir\u00a0<b>den Abh\u00e4ngigkeitsbaum einmalig erstellen<\/b>, und die M\u00f6glichkeit erhalten, dem Entwickler <b>die aktuelle Liste der Pakete<\/b>, mit der er lokal beliebig experimentieren kann, zur Verf\u00fcgung zu stellen. Das <b>spart Zeit<\/b> f\u00fcr die Entwickler, die Code schreiben.<\/p>\n<h3>Konfiguration<\/h3>\n<p>\nJetzt ein wenig zur Konfiguration des Repositories. Historisch gesehen verwenden wir <b>Nexus<\/b> f\u00fcr das Repository-Management, einschlie\u00dflich <b>Internal REPO<\/b>. In dieses interne Repository werden alle Komponenten geliefert, die wir f\u00fcr interne Zwecke verwenden, wie zum Beispiel selbstgeschriebene Monitoring-Tools.<\/p>\n<p><img decoding=\"async\" alt=\".NET Core auf Linux, DevOps auf dem Vormarsch\" src=\"\/wp-content\/uploads\/2019\/04\/147d7e80bf20e03a232f8b533be316eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir verwenden auch <b>NuGet<\/b>, da es im Vergleich zu anderen Paketmanagern besser cacht.<\/p>\n<h3>Ergebnis<\/h3>\n<p>\nNachdem wir die Build-Agenten optimiert haben, hat sich die durchschnittliche Build-Zeit von 12 Minuten auf 7 Minuten verk\u00fcrzt.<\/p>\n<blockquote><p>Wenn man alle Maschinen z\u00e4hlt, die wir f\u00fcr Windows h\u00e4tten verwenden k\u00f6nnen, aber in diesem Projekt auf Linux umgestellt haben, haben wir etwa 10.000 Dollar gespart. Und das nur bei Lizenzen, wenn man die Betriebskosten ber\u00fccksichtigt, w\u00e4re es mehr.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pl\u00e4ne<\/h2>\n<p>\nF\u00fcr das n\u00e4chste Quartal haben wir die Arbeit an der Optimierung der Codeauslieferung eingeplant.<\/p>\n<p><b>\u00dcberwechseln zu einem vorgefertigten Docker-Abbild<\/b>. TFS ist ein tolles Tool mit vielen Plugins, die eine Integration in die Pipeline erm\u00f6glichen, einschlie\u00dflich dem Bauen per Trigger, beispielsweise f\u00fcr Docker-Images. Diesen Trigger m\u00f6chten wir f\u00fcr genau diesen <b>package-lock.json<\/b>. Wenn sich die Zusammensetzung der Komponenten, die f\u00fcr den Aufbau des Projekts verwendet werden, aus irgendeinem Grund \u00e4ndert \u2013 erstellen wir ein neues Docker-Image. Dieses wird anschlie\u00dfend f\u00fcr die Bereitstellung des Containers mit der gebauten Anwendung verwendet. Momentan gibt es das nicht, aber wir planen, auf eine Mikrodienstarchitektur in Kubernetes umzusteigen, die aktiv in unserem Unternehmen entwickelt wird und seit langem Produktionsl\u00f6sungen bereitstellt.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>\nIch fordere alle auf, Windows wegzuwerfen, aber das liegt nicht daran, dass ich nicht wei\u00df, wie man es vorbereitet. Der Grund ist, dass der gr\u00f6\u00dfte Teil der Opensource-L\u00f6sungen \u2013 das ist <b>der Linux-Stack<\/b>. Sie werden gut <b>Ressourcen sparen<\/b>. Meiner Meinung nach geh\u00f6rt die Zukunft den Open Source-L\u00f6sungen auf Linux mit einer starken Community.<\/p>\n<p><i>Das Profil des Sprechers Alexander Sinchinov <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alextuning\">auf GitHub<\/a><\/noindex>.<\/i><\/p>\n<blockquote><p><noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOps Conf<\/a><\/noindex>\u00a0ist eine Konferenz zur Integration von Entwicklungs-, Test- und Betriebsprozessen f\u00fcr Professionals von Professionals. Genau deshalb ist das Projekt, \u00fcber das Alexander berichtet hat, realisiert und funktioniert, und am Tag seines Vortrags wurden zwei erfolgreiche Releases durchgef\u00fchrt. Auf\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf bei RIT++<\/a><\/noindex> werden am 27. und 28. Mai noch mehr solcher F\u00e4lle von Praktikern pr\u00e4sentiert. Sie k\u00f6nnen auch im letzten Moment auf den Zug aufspringen und <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">einen Vortrag einreichen<\/a><\/noindex> oder in Ruhe <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">ein Ticket reservieren.<\/a><\/noindex> Wir sehen uns in Skolkovo!<\/p><\/blockquote>\n<p>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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 auf Linux, DevOps auf dem Vormarsch | ProHoster","description":"Wir haben DevOps so gut wie m\u00f6glich weiterentwickelt. Wir waren zu acht, und Wassja war der Beste in Windows. Pl\u00f6tzlich ging Wassja, und ich hatte die Aufgabe, ein neues Projekt auf die Beine zu stellen, das Windows-Entwicklung liefert.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/net-core-na-linux-devops-na-kone","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/32217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32217"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24043"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}