{"id":55870,"date":"2020-01-30T00:00:00","date_gmt":"2020-01-29T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian"},"modified":"2020-02-18T14:04:02","modified_gmt":"2020-02-18T11:04:02","slug":"ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAuf der RIT 2019 pr\u00e4sentierte unser Kollege Alexander Kortkow <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">h\u00e4lt<\/a><\/noindex> \u00fcber die Automatisierung der Entwicklung bei CIAN: Um das Leben und die Arbeit zu erleichtern, nutzen wir unsere eigene Plattform Integro. Sie verfolgt den Lebenszyklus von Aufgaben, entlastet die Entwickler von Routinearbeiten und verringert signifikant die Anzahl der Bugs in der Produktion. In diesem Beitrag erg\u00e4nzen wir Alexanders Vortrag und erz\u00e4hlen, wie wir von einfachen Skripten zur Integration von Open-Source-Produkten \u00fcber unsere eigene Plattform gelangt sind und was unser spezielles Automatisierungsteam tut.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Null-Level<\/h2>\n<p>\n<i><b>\u201eNull-Level gibt es nicht, davon wei\u00df ich nichts\u201c<\/b><br \/>\nMeister Shifu aus dem Zeichentrickfilm \u201eKung Fu Panda\u201c<\/i><\/p>\n<p>Die Automatisierung bei CIAN begann 14 Jahre nach der Gr\u00fcndung des Unternehmens. Damals bestand das Entwicklungsteam aus 35 Personen. Kaum zu glauben, oder? Nat\u00fcrlich gab es in irgendeiner Form bereits Automatisierung, aber die separate Abteilung f\u00fcr kontinuierliche Integration und Codeauslieferung begann sich tats\u00e4chlich erst im Jahr 2015 zu bilden.\u00a0<\/p>\n<p>Zu diesem Zeitpunkt hatten wir ein gro\u00dfes Monolith-System aus Python, C# und PHP, das auf Linux- und Windows-Servern bereitgestellt wurde. Um dieses Monster zu deployen, hatten wir eine Reihe von Skripten, die wir manuell ausf\u00fchrten. Au\u00dferdem gab es den Build des Monolithen, der uns Schmerzen und Leiden bereitete, aufgrund von Konflikten beim Zusammenf\u00fchren von Branches, Fehlerkorrekturen und dem Neubau mit \u201eeinem anderen Satz von Aufgaben im Build\u201c. Vereinfacht dargestellt, sah der Prozess so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas entsprach nicht unseren Vorstellungen, und wir wollten einen wiederholbaren, automatisierten und verwalteten Build- und Deployment-Prozess aufbauen. Dazu ben\u00f6tigten wir ein CI\/CD-System und w\u00e4hlten zwischen der kostenlosen Version von TeamCity und Jenkins, mit denen wir bereits gearbeitet hatten, und die uns beide hinsichtlich der Funktionalit\u00e4ten \u00fcberzeugten. Letztendlich entschieden wir uns f\u00fcr TeamCity als das neuere Produkt. Zu diesem Zeitpunkt nutzten wir noch keine Microservices-Architektur und erwarteten nicht die Vielzahl an Aufgaben und Projekten.<\/p>\n<h2>Wir kommen zur Idee eines eigenen Systems<\/h2>\n<p>\nDie Einf\u00fchrung von Teamcity reduzierte nur einen Teil der manuellen Arbeiten: Es blieben die Erstellung von Pull-Requests, das Vorantreiben von Aufgaben in Jira und die Auswahl von Aufgaben f\u00fcr das Release. Mit diesen Anforderungen konnte Teamcity nicht mehr zurechtkommen. Daher war ein weiterer Automatisierungsweg erforderlich. Wir pr\u00fcften die Optionen f\u00fcr die Arbeit mit Skripten in Teamcity oder den Wechsel zu externen Automatisierungssystemen. Letztendlich entschieden wir uns jedoch f\u00fcr die maximale Flexibilit\u00e4t, die nur eine eigene L\u00f6sung bieten kann. So entstand die erste Version unseres internen Automatisierungssystems namens Integro.<\/p>\n<p>Teamcity automatisiert den Prozess der Ausf\u00fchrung von Build- und Deployment-Prozessen, w\u00e4hrend Integro sich auf die Hochgradautomatisierung der Entwicklungsprozesse konzentriert. Es war notwendig, die Arbeit mit Aufgaben in Jira mit der Verarbeitung des dazugeh\u00f6rigen Codes in Bitbucket zu verbinden. In dieser Phase begannen in Integro eigene Workflows f\u00fcr die Bearbeitung verschiedener Aufgabentypen zu entstehen.\u00a0<\/p>\n<p>Mit der zunehmenden Automatisierung in den Gesch\u00e4ftsprozessen ist die Anzahl der Projekte und Runs in TeamCity gestiegen. Dabei trat ein neues Problem auf: Eine kostenlose TeamCity-Instanz war nicht mehr ausreichend (3 Agents und 100 Projekte). Wir haben eine weitere Instanz hinzugef\u00fcgt (noch 3 Agents und 100 Projekte), und dann noch eine. Letztendlich hatten wir ein System aus mehreren Clustern, das schwer zu verwalten war.<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls die Frage nach einer vierten Instanz aufkam, wurde uns klar, dass wir so nicht weitermachen konnten, da die Gesamtkosten f\u00fcr die Unterst\u00fctzung von 4 Instanzen aus dem Rahmen fielen. Es stellte sich die Frage, ob wir TeamCity kostenpflichtig erwerben oder auf das kostenlose Jenkins umsteigen sollten. Wir f\u00fchrten Berechnungen zu den Instanzen und Automatisierungspl\u00e4nen durch und entschieden uns, mit Jenkins zu arbeiten. Nach ein paar Wochen wechselten wir zu Jenkins und reduzierten einen Teil des Kopfzerbrechens, der mit der Wartung mehrerer TeamCity-Instanzen verbunden war. So konnten wir uns auf die Entwicklung von Integro konzentrieren und Jenkins an unsere Bed\u00fcrfnisse anpassen.<\/p>\n<p>Mit dem Anstieg der grundlegenden Automatisierung, wie der automatischen Erstellung von Pull Requests, dem Sammeln und Ver\u00f6ffentlichen von Code Coverage sowie anderen Pr\u00fcfungen, wurde der Wunsch laut, manuelle Releases m\u00f6glichst abzulehnen und diese Aufgabe Robotern zu \u00fcberlassen. Dar\u00fcber hinaus hat im Unternehmen der Umstieg auf Mikrodienste begonnen, die h\u00e4ufige Releases erforderten, und zwar unabh\u00e4ngig voneinander. So sind wir allm\u00e4hlich zu automatisierten Releases unserer Mikrodienste \u00fcbergegangen (das Monolith-Projekt wird aufgrund des komplexen Prozesses weiterhin manuell herausgegeben). Doch wie es oft der Fall ist, trat eine neue Herausforderung auf.\u00a0<\/p>\n<h2>Wir automatisieren das Testing<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDurch die Automatisierung der Releases wurden die Entwicklungsprozesse beschleunigt, wobei teilweise auf bestimmte Testphasen verzichtet wurde. Dies f\u00fchrte zu einem tempor\u00e4ren Qualit\u00e4tsverlust. Es mag banal klingen, aber mit der Beschleunigung der Releases musste auch die Produktentwicklungsmethodik \u00fcberdacht werden. Wir mussten \u00fcber die Automatisierung von Tests nachdenken, die pers\u00f6nliche Verantwortung der Entwickler f\u00fcr den produzierten Code und die darin enthaltenen Bugs f\u00f6rdern (hierbei geht es um das \u201eVerinnerlichen der Idee\u201c und nicht um finanzielle Strafen) und \u00fcber Entscheidungen zum Release\/Durchf\u00fchrung von Aufgaben durch automatisiertes Deployment nachdenken.\u00a0<\/p>\n<p>Um die Qualit\u00e4tsprobleme zu beheben, kamen wir zu zwei wichtigen Entscheidungen: Wir f\u00fchrten Kanarientests ein und implementierten ein automatisiertes Fehlermonitoring mit automatisierter Reaktion bei \u00dcberschreitung. Die erste L\u00f6sung erm\u00f6glicht es, offensichtliche Fehler zu erkennen, bevor der Code in die Produktion gelangt, w\u00e4hrend die zweite die Reaktionszeit auf Probleme in der Produktion verk\u00fcrzt hat. Fehler treten nat\u00fcrlich auf, aber wir investieren den Gro\u00dfteil unserer Zeit und Energie nicht in deren Behebung, sondern in deren Minimierung.\u00a0<\/p>\n<h2>Automatisierungsteam<\/h2>\n<p>\nDerzeit haben wir ein Team von 130 Entwicklern und wachsen weiter. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">wachsen<\/a><\/noindex>. Das Team f\u00fcr kontinuierliche Integration und Codebereitstellung (im Folgenden als Deploy and Integration Team oder DI bezeichnet) besteht aus 7 Personen und arbeitet in 2 Bereichen: der Entwicklung der Automatisierungsplattform Integro und DevOps.\u00a0<\/p>\n<p>DevOps ist verantwortlich f\u00fcr die Dev\/Beta-Umgebungen der CIAN-Website sowie die Integro-Umgebungen. Es unterst\u00fctzt die Entwickler bei der L\u00f6sung von Problemen und entwickelt neue Ans\u00e4tze zur Skalierung dieser Umgebungen. Der Bereich der Integro-Entwicklung befasst sich sowohl mit Integro selbst als auch mit verwandten Diensten, zum Beispiel Plugins f\u00fcr Jenkins, Jira, Confluence, und entwickelt auch unterst\u00fctzende Tools und Anwendungen f\u00fcr Entwicklerteams.\u00a0<\/p>\n<p>Das DI-Team arbeitet eng mit dem Plattformteam zusammen, das f\u00fcr die Entwicklung von Architekturen, Bibliotheken und internen Entwicklungsans\u00e4tzen verantwortlich ist. Dar\u00fcber hinaus kann jeder Entwickler bei CIAN zur Automatisierung beitragen, indem er beispielsweise Mikroautomationen f\u00fcr die Bed\u00fcrfnisse seines Teams erstellt oder coole Ideen zur Verbesserung der Automatisierung teilt.<\/p>\n<h2>Der mehrschichtige Ansatz zur Automatisierung bei CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlle Systeme, die in der Automatisierung eingesetzt werden, k\u00f6nnen in mehrere Schichten unterteilt werden:<\/p>\n<ol>\n<li>Externe Systeme (Jira, Bitbucket usw.). Diese werden von den Entwicklungsteams genutzt.\n<\/li>\n<li>Die Integro-Plattform. In der Regel arbeiten Entwickler nicht direkt damit, aber sie ist die Grundlage aller Automatisierungsprozesse.\n<\/li>\n<li>Liefer-, Orchestrierungs- und Entdeckungsdienste (zum Beispiel Jenkins, Consul, Nomad). Mit ihrer Hilfe setzen wir Code auf Servern um und gew\u00e4hrleisten die Interaktion der Dienste miteinander.\n<\/li>\n<li>Physische Ebene (Server, OS, zugeh\u00f6rige Software). Auf dieser Ebene arbeitet unser Code. Dies kann sowohl ein physischer Server als auch ein virtueller sein (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nBasierend auf diesem Konzept teilen wir die Aufgabenbereiche innerhalb des DI-Teams. Die ersten beiden Ebenen fallen in den Verantwortungsbereich der Entwicklungsrichtung Integro, w\u00e4hrend die letzten beiden Ebenen in den Verantwortungsbereich von DevOps fallen. Diese Trennung erm\u00f6glicht es, sich auf Aufgaben zu konzentrieren und beeintr\u00e4chtigt nicht die Zusammenarbeit, da wir nahe beieinander sitzen und st\u00e4ndig Wissen und Erfahrungen austauschen.<\/p>\n<h2>Integro<\/h2>\n<p>\nLassen Sie uns auf Integro konzentrieren und mit dem Technologie-Stack beginnen:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (das alte Monolith von Integro bleibt auf Java 8)\n<\/li>\n<li>Spring Boot 2.X + Spring Cloud Config\n<\/li>\n<li>PostgreSql 11\n<\/li>\n<li>RabbitMQ\u00a0\n<\/li>\n<li>Apache Ignite\n<\/li>\n<li>Camunda (eingebettet)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>Web UI: React (CSR) + MobX\n<\/li>\n<li>SSO: Keycloak\n<\/li>\n<\/ul>\n<p>\nWir folgen dem Prinzip der Mikroservices, obwohl wir auch ein Legacy-System in Form des fr\u00fchen Monolithen von Integro haben. Jeder Mikroservice l\u00e4uft in seinem eigenen Docker-Container, und die Dienste kommunizieren \u00fcber HTTP-Anfragen und RabbitMQ-Nachrichten. Mikroservices finden sich \u00fcber Consul und stellen Anfragen, bei denen die Autorisierung \u00fcber SSO (Keycloak, OAuth 2\/OpenID Connect) erfolgt.<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls konkretes Beispiel betrachten wir die Interaktion mit Jenkins, die aus den folgenden Schritten besteht:<\/p>\n<ol>\n<li>Der Workflow-Management-Mikroservice (nachfolgend Flow-Mikroservice) m\u00f6chte einen Build in Jenkins starten. Dazu findet er \u00fcber Consul die IP:PORT des Integrationsmikroservices mit Jenkins (nachfolgend Jenkins-Mikroservice) und sendet an ihn eine asynchrone Anfrage zum Starten des Builds in Jenkins.\n<\/li>\n<li>Der Jenkins-Mikroservice generiert nach Erhalt der Anfrage eine Job-ID und gibt diese zur\u00fcck, mit der sp\u00e4ter das Ergebnis identifiziert werden kann. Gleichzeitig startet er den Build in Jenkins \u00fcber einen REST-API-Aufruf.\n<\/li>\n<li>Jenkins f\u00fchrt den Build aus und sendet nach Abschluss der Aktion ein Webhook mit den Ergebnissen an den Jenkins-Mikroservice.\n<\/li>\n<li>Der Jenkins-Mikroservice empf\u00e4ngt einen Webhook, erstellt eine Nachricht \u00fcber den Abschluss der Anfrageverarbeitung und f\u00fcgt die Ausf\u00fchrungsresultate hinzu. Die erstellte Nachricht wird in die RabbitMQ-Warteschlange gesendet.\n<\/li>\n<li>Durch RabbitMQ gelangt die ver\u00f6ffentlichte Nachricht zum Flow-Mikroservice, der den Verarbeitungsstatus seiner Aufgabe anhand der Job-ID aus der Anfrage und der erhaltenen Nachricht erf\u00e4hrt.\n<\/li>\n<\/ol>\n<p>\nAktuell haben wir etwa 30 Mikroservices, die in mehrere Gruppen unterteilt werden k\u00f6nnen:<\/p>\n<ol>\n<li>Verwaltung von Konfigurationen.\n<\/li>\n<li>Information und Interaktion mit Nutzern (Messenger, E-Mail).\n<\/li>\n<li>Arbeiten mit Quellcode.\n<\/li>\n<li>Integration mit Deployment-Tools (Jenkins, Nomad, Consul usw.).\n<\/li>\n<li>Monitoring (von Releases, Fehlern usw.).\n<\/li>\n<li>Web-Utilities (UI zur Verwaltung von Testumgebungen, zur Statistiksammlung usw.).\n<\/li>\n<li>Integration mit Task-Trackern und \u00e4hnlichen Systemen.\n<\/li>\n<li>Workflow-Management f\u00fcr verschiedene Aufgaben.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Aufgaben-Workflow<\/h2>\n<p>\nIntegro automatisiert die Vorg\u00e4nge im Zusammenhang mit dem Lebenszyklus einer Aufgabe. Vereinfacht gesagt, verstehen wir unter dem Lebenszyklus einer Aufgabe den Aufgaben-Workflow in Jira. In unseren Entwicklungsprozessen gibt es mehrere Varianten des Workflows, abh\u00e4ngig vom Projekt, von der Art der Aufgabe und von den in der jeweiligen Aufgabe gew\u00e4hlten Optionen.\u00a0<\/p>\n<p>Betrachten wir den Workflow, den wir am h\u00e4ufigsten verwenden:<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Diagramm zeigt das Zahnrad, dass die Transition automatisch von Integro ausgel\u00f6st wird, w\u00e4hrend die menschliche Figur bedeutet, dass die Transition manuell durch eine Person ausgel\u00f6st wird. Lassen Sie uns einige Wege betrachten, auf denen die Aufgabe in diesem Workflow verlaufen kann.<\/p>\n<p>Vollst\u00e4ndig manuelles Testen auf DEV+BETA ohne Canary-Tests (normalerweise so ver\u00f6ffentlichen wir Monolithen):<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zu einer eigenen Plattform: wie wir die Entwicklung bei CIAN automatisiert haben\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs kann auch andere Kombinationen von Transitionen geben. Manchmal kann der Weg, den die Aufgabe nehmen wird, \u00fcber Optionen in Jira ausgew\u00e4hlt werden.<\/p>\n<h2>Bewegung der Aufgabe<\/h2>\n<p>\nLassen Sie uns die Hauptschritte betrachten, die bei der Bewegung der Aufgabe durch den Workflow 'Testen auf DEV + Canary-Tests' ausgef\u00fchrt werden:<\/p>\n<p>1. Der Entwickler oder PM erstellt die Aufgabe.<\/p>\n<p>2. Der Entwickler nimmt die Aufgabe in Arbeit. Nach der Fertigstellung \u00fcbertr\u00e4gt er sie in den Status IN REVIEW.<\/p>\n<p>3. Jira sendet ein Webhook an den Jira-Mikroservice (verantwortlich f\u00fcr die Integration mit Jira).<\/p>\n<p>4. Der Jira-Mikroservice sendet eine Anfrage an den Flow-Service (verantwortlich f\u00fcr interne Workflows, in denen die Arbeit durchgef\u00fchrt wird), um den Workflow zu starten.<\/p>\n<p>5. Innerhalb des Flow-Services:<\/p>\n<ul>\n<li>Es werden Reviewer f\u00fcr die Aufgabe zugewiesen (User-Mikroservice, der alles \u00fcber die Benutzer wei\u00df + Jira-Mikroservice).<\/li>\n<li>\u00dcber den Source-Mikroservice (der \u00fcber Repositories und Branches Bescheid wei\u00df, aber nicht mit dem Code selbst arbeitet) wird nach Repositories gesucht, in denen sich der Branch unserer Aufgabe befindet (zur Vereinfachung entspricht der Name des Branches der Jira-Tasknummer). H\u00e4ufig hat eine Aufgabe nur einen Branch in einem Repository, was die Verwaltung der Deployment-Warteschlange erleichtert und die Abh\u00e4ngigkeit zwischen den Repositories verringert.<\/li>\n<li>F\u00fcr jeden gefundenen Branch wird die folgende Reihenfolge von Schritten ausgef\u00fchrt:\n<p> i) Merging des Master-Branches (Git-Mikroservice f\u00fcr die Arbeit mit Code).<br \/>\n ii) Der Branch wird vom Entwickler vor \u00c4nderungen gesperrt (Bitbucket-Mikroservice).<br \/>\n iii) Es wird ein Pull Request f\u00fcr diesen Branch erstellt (Bitbucket-Mikroservice).<br \/>\n iv) Eine Nachricht \u00fcber den neuen Pull Request wird in die Chats der Entwickler gesendet (Notify-Mikroservice f\u00fcr Benachrichtigungen).<br \/>\n v) Der Build, die Tests und das Deployment der Aufgabe auf DEV werden gestartet (Jenkins-Mikroservice f\u00fcr die Arbeit mit Jenkins).<br \/>\n vi) Wenn alle vorherigen Punkte erfolgreich abgeschlossen sind, gibt Integro seine Genehmigung im Pull Request (Bitbucket-Mikroservice).<\/li>\n<li>Integro wartet auf die Genehmigung im Pull Request von den zugewiesenen Reviewern.<\/li>\n<li>Sobald alle erforderlichen Genehmigungen vorliegen (einschlie\u00dflich erfolgreich durchgef\u00fchrter automatisierter Tests), \u00fcbertr\u00e4gt Integro die Aufgabe in den Status 'Test on Dev' (Jira-Mikroservice).<\/li>\n<\/ul>\n<p>\n6. Die Tester f\u00fchren die Tests der Aufgabe durch. Bei keinen Problemen wird die Aufgabe in den Status 'Ready For Build' versetzt.<\/p>\n<p>7. Integro erkennt, dass die Aufgabe bereit f\u00fcr die Ver\u00f6ffentlichung ist, und startet das Deployment im Canary-Modus (Jenkins-Mikroservice). Die Release-Bereitschaft wird durch eine Reihe von Regeln bestimmt. Zum Beispiel muss die Aufgabe im richtigen Status sein, es d\u00fcrfen keine Blockaden bei anderen Aufgaben vorliegen, und es gibt derzeit keine aktiven Deployments dieses Mikroservices etc.<\/p>\n<p>8. Die Aufgabe wird in den Status 'Canary' \u00fcberf\u00fchrt (Jira-Mikroservice).<\/p>\n<p>9. Jenkins startet \u00fcber Nomad das Deployment der Aufgabe im Canary-Modus (normalerweise 1-3 Instanzen) und benachrichtigt den Service zur \u00dcberwachung der Releases (DeployWatch-Mikroservice).<\/p>\n<p>10. Der DeployWatch-Mikroservice sammelt Fehlerprotokolle und reagiert darauf, wenn n\u00f6tig. Bei \u00dcberschreitung des Fehlerprotokolls (der Normwert wird automatisch berechnet) werden die Entwickler \u00fcber den Notify-Mikroservice benachrichtigt. Wenn innerhalb von 5 Minuten kein Entwickler reagiert (auf Revert oder Stay klickt), beginnt der automatische Rollback der Canary-Instanzen. Wenn das Protokoll nicht \u00fcberschritten wird, muss der Entwickler den Deployment-Vorgang in der Produktion manuell starten (durch Klicken auf die Schaltfl\u00e4che im UI). Wenn der Entwickler innerhalb von 60 Minuten kein Deployment in der Produktion gestartet hat, werden die Canary-Instanzen ebenfalls aus Sicherheitsgr\u00fcnden zur\u00fcckgenommen.<\/p>\n<p>11. Nach dem Start des Deployments in der Produktion:<\/p>\n<ul>\n<li>Der Task wird auf den Status Produktion (Jira-Mikroservice) umgestellt.<\/li>\n<li>Der Jenkins-Mikroservice startet den Deployment-Prozess und informiert den DeployWatch-Mikroservice \u00fcber die Bereitstellung.<\/li>\n<li>Der DeployWatch-Mikroservice \u00fcberpr\u00fcft, dass alle Container in der Produktion aktualisiert wurden (es gab F\u00e4lle, in denen nicht alles aktualisiert wurde).<\/li>\n<li>\u00dcber den Notify-Mikroservice wird eine Benachrichtigung \u00fcber die Ergebnisse des Deployments in der Produktion gesendet.<\/li>\n<\/ul>\n<p>\n12. Entwickler haben 30 Minuten Zeit, um im Fall von fehlerhaftem Verhalten eines Mikrodienstes einen Rollback des Produkts zu initiieren. Nach Ablauf dieser Frist wird die Aufgabe automatisch in den Master (Git-Mikrodienst) \u00fcberf\u00fchrt.<\/p>\n<p>13. Nach erfolgreich abgeschlossenem Merge in den Master wird der Status der Aufgabe auf \"Closed\" (Jira-Mikrodienst) ge\u00e4ndert.<\/p>\n<p>Das Diagramm beansprucht nicht, vollst\u00e4ndig detailliert zu sein (tats\u00e4chlich gibt es noch mehr Schritte), bietet jedoch die M\u00f6glichkeit, den Integrationsgrad in die Prozesse zu bewerten. Wir halten dieses Diagramm nicht f\u00fcr perfekt und verbessern die automatisierten Begleitprozesse f\u00fcr Releases und Deployments.<\/p>\n<h2>Was kommt als N\u00e4chstes<\/h2>\n<p>\nWir haben gro\u00dfe Pl\u00e4ne f\u00fcr die Weiterentwicklung der Automatisierung, beispielsweise den Verzicht auf manuelle Operationen bei Monolith-Releases, die Verbesserung der \u00dcberwachung bei automatischen Deployments und die Optimierung der Zusammenarbeit mit Entwicklern.<\/p>\n<p>Aber hier wollen wir vorerst stoppen. Viele Themen im \u00dcberblick zur Automatisierung haben wir nur oberfl\u00e4chlich angesprochen, einige gar nicht behandelt, daher beantworten wir gerne Fragen. Wir freuen uns \u00fcber Vorschl\u00e4ge, was wir detailliert beleuchten sollen, schreiben Sie in die Kommentare.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/cian\/blog\/486056\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55870","post","type-post","status-publish","format-standard","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=\"\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445\" \/>\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\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\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\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\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=\"2020-01-29T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:02+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\udd47Von Skripten zur eigenen Plattform: Wie wir die Entwicklung bei CIAN automatisiert haben | ProHoster","description":"Auf der RIT 2019 hielt unser Kollege Alexander Korotkov einen Vortrag \u00fcber die Automatisierung der Entwicklung bei CIAN: Um das Leben und die Arbeit zu erleichtern, verwenden wir unsere eigene Plattform Integro. Diese verfolgt den Lebenszyklus von Aufgaben, entlastet die Entwickler von Routineaufgaben und reduziert die Anzahl der Bugs in der Produktion erheblich. In diesem Beitrag erg\u00e4nzen wir Alexanders Vortrag und erz\u00e4hlen, wie wir den Weg von einfachen","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","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\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster","og:description":"\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","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":"2020-01-29T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55870","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:35:40","updated":"2022-09-30 17:42:13"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/55870","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=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}