{"id":31377,"date":"2019-10-31T21:40:57","date_gmt":"2019-10-31T18:40:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\/"},"modified":"2019-10-31T21:40:57","modified_gmt":"2019-10-31T18:40:57","slug":"nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Unsere Umsetzung von Continuous Deployment auf der Plattform des Kunden","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bei True Engineering haben wir den Prozess der kontinuierlichen Bereitstellung von Updates auf die Server des Kunden eingerichtet und m\u00f6chten diese Erfahrung teilen.<\/p>\n<p>Zun\u00e4chst haben wir ein Online-System f\u00fcr den Kunden entwickelt und es in einem eigenen Kubernetes-Cluster bereitgestellt. Nun ist unsere hochverf\u00fcgbare L\u00f6sung auf die Plattform des Kunden umgezogen, f\u00fcr die wir den vollst\u00e4ndig automatisierten Prozess des Continuous Deployment eingerichtet haben. Dadurch haben wir die Time-to-Market \u2013 die Bereitstellung von \u00c4nderungen in der Produktumgebung \u2013 beschleunigt. <\/p>\n<p>In diesem Artikel werden wir alle Phasen des Prozesses des Continuous Deployment (CD) oder der Bereitstellung von Updates auf der Plattform des Kunden beschreiben: <\/p>\n<ol>\n<li>wie dieser Prozess startet, <\/li>\n<li>Synchronisation mit dem Git-Repository des Kunden,<\/li>\n<li>Build des Backends und Frontends,<\/li>\n<li>automatisierte Bereitstellung der Anwendung in der Testumgebung, <\/li>\n<li>automatisierte Bereitstellung in der Prod. <\/li>\n<\/ol>\n<p>\nW\u00e4hrend des Prozesses werden wir Details zur Konfiguration teilen.<\/p>\n<p><img decoding=\"async\" alt=\"Unsere Umsetzung von Continuous Deployment auf der Plattform des Kunden\" src=\"\/wp-content\/uploads\/2019\/04\/54be580319906344a6e2f091395ea7a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>1. Start des CD<\/h3>\n<p>\nContinuous Deployment beginnt damit, dass der Entwickler \u00c4nderungen in den Release-Branch unseres Git-Repositories hochl\u00e4dt. <\/p>\n<p>Unsere Anwendung basiert auf einer Mikroservice-Architektur, wobei alle Komponenten in einem einzigen Repository gespeichert sind. Dadurch werden alle Mikroservices gesammelt und installiert, selbst wenn sich einer von ihnen \u00e4ndert. <\/p>\n<p>Wir haben die Arbeit \u00fcber ein einziges Repository aus mehreren Gr\u00fcnden organisiert: <\/p>\n<ul>\n<li>Entwicklungsfreundlichkeit \u2013 die Anwendung entwickelt sich aktiv weiter, daher kann man sofort mit dem gesamten Code arbeiten. <\/li>\n<li>Eine einheitliche CI\/CD-Pipeline, die garantiert, dass die Anwendung als integriertes System alle Tests durchl\u00e4uft und im Produktionsumfeld des Kunden bereitgestellt wird. <\/li>\n<li>Verwirrung bei den Versionen ausschlie\u00dfen \u2013 wir m\u00fcssen keine Versionskarte der Mikroservices aufbewahren und f\u00fcr jeden Mikroservice eine eigene Konfiguration in Helm-Skripten beschreiben.<\/li>\n<\/ul>\n<h3>2. Synchronisierung mit dem Git-Repository des Kunden<\/h3>\n<p>\nDie vorgenommenen \u00c4nderungen werden automatisch mit dem Git-Repository des Kunden synchronisiert. Dort ist der Build-Prozess der Anwendung eingestellt, der nach der Aktualisierung des Branches gestartet wird, und die Bereitstellung in der Produktion. Beide Prozesse finden in deren Umgebung aus dem Git-Repository statt. <\/p>\n<p>Wir k\u00f6nnen nicht direkt mit dem Repository des Kunden arbeiten, da wir eigene Entwicklungs- und Testumgebungen ben\u00f6tigen. Daher verwenden wir unser eigenes Git-Repository, das mit ihrem Git-Repository synchronisiert ist. Sobald der Entwickler \u00c4nderungen in den entsprechenden Branch unseres Repositories hochl\u00e4dt, werden diese \u00c4nderungen sofort an den Kunden gesendet.<\/p>\n<p><img decoding=\"async\" alt=\"Unsere Umsetzung von Continuous Deployment auf der Plattform des Kunden\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDanach muss ein Build erstellt werden. Dieser besteht aus mehreren Schritten: dem Build des Backends und des Frontends, dem Testen und der Bereitstellung in der Produktion.<\/p>\n<h3>3. Build von Backend und Frontend<\/h3>\n<p>\nDer Build von Backend und Frontend sind zwei parallele Aufgaben, die im GitLab Runner ausgef\u00fchrt werden. Die Konfiguration des urspr\u00fcnglichen Builds befindet sich im selben Repository.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutorial zum Schreiben eines YAML-Skripts f\u00fcr den Build in GitLab<\/a><\/noindex>.<\/p>\n<p>Der GitLab Runner nimmt den Code aus dem ben\u00f6tigten Repository, erstellt mit dem Build-Befehl der Java-Anwendung und sendet ihn an das Docker-Registry. Hier bauen wir das Backend und das Frontend zusammen, erstellen Docker-Images, die wir im Repository des Kunden ablegen. Zur Verwaltung der Docker-Images verwenden wir den <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">Gradle-Plugin<\/a><\/noindex>.<\/p>\n<p>Wir synchronisieren die Versionen unserer Images mit der Release-Version, die im Docker bereitgestellt wird. F\u00fcr einen reibungslosen Betrieb haben wir einige Einstellungen vorgenommen:<\/p>\n<p>1. Die Container zwischen der Testumgebung und der Produktionsumgebung werden nicht neu gebaut. Wir haben Parameter eingerichtet, damit ein und derselbe Container ohne Neuaufbau mit allen Einstellungen, Umgebungsvariablen und Services sowohl in der Testumgebung als auch in der Produktion arbeiten kann. <\/p>\n<p>2. Um die Anwendung \u00fcber Helm zu aktualisieren, muss die Version angegeben werden. Bei uns sind der Build des Backends, das Frontend und die Aktualisierung der Anwendung drei verschiedene Aufgaben, daher ist es wichtig, \u00fcberall dieselbe Version der Anwendung zu verwenden. F\u00fcr diese Aufgabe verwenden wir Daten aus der Git-Historie, da sich die Konfiguration des K8S-Clusters und der Anwendung im selben Git-Repository befindet.<\/p>\n<p>Die Version der Anwendung erhalten wir aus den Ergebnissen des Befehls<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Automatische Bereitstellung aller \u00c4nderungen in der Testumgebung (UAT) <\/h3>\n<p>\nDer n\u00e4chste Schritt in diesem Build-Skript besteht darin, das K8S-Cluster automatisch zu aktualisieren. Dies erfolgt, sofern die gesamte Anwendung erfolgreich gebaut wurde und alle Artefakte im Docker-Registry ver\u00f6ffentlicht sind. Anschlie\u00dfend wird das Testumfeld aktualisiert.<\/p>\n<p>Das Update des Clusters wird \u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Helm Update<\/a><\/noindex>gestart. Tritt dabei ein Problem auf, so rollt Helm automatisch alle \u00c4nderungen zur\u00fcck. Es ist keine \u00dcberwachung erforderlich. <\/p>\n<p>Wir liefern die Konfiguration des K8S-Clusters mit dem Build aus. Daher wird in diesem Schritt die Konfiguration aktualisiert: configMaps, deployments, services, secrets und alle anderen K8S-Konfigurationen, die wir ge\u00e4ndert haben. <\/p>\n<p>Danach initiiert Helm das RollOut-Update der Anwendung im Testumfeld, bevor die Anwendung in die Produktionsumgebung gebracht wird. Dies erm\u00f6glicht es den Benutzern, die gesch\u00e4ftlichen Features, die wir im Testumfeld bereitgestellt haben, manuell zu \u00fcberpr\u00fcfen.<\/p>\n<h3>5. Automatische Bereitstellung aller \u00c4nderungen im Prod <\/h3>\n<p>\nUm das Update in die Produktionsumgebung zu \u00fcbertragen, muss nur ein Knopf in GitLab gedr\u00fcckt werden \u2013 und die Container werden sofort in die Produktionsumgebung bereitgestellt.<\/p>\n<p>Ein und dasselbe Anwendung kann ohne Neukompilierung in verschiedenen Umgebungen \u2013 Test und Produktion \u2013 betrieben werden. Wir verwenden dieselben Artefakte, ohne etwas an der Anwendung zu \u00e4ndern, w\u00e4hrend die Parameter von au\u00dfen bereitgestellt werden. <\/p>\n<p>Die flexible Parametrisierung der Anwendungseinstellungen h\u00e4ngt von der Umgebung ab, in der die Anwendung ausgef\u00fchrt wird. Wir haben alle Umgebungsparameter nach au\u00dfen verlagert: alles wird \u00fcber die K8S-Konfiguration und Helm-Parameter parametriert. Wenn Helm eine Version in der Testumgebung bereitstellt, werden die Testparameter angewendet, in der Produktionsumgebung die Produktionsparameter.<\/p>\n<p>Die gr\u00f6\u00dfte Herausforderung war es, alle verwendeten Dienste und Variablen, die von der Umgebung abh\u00e4ngen, zu parametrisieren und als Umgebungsvariablen sowie in der Beschreibungs- und Konfigurationsparameter f\u00fcr Helm zu \u00fcbertragen. <\/p>\n<p>In den Anwendungseinstellungen werden Umgebungsvariablen verwendet. Ihre Werte werden in Containern mithilfe von K8S ConfigMap festgelegt, die mit Go-Templates automatisiert wird. Zum Beispiel kann das Festlegen einer Umgebungsvariable f\u00fcr den Domainnamen so erfolgen:<\/p>\n<p><code>APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}<\/code><\/p>\n<p><b>.Values.global.env <\/b>\u2013 In dieser Variablen wird der Name der Umgebung (prod, stage, UAT) gespeichert.<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 In dieser Variablen definieren wir im .Values.yaml die ben\u00f6tigte Domain. <\/p>\n<p>Bei der Aktualisierung der Anwendung erstellt Helm anhand der Vorlagen im configmap.yaml und weist das APP_EXTERNAL_DOMAIN den entsprechenden Wert je nach Umgebung zu, in der das Update der Anwendung gestartet wird. Diese Variable wird bereits im Container festgelegt. Der Zugriff erfolgt \u00fcber die Anwendung, sodass in jeder Umgebung der Anwendung ein anderer Wert f\u00fcr diese Variable vorhanden ist. <\/p>\n<p>Relativ neu in Spring Cloud ist die Unterst\u00fctzung von K8S, einschlie\u00dflich der Arbeit mit configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Da das Projekt aktiv entwickelt wird und sich grundlegend \u00e4ndert, k\u00f6nnen wir es nicht in der Produktionsumgebung verwenden. Aber wir \u00fcberwachen seinen Zustand aktiv und nutzen es in DEV-Konfigurationen. Sobald es stabil l\u00e4uft, werden wir von der Verwendung von Umgebungsvariablen auf dieses umschalten.<\/p>\n<h3>Gesamt<\/h3>\n<p>\nSo, Continuous Deployment ist eingerichtet und funktioniert. Alle Updates erfolgen mit einem einzigen Tastendruck. Die Lieferung von \u00c4nderungen in die Produktionsumgebung ist automatisiert. Und was wichtig ist, die Aktualisierungen unterbrechen nicht den Betrieb des Systems. <\/p>\n<p><img decoding=\"async\" alt=\"Unsere Umsetzung von Continuous Deployment auf der Plattform des Kunden\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Zukunftspl\u00e4ne: automatische Datenbankmigration<\/h3>\n<p>\nWir haben \u00fcber ein Upgrade der Datenbank und die M\u00f6glichkeit nachzudenken, diese \u00c4nderungen r\u00fcckg\u00e4ngig zu machen. Immerhin laufen zwei verschiedene Versionen der Anwendung gleichzeitig: die alte Version funktioniert, w\u00e4hrend die neue hochgefahren wird. Die alte werden wir erst abschalten, wenn wir sicher sind, dass die neue Version funktionsf\u00e4hig ist. Die Migration der Datenbank sollte es erm\u00f6glichen, mit beiden Versionen der Anwendung zu arbeiten. <\/p>\n<p>Deshalb k\u00f6nnen wir nicht einfach den Namen einer Spalte oder andere Daten \u00e4ndern. Aber wir k\u00f6nnen eine neue Spalte erstellen, die Daten aus der alten Spalte kopieren und Trigger schreiben, die beim Aktualisieren der Daten gleichzeitig in der anderen Spalte kopieren und aktualisieren. Nach dem erfolgreichen Deployment der neuen Version der Anwendung k\u00f6nnen wir nach Ablauf der Phase des post-launch Supports die alte Spalte und den nicht mehr ben\u00f6tigten Trigger l\u00f6schen. <\/p>\n<p>Wenn die neue Version der Anwendung fehlerhaft arbeitet, k\u00f6nnen wir auf die vorherige Version zur\u00fcckspringen, einschlie\u00dflich der vorherigen Version der Datenbank. Kurz gesagt, unsere \u00c4nderungen erm\u00f6glichen es, gleichzeitig mit mehreren Versionen der Anwendung zu arbeiten. <\/p>\n<p>Wir planen, die Automatisierung der Datenbankmigration \u00fcber einen K8S-Job zu realisieren und in den CD-Prozess zu integrieren. Nat\u00fcrlich werden wir diese Erfahrungen auf Habr teilen.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/447812\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23342,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31377","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 \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013\" \/>\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\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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:40:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:57+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\udd47Unsere Umsetzung von Continuous Deployment auf der Plattform des Kunden | ProHoster","description":"Bei True Engineering haben wir den kontinuierlichen Lieferprozess von Updates auf die Server unserer Kunden eingerichtet und m\u00f6chten diese Erfahrungen teilen. Zun\u00e4chst haben wir ein Online-System f\u00fcr den Kunden entwickelt und in unserem eigenen Kubernetes-Cluster bereitgestellt. Jetzt ist unsere hochgradig belastbare L\u00f6sung zur Plattform des Kunden umgezogen, f\u00fcr die wir einen vollst\u00e4ndig automatisierten Continuous-Deployment-Prozess eingerichtet haben. Dadurch haben wir die Time-to-Market verk\u00fcrzt \u2013","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster","og:description":"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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:40:57+00:00","article:modified_time":"2019-10-31T18:40:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31377","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 05:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:18:39","updated":"2026-01-21 05:52:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31377","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=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}