{"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 wie m\u00f6glich entwickelt. Wir waren 8 Personen, und Vasja war der Beste im Bereich Windows. Pl\u00f6tzlich ging Vasja, und ich hatte die Aufgabe, ein neues Projekt zu leiten, das Windows-Entwicklung bereitstellt. Als ich den gesamten Stack der Windows-Entwicklung auf den Tisch legte, wurde mir klar, dass die Situation schmerzhaft war\u2026<\/p>\n<p>So beginnt die Geschichte <b>Alexander Sinchinov<\/b> findet man <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/\">DevOpsConf<\/a><\/noindex>. Als der f\u00fchrende Windows-Spezialist das Unternehmen verlie\u00df, stellte Alexander sich die Frage, was nun zu tun sei. Nat\u00fcrlich auf Linux umsteigen! Alexander wird erz\u00e4hlen, wie es ihm gelungen ist, einen Pr\u00e4zedenzfall zu schaffen und einen Teil der Windows-Entwicklung auf Linux zu \u00fcbertragen, anhand eines Projekts mit 100.000 Endbenutzern.<\/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 gelingt es, Projekte m\u00fchelos in RPM zu liefern, indem man TFS, Puppet und Linux .NET Core nutzt? Wie h\u00e4lt man die Versionskontrolle der Datenbank aufrecht, wenn das Entwicklungsteam zum ersten Mal von Postgres und Flyway h\u00f6rt und die Frist \u00fcbermorgen abl\u00e4uft? Wie integriert man Docker? Wie motiviert man .NET-Entwickler, Windows und Smoothies zugunsten von Puppet und Linux abzulehnen? Wie l\u00f6st man ideologische Konflikte, wenn man Windows in der Produktion weder will noch kann? Dar\u00fcber und \u00fcber Web Deploy, Tests, CI, die Anwendung von TFS in bestehenden Projekten sowie \u00fcber kaputte Kr\u00fccken und funktionierende L\u00f6sungen wird in der Auswertung des Vortrags von Alexander gesprochen.<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, Vasya ist weg, die Aufgabe liegt bei mir, die Entwickler warten mit Forken ungeduldig. Als ich endlich realisierte, dass man Vasya nicht zur\u00fcckholen kann, machte ich mich an die Arbeit. Zun\u00e4chst sch\u00e4tzte ich den Anteil an Windows-VMs in unserem Pool. Die Rechnung fiel nicht zugunsten von Windows aus.<\/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 aktiv DevOps entwickeln, wurde mir klar, dass ich etwas an unserem Ansatz zur Einf\u00fchrung neuer Anwendungen \u00e4ndern musste. Die L\u00f6sung war einfach \u2013 wenn m\u00f6glich, alles auf Linux umzustellen. Google half mir dabei \u2013 zu diesem Zeitpunkt war .NET bereits f\u00fcr Linux portiert, und ich wusste, 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 zahlen\u201c und \u201enicht zahlen\u201c wird die Mehrheit die zweite Option w\u00e4hlen \u2013 so wie ich. Die Lizenz f\u00fcr MSDB kostet etwa 1.000 $, und die Wartung einer Flotte von Windows-VMs summiert sich auf Hunderten von Dollar. F\u00fcr ein gro\u00dfes Unternehmen sind das erhebliche Kosten. Deshalb <b>Einsparungen\u00a0<\/b>\u2014<b> der erste Grund<\/b>. Nicht der wichtigste, aber einer der bedeutenden.<\/p>\n<p>Windows-VMs ben\u00f6tigen mehr Ressourcen als ihre Linux-Geschwister \u2013 <b>sie sind schwerf\u00e4llig<\/b>. Angesichts der Gr\u00f6\u00dfe eines gro\u00dfen Unternehmens haben wir uns f\u00fcr Linux entschieden.<\/p>\n<p><b>Das System l\u00e4sst sich einfach in die bestehende CI integrieren<\/b>. Wir betrachten uns als fortschrittliche DevOps, verwenden Bamboo, Jenkins und GitLab CI, daher l\u00e4uft der Gro\u00dfteil bei uns unter Linux.<\/p>\n<p>Der letzte Grund ist <b>die einfache Wartung. <\/b>Wir mussten die Einstiegsh\u00fcrden f\u00fcr die \u201eWartungsteams\u201c senken \u2013 Leute, die die technische Seite verstehen, f\u00fcr den reibungslosen Betrieb sorgen und die Services der zweiten Linie unterst\u00fctzen. Sie waren bereits mit dem Linux-Stack vertraut, daher f\u00e4llt es ihnen viel leichter, das neue Produkt zu verstehen, zu unterst\u00fctzen und zu warten, als zus\u00e4tzliche Ressourcen aufzuwenden, um sich mit \u00e4hnlichen Funktionen von Windows-Software auseinanderzusetzen.<\/p>\n<h2>Anforderungen<\/h2>\n<p>\nZun\u00e4chst und vor allem \u2013 <b>die Bequemlichkeit der neuen L\u00f6sung f\u00fcr Entwickler<\/b>. Nicht alle waren bereit f\u00fcr Ver\u00e4nderungen, besonders nach dem Wort Linux. Entwickler m\u00f6chten ihr geliebtes Visual Studio, TFS mit automatisierten Tests f\u00fcr Builds und Smoothies. Wie die Auslieferung in die Produktion erfolgt, ist ihnen egal. Deshalb haben wir uns entschieden, den gewohnten Prozess nicht zu \u00e4ndern und alles f\u00fcr die Windows-Entwicklung unver\u00e4ndert zu lassen. <\/p>\n<p>Ein neues Projekt muss <b>in die bestehende CI integriert werden<\/b>. Die Rails waren bereits vorhanden, und die gesamte Arbeit musste unter Ber\u00fccksichtigung der Konfigurationsmanagementparameter, der festgelegten Lieferstandards und der \u00dcberwachungssysteme geleistet werden.<\/p>\n<p><b>Einfache Wartung und Betrieb<\/b>, als Voraussetzung f\u00fcr die minimale Einstiegsh\u00fcrde f\u00fcr alle neuen Teilnehmer aus verschiedenen Abteilungen und dem Supportteam.<\/p>\n<p><b>Die Frist war gestern<\/b>.<\/p>\n<h2>Die Win-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 Funktionen ist, oder dass <b>Entity Framework Core<\/b>\u00a0\u2014 ein Paradies f\u00fcr Entwickler, in dem man sich nicht mit der Erstellung von SQL-Skripten herumschlagen muss, sondern Abfragen in der Datenbank in objektorientierten Begriffen beschreiben kann. Doch als wir den Aktionsplan besprachen, betrachtete ich diesen Stack wie eine sumerische Keilschrift, indem ich nur PostgreSQL und Git verstand.<\/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>, um stark ausgelastete Dienste mit <b>HAProxy<\/b> \u00fcberwachen zu k\u00f6nnen, alles mit Hilfe von <b>Zabbix<\/b>, einem Ensemble <b>Grafana<\/b> und\u00a0<b>Prometheus<\/b>, <b>Jaeger<\/b>, und all das lief auf Hardware\u00a0<b>HP<\/b> c\u00a0<b>ESXi<\/b> findet man\u00a0<b>VMware<\/b>. Jeder kennt es \u2013 ein Klassiker.<\/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 einen Blick darauf werfen und versuchen zu verstehen, was geschah, bevor wir all diese Eingriffe vornahmen.<\/p>\n<h2>Was war<\/h2>\n<p>\nTFS ist ein ziemlich m\u00e4chtiges System, das nicht nur den Code vom Entwickler zur endg\u00fcltigen Produktionsmaschine liefert, sondern auch ein Set f\u00fcr sehr flexible Integration mit verschiedenen Diensten bietet \u2013 um CI auf plattform\u00fcbergreifender Ebene 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 waren das lauter Popup-Fenster. TFS nutzte mehrere Build-Agenten, auf denen zahlreiche Projekte erstellt wurden. In jedem Agenten arbeiteten 3-4 Worker, um Aufgaben parallel zu verteilen 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>Welches Ziel wollten wir erreichen?<\/h2>\n<p>\nWir verwenden TFS f\u00fcr die Lieferung und Entwicklung, w\u00e4hrend die Anwendung auf einem Linux-Anwendungsserver l\u00e4uft, und dazwischen geschieht ein gewisses Zaubern. Diese <b>Magic Box<\/b> ist das Geheimnis der bevorstehenden Arbeit. Bevor ich es in seine Einzelteile zerlege, mache ich einen Schritt zur Seite und sage zwei Worte zur Anwendung.<\/p>\n<h2>Projekt<\/h2>\n<p>\nDie Anwendung bietet Funktionen zur 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 Zugriff, indem er sich mit einem SSL-Zertifikat SHA-2 authentifizierte. Der\u00a0<b>und zweiten<\/b> hatte Zugriff mit Benutzername und Passwort.<\/p>\n<h3>HAProxy<\/h3>\n<p>\nDer n\u00e4chste Client-Anfrage wurde an HAProxy weitergeleitet, der folgende Aufgaben \u00fcbernahm:<\/p>\n<ul>\n<li>prim\u00e4re Authentifizierung;\n<\/li>\n<li>SSL-Terminierung;\n<\/li>\n<li>HTTP-Anfragen optimieren;\n<\/li>\n<li>Anfragen weiterleiten.\n<\/li>\n<\/ul>\n<p>\nDie \u00dcberpr\u00fcfung des Client-Zertifikats erfolgte \u00fcber die Zertifikatskette. Wir sind die <b>Beh\u00f6rde <\/b>und k\u00f6nnen uns das erlauben, da wir selbst die Zertifikate f\u00fcr die Dienstkunden ausstellen.<\/p>\n<p>Beachten Sie den dritten Punkt, darauf kommen wir sp\u00e4ter zur\u00fcck.<\/p>\n<h3>Backend<\/h3>\n<p>\nDas Backend wurde auf Linux geplant. Es interagiert mit der Datenbank, l\u00e4dt die ben\u00f6tigte Liste von Berechtigungen und gew\u00e4hrt anschlie\u00dfend, je nachdem welche Berechtigungen der autorisierte Benutzer hat, den Zugang zum Unterzeichnen von Finanzdokumenten und deren \u00dcbermittlung zur Ausf\u00fchrung oder zur Erstellung eines Berichts.<\/p>\n<h2>Ersparnisse mit HAProxy<\/h2>\n<p>\nNeben den beiden Kontexten, in denen jeder Kunde navigierte, gab es auch einen weiteren Kontext f\u00fcr die Identit\u00e4t. <b>IdentityServer4<\/b> erlaubt die Authentifizierung, ein kostenloses und leistungsstarkes \u00c4quivalent zu <b>ADFS\u00a0<\/b>\u2014<b> Active Directory Federation Services<\/b>.<\/p>\n<p>Die Anfrage in der Identit\u00e4t wurde in mehreren Schritten verarbeitet. Der erste Schritt - <b>einen Client<\/b> <b>ging an das Backend<\/b>, das Daten mit diesem Server austauschte und \u00fcberpr\u00fcfte, ob ein Token f\u00fcr den Client vorlag. Wenn nicht, wurde die Anfrage zur\u00fcck an den Kontext geschickt, von dem sie kam, jedoch mit einem Redirect, und mit dem Redirect ging es zur Identit\u00e4t.<\/p>\n<p>Der zweite Schritt - die Anfrage gelangte <b>zur Anmeldeseite im IdentityServer,<\/b> wo der Client sich registrierte und der so lange erwartete Token in der Datenbank des IdentityServers erschien. <\/p>\n<p>Der dritte Schritt - <b>der Client wurde zur\u00fcckgeleitet. <\/b>im Kontext, aus dem er kam.<\/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\u00fcckfrage wird \u00fcber HTTP zur\u00fcckgegeben.<\/b>Egal wie sehr wir uns mit der Serverkonfiguration bem\u00fchten und die Dokumentation studierten, wir erhielten jedes Mal die urspr\u00fcngliche Clientanfrage mit der URL, die \u00fcber HTTPS kam, w\u00e4hrend IdentityServer denselben Kontext mit HTTP zur\u00fcckgab. Wir waren schockiert! Und haben all dies \u00fcber den Identit\u00e4tskontext auf HAProxy geleitet, wobei wir in den Headern das Protokoll von HTTP auf HTTPS modifizieren mussten. <\/p>\n<p>Was ist das Verbesserung und wo haben wir gespart?<\/p>\n<blockquote><p>Wir haben Geld gespart, indem wir eine kostenlose L\u00f6sung f\u00fcr die Autorisierung der Benutzergruppe verwendet haben, anstatt IdentityServer4 als separate Node in ein eigenes Segment zu bringen, haben wir ihn gemeinsam mit dem Backend auf demselben Server genutzt, auf dem auch das Backend der Anwendung l\u00e4uft.<\/p><\/blockquote>\n<p><\/p>\n<h2>Wie es funktionieren sollte<\/h2>\n<p>\nAlso, wie versprochen \u2013 Magic Box. Wir verstehen bereits, dass wir garantiert in Richtung Linux gehen. Lassen Sie uns die spezifischen 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>Puppet-Manifeste. <\/b>Um die Konfiguration des Dienstes und der Anwendung bereitzustellen und zu verwalten, mussten wir effektive Rezepte erstellen. Das Notizbuch mit dem Bleistift zeigt anschaulich, wie schnell und trotzdem qualitativ hochstehend das umgesetzt wurde.<\/p>\n<p><b>Liefermethode. <\/b>Standardm\u00e4\u00dfig verwenden wir RPM. Jeder versteht, dass das in Linux unverzichtbar ist, doch das Projekt stellte nach dem Build eine Sammlung ausf\u00fchrbarer DLL-Dateien dar. Es waren etwa 150 Dateien, und das Projekt war ziemlich umfangreich. Die einzige sinnvolle L\u00f6sung war, dieses bin\u00e4re Paket in RPM zu verpacken und die Anwendung daraus zu deployen.<\/p>\n<p><b>Versionierung. <\/b>Wir mussten sehr h\u00e4ufig Releases durchf\u00fchren und mussten entscheiden, wie wir den Paketnamen bilden. Dies war eine Frage der Integration mit TFS. Unser Build-Agent war unter Linux. Wenn TFS eine Aufgabe an den Bearbeiter \u2013 Worker \u2013 auf dem Build-Agent sendet, \u00fcbergibt er ihm auch eine Sammlung von Variablen, die in die Umgebung des Bearbeitungsprozesses gelangen. In diesen Umgebungsvariablen befinden sich der Build-Name, die Versionsnummer und weitere Variablen. N\u00e4here Informationen finden Sie im Abschnitt \u201eRPM-Paket erstellen\u201c.<\/p>\n<p><b>TFS-Konfiguration<\/b> Wir haben uns auf die Einstellung der Pipeline konzentriert. Fr\u00fcher haben wir alle Windows-Projekte auf Windows-Agents gesammelt, und jetzt gibt es einen Linux-Agenten \u2013 den Build-Agent, der in die Build-Gruppe integriert werden muss, mit Artefakten angereichert werden sollte, um den Typ der Projekte festzulegen, die auf diesem Build-Agenten erstellt werden, und um die Pipeline entsprechend anzupassen.<\/p>\n<p><b>IdentityServer. <\/b>ADFS ist nicht unser Weg, wir setzen auf Open Source.<\/p>\n<p>Schauen wir uns die Komponenten an.<\/p>\n<h2>Magic Box<\/h2>\n<p>\nEs besteht 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, da wir daf\u00fcr entwickeln \u2013 das ist logisch. Dieser Teil wurde in drei Schritten durchgef\u00fchrt.<\/p>\n<ul>\n<li><b>Worker einrichten<\/b> und nicht nur einen, da eine verteilte Arbeit am Projekt vorgesehen war.\n<\/li>\n<li><b>Installieren von .NET Core 1.x<\/b>. Warum genau 1.x, wenn bereits 2.0 im Standard-Repository verf\u00fcgbar ist? Weil, als wir mit der Entwicklung begannen, die stabile Version 1.09 war und das Projekt beschlossen wurde, es daf\u00fcr zu erstellen.\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 w\u00fcrden, das allen Linux-Hosts zur Verf\u00fcgung steht. Das haben wir auch getan. Auf dem Repository-Server wurde <b>Webhooks<\/b> eingerichtet, der das ben\u00f6tigte RPM-Paket von dem angegebenen Ort herunterlud. Die Version des Pakets wurde dem Build-Agent mitgeteilt.<\/p>\n<p><b>GitLab. <\/b>Achtung! GitLab wird hier nicht von Entwicklern, sondern von der Betriebsabteilung zur Versionskontrolle der Anwendung, zur Versionsverwaltung von Paketen und zur \u00dcberwachung des Zustands aller Linux-Maschinen verwendet. Dort wird auch das Rezept aufbewahrt \u2013 alle Puppet-Manifest-Dateien. <\/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>Lassen Sie uns eintauchen. Wie erfolgt die Lieferung von DLL in RPM?<\/p>\n<h3>Lieferung von DLL in RPM<\/h3>\n<p>\nAngenommen, wir haben einen Rockstar-Entwickler auf .NET. Er verwendet Visual Studio und erstellt einen Release-Branch. Danach l\u00e4dt er diesen in Git hoch, und Git ist hier ein TFS-Objekt, d. h. es handelt sich um 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 \/>\nDaraufhin sieht TFS, dass ein neuer Commit eingeht. Welche Anwendung? In den TFS-Einstellungen gibt es ein Tag, das angibt, \u00fcber welche Ressourcen der jeweilige Build-Agent verf\u00fcgt. In diesem Fall sieht er, dass wir ein .NET Core-Projekt bauen und w\u00e4hlt einen Linux-Build-Agent aus dem Pool aus. <\/p>\n<p>Der Build-Agent erh\u00e4lt die Quellcodes, l\u00e4dt die notwendigen <b>Abh\u00e4ngigkeiten<\/b> aus den .NET-, npm- usw. Repositories herunter und sendet nach dem Bauen der Anwendung und dem anschlie\u00dfenden Verpacken das RPM-Paket in das RPM-Repository.<\/p>\n<p>Andersherum geschieht Folgendes. Der Ingenieur der Betriebsabteilung ist direkt mit dem Rollout des Projekts besch\u00e4ftigt: Er \u00e4ndert die Paketversionen in\u00a0<b>Hiera<\/b> im Repository, wo die Rezeptur der Anwendung gespeichert ist, wonach Puppet <b>Yum<\/b>triggert, das neue Paket aus dem Repository abruft, und die neue Version der Anwendung bereit ist zur Nutzung.<\/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 \/>\nTheoretisch ist alles einfach, aber was passiert intern auf dem eigentlichen Build-Server?<\/p>\n<h3>Verpackung der DLL RPM<\/h3>\n<p>\nDie Quellcodes des Projekts und die Build-Anforderung von TFS wurden erhalten. Der Build-Agent <b>startet den Build des Projekts aus den Quellcodes.<\/b>Das gebaute Projekt ist in Form von vielen <b>DLL-Dateien<\/b>verf\u00fcgbar, die in einem 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 ausgegeben.<\/b> Anschlie\u00dfend initialisiert ein Bash-Skript die Umgebungsvariablen, ermittelt die Build-Version, die Projektversion, den Pfad zum Build-Verzeichnis und startet den RPM-Build. Nach Abschluss des Builds wird das Paket im\u00a0<b>lokalen Repository<\/b>ver\u00f6ffentlicht, das sich auf dem Build-Agent befindet.<\/p>\n<p>Von dort aus wird eine JSON-Anfrage vom Build-Agent an den Server im RPM-Repository <b>gesendet.<\/b> mit der Angabe des Versionsnamens und des Builds. Der Webhook, von dem ich zuvor gesprochen habe, l\u00e4dt dieses Paket aus dem lokalen Repository auf dem Build-Agenten herunter und macht eine neue Version zur Installation verf\u00fcgbar.<\/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 besteht das Paketlieferungsmodell im RPM-Repository so? Warum kann das gebaute Paket nicht sofort ins Repository geschickt werden? Der Grund ist die Sicherheitsanforderung. Dieses Szenario beschr\u00e4nkt die M\u00f6glichkeit einer unbefugten hochladung von RPM-Paketen durch Dritte auf einen Server, der f\u00fcr alle Linux-Maschinen zug\u00e4nglich ist.<\/p>\n<h2>Datenbankversionierung<\/h2>\n<p>\nBeim Konsilium mit der Entwicklung stellte sich heraus, dass die Kollegen n\u00e4her zu MS SQL tendieren, aber in den meisten Non-Windows-Projekten bereits PostgreSQL verwenden. Da wir uns entschieden hatten, auf alles Bezahlte 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 Abschnitt m\u00f6chte ich erl\u00e4utern, wie wir die Datenbankversionierung umgesetzt haben und wie wir zwischen Flyway und Entity Framework Core entschieden haben. Lassen Sie uns ihre Vor- und Nachteile untersuchen.<\/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. Der Vergleich mit Entity Framework Core kann auf anderen Parametern erfolgen \u2013 aus der Sicht der Entwicklerfreundlichkeit. Sie erinnern sich, dass wir dies in den Mittelpunkt gestellt haben, und das Hauptkriterium war, nichts f\u00fcr die Windows-Entwicklung zu ver\u00e4ndern.<\/p>\n<p>F\u00fcr Flyway ben\u00f6tigten wir <b>eine Art Wrapper<\/b>, damit die Leute nicht schreiben mussten <b>SQL-Abfragen<\/b>. Es ist ihnen viel lieber, in OOP-Begriffen zu arbeiten. Wir haben Anleitungen zur Arbeit mit Datenbankobjekten erstellt, der SQL-Befehl wurde formuliert und ausgef\u00fchrt. Die neue Version der Datenbank ist bereit, funktionsf\u00e4hig \u2013 alles funktioniert gut.<\/p>\n<p>Entity Framework Core hat einen Nachteil \u2013 bei hohen Lasten\u00a0<b>generiert es nicht optimale SQL-Abfragen<\/b>, und die Belastung f\u00fcr die Datenbank kann erheblich sein. Da unser Dienst jedoch nicht hochgradig belastet ist und wir die Last nicht in hunderten von RPS messen, haben wir diese Risiken akzeptiert und das Problem an zuk\u00fcnftige Versionen delegiert.<\/p>\n<h3>Vorteile<\/h3>\n<p>\nEntity Framework Core <b>funktioniert sofort und ist f\u00fcr die Entwicklung angenehm<\/b>, w\u00e4hrend Flyway <b>sich leicht in bestehende CI integrieren l\u00e4sst<\/b>. Aber wir machen es ja den Entwicklern bequem :)<\/p>\n<h3>Deployment-Prozedur<\/h3>\n<p>\nPuppet erkennt, dass eine Versions\u00e4nderung f\u00fcr Pakete kommt, unter denen dasjenige zur Migration verantwortlich ist. Zuerst wird das Paket installiert, das die Migrationsskripte und die mit der Datenbank verbundene Funktionalit\u00e4t enth\u00e4lt. Danach wird die Anwendung neu gestartet, die mit der Datenbank arbeitet. Anschlie\u00dfend erfolgt die Installation der verbleibenden Komponenten. Die Reihenfolge der Paketinstallationen und Anwendungsstarts ist im Puppet-Manifest beschrieben.<\/p>\n<p>Anwendungen verwenden sensible Daten wie Tokens und Datenbankpassw\u00f6rter, die alle in der Konfiguration vom Puppet Master abgerufen werden, wo sie verschl\u00fcsselt gespeichert sind.<\/p>\n<h2>TFS-Probleme<\/h2>\n<p>\nNachdem wir uns einig waren und verstanden hatten, dass bei uns wirklich alles funktioniert, beschloss ich, zu \u00fcberpr\u00fcfen, wie es insgesamt um die Builds im TFS f\u00fcr die Win-Entwicklungsabteilung bei anderen Projekten steht \u2013 ob wir schnell sammeln\/releasen k\u00f6nnen oder nicht, und stellte erhebliche Probleme mit der Geschwindigkeit fest.<\/p>\n<p>Eines der Hauptprojekte ben\u00f6tigt 12-15 Minuten zum Build \u2013 das ist zu lange, so kann es nicht weitergehen. Eine schnelle Analyse zeigte einen katastrophalen R\u00fcckgang bei I\/O, und das auf Arrays.<\/p>\n<p>Nach einer komponentengenauen Analyse habe ich drei Brennpunkte identifiziert. Der erste \u2013 <b>\u00abKaspersky Antivirus\u00bb<\/b>, der auf allen Windows Build-Agenten den Quellcode scannt. Der zweite \u2014 <b>Windows<\/b> <b>Indexer.<\/b> Er wurde nicht deaktiviert und w\u00e4hrend des Deployments wurde in Echtzeit alles auf den Build-Agenten indexiert. <\/p>\n<p>Der dritte \u2014 <b>Npm install. <\/b>Es stellte sich heraus, dass wir in den meisten Pipelines genau dieses Skript verwendet haben. Was ist daran schlecht? Der Npm install-Prozess 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 aktuellsten Versionen der Pakete aus dem Internet zieht, und das kann viel Zeit in Anspruch nehmen, besonders bei gro\u00dfen Projekten.<\/p>\n<blockquote><p>Entwickler experimentieren manchmal auf ihrem lokalen Rechner, um die Funktionalit\u00e4t eines einzelnen Teils oder des gesamten Projekts zu \u00fcberpr\u00fcfen. Manchmal kam es vor, dass lokal alles gro\u00dfartig war, aber beim Bauen und Deployen nichts funktionierte. Wir fangen an, das Problem zu analysieren \u2014 aha, verschiedene Versionen der Abh\u00e4ngigkeitspakete.<\/p><\/blockquote>\n<p><\/p>\n<h3>L\u00f6sung<\/h3>\n<p><\/p>\n<ul>\n<li>Quellcode in AV-Ausschl\u00fcssen.\n<\/li>\n<li>Deaktivierung der Indizierung.\n<\/li>\n<li>Wechsel zu\u00a0<b>npm ci<\/b>.\n<\/li>\n<\/ul>\n<p>\nDie Vorteile von npm ci liegen darin, dass wir\u00a0<b>den Abh\u00e4ngigkeitsbaum nur einmal erstellen<\/b>, und wir die M\u00f6glichkeit haben, dem Entwickler <b>eine aktuelle Liste der Pakete zur Verf\u00fcgung zu stellen.<\/b>, mit dem man lokal so viel experimentieren kann, wie man m\u00f6chte. Dies <b>spart Zeit<\/b> f\u00fcr Entwickler, die Code schreiben.<\/p>\n<h3>Konfiguration<\/h3>\n<p>\nJetzt kurz zur Konfiguration des Repositories. Historisch gesehen verwenden wir <b>Nexus<\/b> f\u00fcr die Verwaltung von Repositories, einschlie\u00dflich <b>Internal REPO<\/b>. In dieses interne Repository werden alle Komponenten geliefert, die wir f\u00fcr interne Zwecke verwenden, beispielsweise ma\u00dfgeschneiderte 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 cached.<\/p>\n<h3>Ergebnis<\/h3>\n<p>\nNachdem wir die Build-Agenten optimiert haben, reduzierte sich die durchschnittliche Build-Zeit von 12 Minuten auf 7.<\/p>\n<blockquote><p>Wenn wir alle Maschinen z\u00e4hlen, die wir f\u00fcr Windows h\u00e4tten nutzen k\u00f6nnen, aber in diesem Projekt auf Linux umgestellt haben, haben wir etwa 10.000 $ gespart. Und das ist nur f\u00fcr Lizenzen, wenn wir die Betriebskosten mit einbeziehen, dann noch mehr.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pl\u00e4ne<\/h2>\n<p>\nF\u00fcr das n\u00e4chste Quartal ist die Arbeit an der Optimierung der Bereitstellung von Code eingeplant.<\/p>\n<p><b>Der \u00dcbergang zu einem vorgebauten Docker-Image<\/b>. TFS ist eine gro\u00dfartige Sache mit vielen Plugins, die eine Integration in die Pipeline erm\u00f6glichen, einschlie\u00dflich der Ausl\u00f6sung des Builds eines Docker-Images. Diese Ausl\u00f6sung m\u00f6chten wir f\u00fcr dasjenige <b>package-lock.json<\/b>. Wenn sich die Komponenten, die zur Erstellung des Projekts verwendet werden, irgendwie \u00e4ndern \u2013 stellen wir ein neues Docker-Image zusammen. Dieses wird dann f\u00fcr die Bereitstellung des Containers mit der erstellten Anwendung verwendet. Das gibt es derzeit nicht, aber wir planen, auf eine Microservices-Architektur in Kubernetes umzusteigen, die in unserem Unternehmen aktiv entwickelt wird und seit langem Produktionsl\u00f6sungen unterst\u00fctzt.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>\nIch fordere alle auf, Windows abzulehnen, aber nicht, weil ich es nicht beherrschen kann. Der Grund liegt darin, dass der Gro\u00dfteil der Open-Source-L\u00f6sungen \u2013 das sind <b>Linux-Stacks<\/b>. Damit k\u00f6nnen Sie ordentlich <b>Ressourcen sparen<\/b>. Meiner Meinung nach liegt die Zukunft in 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 Betriebprozessen f\u00fcr Profis von Profis. Genau deshalb wurde das Projekt, \u00fcber das Alexander gesprochen hat, umgesetzt und funktioniert, und am Tag seiner Pr\u00e4sentation wurden zwei erfolgreiche Releases durchgef\u00fchrt. Auf\u00a0<noindex><a rel=\"nofollow\" href=\"http:\/\/devopsconf.io\/moscow-rit\/2019\">DevOps Conf auf RIT++<\/a><\/noindex> wird es am 27. und 28. Mai noch mehr solcher F\u00e4lle von Praktikern geben. Es gibt noch die M\u00f6glichkeit, einzusteigen und <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-rit\">einen Vortrag einreichen<\/a><\/noindex> es sich gem\u00fctlich zu machen. <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/conference\/join\/rit2019.html?popup=3\">ein Ticket zu einem g\u00fcnstigen Preis buchen und sp\u00e4ter bezahlen. Wir freuen uns auf Sie bei HighLoad++, kommen Sie vorbei \u2013 lassen Sie uns reden!<\/a><\/noindex> Ticket. 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 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\/de\/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=\"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. \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\/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 im Einsatz | ProHoster","description":"Wir haben DevOps so gut wir k\u00f6nnen weiterentwickelt. Wir waren acht Leute, und Wassja war der Beste in Windows. Pl\u00f6tzlich ist Wassja gegangen, und ich hatte die Aufgabe, ein neues Projekt f\u00fcr Windows-Entwicklung auf den Weg zu bringen. Als ich den gesamten Stack der Windows-Entwicklung auf den Tisch legte, wurde mir klar, dass die Situation schmerzhaft ist\u2026 So beginnt die Geschichte von Alexander Sinchinov auf der DevOpsConf. Als der leitende Windows-Spezialist das Unternehmen verlie\u00df, stellte sich Alexander die Frage, was nun zu tun sei. Auf Linux umsteigen,","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. \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\/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"},"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}]}}