{"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 zur 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 zur 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 hat unser Kollege Alexander Korotkov <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">Bericht<\/a><\/noindex> \u00fcber die Automatisierung der Entwicklung bei CIAN gesprochen: Um das Leben und die Arbeit zu erleichtern, nutzen wir unsere eigene Plattform Integro. Sie verfolgt den Lebenszyklus von Aufgaben, befreit Entwickler von Routineoperationen und reduziert signifikant die Anzahl der Bugs in der Produktion. In diesem Beitrag werden wir Alexanders Vortrag erg\u00e4nzen und erz\u00e4hlen, wie wir den Weg von einfachen Skripten zur Integration von Open-Source-Produkten \u00fcber unsere eigene Plattform gegangen sind und womit unser separates Automatisierungsteam besch\u00e4ftigt ist.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nullniveau<\/h2>\n<p>\n<i><b>\u00abEs gibt kein Nullniveau, ich kenne so etwas nicht\u00bb<\/b><br \/>\nMeister Shifu aus dem Film \u00abKung-Fu Panda\u00bb<\/i><\/p>\n<p>Die Automatisierung bei CIAN begann 14 Jahre nach der Gr\u00fcndung des Unternehmens. Damals bestand das Entwicklungsteam aus 35 Personen. Es ist schwer zu glauben, oder? Nat\u00fcrlich gab es in gewisser Weise schon Automation, aber ein separates Konzept f\u00fcr kontinuierliche Integration und Code-Auslieferung begann erst 2015 Gestalt anzunehmen.\u00a0<\/p>\n<p>Zu diesem Zeitpunkt hatten wir ein riesiges Monolith aus Python, C# und PHP, das auf Linux-\/Windows-Servern bereitgestellt war. F\u00fcr die Bereitstellung dieses Monsters hatten wir eine Sammlung von Skripten, die wir manuell ausf\u00fchrten. Es gab auch die Zusammenstellung des Monolithen, die Schmerz und Leiden durch Konflikte beim Zusammentragen von Branches, Fehlerkorrekturen und das erneute Zusammenstellen \u201emit einem anderen Aufgabenpaket im Build\u201c bereitete. Vereinfacht sah der Prozess so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zur 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 gen\u00fcgte uns nicht, und wir wollten einen wiederholbaren, automatisierten und steuerbaren Prozess f\u00fcr das Bauen und Bereitstellen aufbauen. Daf\u00fcr ben\u00f6tigten wir ein CI\/CD-System und w\u00e4hlten zwischen der kostenlosen Version von Teamcity und Jenkins, da wir mit beiden gearbeitet hatten und beide uns hinsichtlich der Funktionalit\u00e4ten zusagten. Wir entschieden uns f\u00fcr Teamcity als das neuere Produkt. Zu diesem Zeitpunkt verwendeten wir noch keine Microservices-Architektur und rechneten nicht mit vielen Aufgaben und Projekten.<\/p>\n<h2>Wir kamen zu der Idee eines eigenen Systems<\/h2>\n<p>\nDie Einf\u00fchrung von Teamcity hat nur einen Teil der manuellen Arbeit beseitigt: Es blieb noch die Erstellung von Pull Requests, die Fortschreibung von Aufgaben in Jira und die Auswahl von Aufgaben f\u00fcr die Ver\u00f6ffentlichung. Mit dieser Aufgabe konnte das Teamcity-System nicht mehr umgehen. Es musste ein Weg zur weiteren Automatisierung gefunden werden. Wir haben die Optionen f\u00fcr die Arbeit mit Scripts in Teamcity oder den Umstieg auf externe Automatisierungssysteme gepr\u00fcft. Letztendlich haben wir entschieden, dass wir die maximale Flexibilit\u00e4t ben\u00f6tigen, die nur eine eigene L\u00f6sung bieten kann. So entstand die erste Version des internen Automatisierungssystems namens Integro.<\/p>\n<p>Teamcity k\u00fcmmert sich um die Automatisierung auf der Ebene des Starts von Build- und Deploy-Prozessen, w\u00e4hrend Integro sich auf die hochgradige Automatisierung von Entwicklungsprozessen konzentriert hat. Es war n\u00f6tig, die Arbeit mit den Aufgaben in Jira mit der Verarbeitung des zugeh\u00f6rigen Quellcodes in Bitbucket zu verbinden. In dieser Phase begannen innerhalb von Integro eigene Workflows f\u00fcr die Bearbeitung von Aufgaben verschiedener Typen zu entstehen.\u00a0<\/p>\n<p>Durch die zunehmende Automatisierung der Gesch\u00e4ftsprozesse erh\u00f6hte sich die Anzahl der Projekte und Runs in Teamcity. So trat ein neues Problem auf: Ein kostenloser Teamcity-Instanz reichte nicht mehr aus (3 Agenten und 100 Projekte), wir haben eine weitere Instanz hinzugef\u00fcgt (noch 3 Agenten 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 zur 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 es so nicht weitergehen konnte, da die Gesamtkosten f\u00fcr die Unterst\u00fctzung von vier Instanzen schon nicht mehr tragbar waren. Es stellte sich die Frage, ob wir Teamcity kaufen oder uns f\u00fcr die kostenlose Jenkins entscheiden sollten. Wir haben die Berechnungen f\u00fcr die Instanzen und die Automatisierungspl\u00e4ne durchgef\u00fchrt und entschieden, dass wir mit Jenkins leben werden. Nach ein paar Wochen sind wir auf Jenkins umgestiegen und haben einen Teil der Kopfschmerzen, die mit der Unterst\u00fctzung mehrerer Teamcity-Instanzen verbunden waren, losgeworden. Daher konnten wir uns auf die Entwicklung von Integro und die Anpassung von Jenkins konzentrieren.<\/p>\n<p>Mit dem Anstieg der grundlegenden Automatisierung (in Form der automatischen Erstellung von Pull Requests, der Erfassung und Ver\u00f6ffentlichung der Codeabdeckung und anderer \u00dcberpr\u00fcfungen) gab es den nachhaltigen Wunsch, manuelle Releases m\u00f6glichst abzulehnen und diese Arbeit den Robotern zu \u00fcberlassen. Dar\u00fcber hinaus begann innerhalb des Unternehmens der Umstieg auf Mikrodienste, die h\u00e4ufige Releases erforderten, und zwar getrennt voneinander. So kamen wir schrittweise zu automatisierten Releases unserer Mikrodienste (das Monolith wird aufgrund der Komplexit\u00e4t des Prozesses bisher manuell ver\u00f6ffentlicht). Doch wie das h\u00e4ufig der Fall ist, trat eine neue Komplikation auf.\u00a0<\/p>\n<h2>Automatisieren wir das Testen<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Von Skripten zur 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 haben sich die Entwicklungsprozesse beschleunigt, teilweise auch auf Kosten des \u00dcberspringens bestimmter Testphasen. Das f\u00fchrte zu einem vor\u00fcbergehenden Qualit\u00e4tsverlust. Es klingt banal, aber zusammen mit der Beschleunigung der Releases musste auch die Methodik der Produktentwicklung ge\u00e4ndert werden. Wir mussten \u00fcber die Automatisierung von Tests nachdenken, die pers\u00f6nliche Verantwortung (hier geht es um das \u201eVerstehen der Idee im Kopf\u201c, nicht um Geldstrafen) der Entwickler f\u00fcr den Code und die Fehler darin, sowie um die Entscheidung \u00fcber das Release\/nicht Release der Aufgaben durch automatisiertes Deployment.\u00a0<\/p>\n<p>Um die Qualit\u00e4tsprobleme zu beheben, haben wir zwei wichtige Entscheidungen getroffen: Wir haben Canaries-Tests eingef\u00fchrt und die automatische \u00dcberwachung von Fehlern mit automatisierter Reaktion auf deren \u00dcberschreitung implementiert. Die erste Entscheidung erm\u00f6glichte es, offensichtliche Fehler zu erkennen, bevor der Code vollst\u00e4ndig in die Produktion gelangte, die zweite reduzierte die Reaktionszeit auf Probleme in der Produktion. Fehler gibt es nat\u00fcrlich, aber wir verbringen den Gro\u00dfteil unserer Zeit und Energie nicht mit der Behebung, sondern mit der Minimierung.\u00a0<\/p>\n<h2>Das Automatisierungsteam<\/h2>\n<p>\nAktuell haben wir ein Team von 130 Entwicklern, und wir wachsen weiterhin <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">weiter<\/a><\/noindex>. Das Team f\u00fcr kontinuierliche Integration und Bereitstellung von Code (im Folgenden als Deploy and Integration Team oder DI bezeichnet) besteht aus 7 Personen und arbeitet in 2 Richtungen: Entwicklung der Automatisierungsplattform Integro und DevOps.\u00a0<\/p>\n<p>DevOps ist verantwortlich f\u00fcr die Dev\/Beta-Umgebungen der CIAN-Website, die Integro-Umgebungen und unterst\u00fctzt die Entwickler bei der L\u00f6sung von Problemen und der Entwicklung neuer Ans\u00e4tze zur Skalierung der Umgebungen. Der Entwicklungsbereich f\u00fcr Integro k\u00fcmmert sich sowohl um Integro selbst als auch um verwandte Dienste, wie Plugins f\u00fcr Jenkins, Jira, Confluence, und entwickelt au\u00dferdem unterst\u00fctzende Tools und Anwendungen f\u00fcr Entwicklerteams.\u00a0<\/p>\n<p>Das DI-Team arbeitet eng mit dem Plattformteam zusammen, das sich mit der Entwicklung der Architektur, Bibliotheken und Entwicklungsans\u00e4tzen innerhalb des Unternehmens besch\u00e4ftigt. Dar\u00fcber hinaus kann jeder Entwickler innerhalb von CIAN zu Automatisierungen beitragen, zum Beispiel Mikroautomatisierungen f\u00fcr die Bed\u00fcrfnisse des Teams erstellen oder eine gro\u00dfartige Idee teilen, wie man die Automatisierung noch besser gestalten kann.<\/p>\n<h2>Schichtkuchen der Automatisierung bei CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Von Skripten zur 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 an der Automatisierung beteiligt sind, k\u00f6nnen in mehrere Schichten unterteilt werden:<\/p>\n<ol>\n<li>Externe Systeme (Jira, Bitbucket usw.). Diese werden von den Entwicklungsteams verwendet.\n<\/li>\n<li>Die Integro-Plattform. H\u00e4ufig arbeiten die Entwickler nicht direkt damit, aber sie unterst\u00fctzt die gesamte Automatisierungsarbeit.\n<\/li>\n<li>Liefer-, Orchestrierungs- und Entdeckungsdienste (zum Beispiel Jenkins, Consul, Nomad). Mit deren Hilfe setzen wir den Code auf Servern um und sorgen daf\u00fcr, dass die Dienste miteinander funktionieren.\n<\/li>\n<li>Physikalischer Ebene (Server, Betriebssysteme, verwandte Software). Auf dieser Ebene l\u00e4uft unser Code. Dies kann sowohl ein physischer Server als auch ein virtueller (LXC, KVM, Docker) sein.\n<\/li>\n<\/ol>\n<p>\nBasierend auf diesem Konzept teilen wir die Zust\u00e4ndigkeiten innerhalb des DI-Teams. Die ersten beiden Ebenen liegen im Verantwortungsbereich der Integro-Entwicklung, w\u00e4hrend die letzten beiden Ebenen im Zust\u00e4ndigkeitsbereich von DevOps liegen. Diese Aufteilung erm\u00f6glicht es, sich auf die Aufgaben zu konzentrieren und st\u00f6rt nicht die Interaktion, da wir nah beieinander sind und st\u00e4ndig Wissen und Erfahrungen austauschen.<\/p>\n<h2>Integro<\/h2>\n<p>\nKonzentrieren wir uns auf Integro und beginnen wir mit dem Technologiestack:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (das alte Monolith 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 (embedded)\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 Mikrodienstentwicklung, obwohl wir auch ein Legacy-System in Form des Monolithen der fr\u00fchen Version von Integro haben. Jeder Mikrodienst l\u00e4uft in seinem eigenen Docker-Container, die Dienste kommunizieren \u00fcber HTTP-Anfragen und RabbitMQ-Nachrichten. Mikrodienste finden sich \u00fcber Consul und stellen eine Anfrage, wobei sie sich \u00fcber SSO (Keycloak, OAuth 2\/OpenID Connect) authentifizieren.<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zur 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 Mikrodienst f\u00fcr die Workflow-Verwaltung (im Folgenden Flow-Mikrodienst) m\u00f6chte einen Build in Jenkins starten. Dazu findet er \u00fcber Consul die IP:PORT des Mikrodienstes zur Integration mit Jenkins (im Folgenden Jenkins-Mikrodienst) und sendet eine asynchrone Anfrage zum Start eines Builds in Jenkins.\n<\/li>\n<li>Der Jenkins-Mikrodienst formt nach Erhalt der Anfrage eine Job-ID und gibt diese als Antwort zur\u00fcck, mit der sp\u00e4ter das Ergebnis identifiziert werden kann. Gleichzeitig startet er den Build in Jenkins \u00fcber einen Aufruf der REST API.\n<\/li>\n<li>Jenkins f\u00fchrt den Build aus und sendet nach Abschluss einen Webhook mit den Ergebnissen der Ausf\u00fchrung an den Jenkins-Mikrodienst.\n<\/li>\n<li>Der Jenkins-Mikrodienst, der den Webhook erh\u00e4lt, erstellt eine Nachricht \u00fcber den Abschluss der Anfrageverarbeitung und f\u00fcgt die Ergebnisse der Ausf\u00fchrung hinzu. Die erstellte Nachricht wird in die RabbitMQ-Warteschlange gesendet.\n<\/li>\n<li>\u00dcber RabbitMQ gelangt die ver\u00f6ffentlichte Nachricht zum Flow-Mikrodienst, der so \u00fcber das Ergebnis der Verarbeitung seiner Aufgabe informiert wird, indem er die Job-ID aus der Anfrage mit der erhaltenen Nachricht vergleicht.\n<\/li>\n<\/ol>\n<p>\nMomentan haben wir etwa 30 Mikrodienste, die in mehrere Gruppen unterteilt werden k\u00f6nnen:<\/p>\n<ol>\n<li>Konfigurationsmanagement.\n<\/li>\n<li>Benachrichtigung und Interaktion mit Benutzern (Messenger, E-Mail).\n<\/li>\n<li>Arbeit mit Quellcode.\n<\/li>\n<li>Integration mit Bereitstellungstools (Jenkins, Nomad, Consul usw.).\n<\/li>\n<li>\u00dcberwachung (von Releases, Fehlern usw.).\n<\/li>\n<li>Web-Utilities (UI zur Verwaltung von Testumgebungen, Sammlung von Statistiken usw.).\n<\/li>\n<li>Integration mit Aufgabenverfolgungssystemen und \u00e4hnlichen Systemen.\n<\/li>\n<li>Workflow-Management f\u00fcr verschiedene Aufgaben.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow der Aufgabe<\/h2>\n<p>\nIntegro automatisiert Aktionen im Zusammenhang mit dem Lebenszyklus einer Aufgabe. Vereinfacht gesagt, verstehen wir unter dem Lebenszyklus einer Aufgabe den Workflow der Aufgabe in Jira. In unseren Entwicklungsprozessen gibt es mehrere Varianten von Workflows, abh\u00e4ngig vom Projekt, vom Aufgabentyp und von den in der jeweiligen Aufgabe ausgew\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 zur 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 \/>\nIn der Abbildung deutet das Zahnrad darauf hin, dass der \u00dcbergang automatisch von Integro ausgel\u00f6st wird, w\u00e4hrend die Figur eines Menschen bedeutet, dass der \u00dcbergang manuell von einer Person initiiert wird. Lassen Sie uns mehrere Pfade betrachten, auf denen die Aufgabe durch diesen Workflow gehen kann.<\/p>\n<p>Vollst\u00e4ndige manuelle Tests auf DEV+BETA ohne Canary-Tests (normalerweise so ver\u00f6ffentlichen wir das Monolith):<\/p>\n<p><img decoding=\"async\" alt=\"Von Skripten zur 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 k\u00f6nnen auch andere Kombinationen des \u00dcbergangs existieren. Manchmal kann der Weg, den die Aufgabe nimmt, \u00fcber Optionen in Jira ausgew\u00e4hlt werden.<\/p>\n<h2>Bewegung der Aufgabe<\/h2>\n<p>\nBetrachten wir die Hauptschritte, die bei der Bewegung einer Aufgabe im Workflow \u201aTesten auf DEV + Canary-Tests\u2018 durchgef\u00fchrt werden:<\/p>\n<p>1. Der Entwickler oder PM erstellt die Aufgabe.<\/p>\n<p>2. Der Entwickler nimmt die Aufgabe an. Nach Abschluss wird sie in den Status IN REVIEW versetzt.<\/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 ausgef\u00fchrt wird), um den Workflow zu starten.<\/p>\n<p>5. Im Flow-Service:<\/p>\n<ul>\n<li>Es werden Reviewer f\u00fcr die Aufgabe zugewiesen (Users-Mikroservice, der alles \u00fcber die Benutzer wei\u00df + Jira-Mikroservice).<\/li>\n<li>\u00dcber den Source-Mikroservice (wei\u00df \u00fcber Repositories und Branches Bescheid, arbeitet aber nicht mit dem Code selbst) wird nach Repositories gesucht, die einen Branch mit unserer Aufgabe enthalten (zur Vereinfachung des Suchens hat der Branch den gleichen Namen wie die Aufgabennummer in Jira). Am h\u00e4ufigsten hat eine Aufgabe nur einen Branch in einem Repository, was das Management der Deployment-Warteschlange vereinfacht und die Kopplung zwischen den Repositories verringert.<\/li>\n<li>F\u00fcr jeden gefundenen Branch wird folgende Aktionsequenz ausgef\u00fchrt:\n<p> i) Einf\u00fcgen des Master-Branches (Git-Mikroservice zur Arbeit mit Code).<br \/>\n ii) Der Branch wird vom Entwickler (Bitbucket-Mikroservice) vor \u00c4nderungen gesperrt.<br \/>\n iii) Ein Pull Request f\u00fcr diesen Branch wird erstellt (Bitbucket-Mikroservice).<br \/>\n iv) Eine Nachricht \u00fcber den neuen Pull Request wird in den Entwickler-Chats 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 wurden, f\u00fcgt Integro seine Genehmigung im Pull Request hinzu (Bitbucket-Mikroservice).<\/li>\n<li>Integro wartet auf die Genehmigung im Pull Request von den zugewiesenen Reviewern.<\/li>\n<li>Sobald alle erforderlichen Genehmigungen erhalten werden (einschlie\u00dflich positiv bestandener automatisierter Tests), versetzt Integro die Aufgabe in den Status Test auf Dev (Jira-Mikroservice).<\/li>\n<\/ul>\n<p>\n6. Tester f\u00fchren die Testung der Aufgabe durch. Wenn es keine Probleme gibt, wird die Aufgabe in den Status Bereit f\u00fcr Build \u00fcbertragen.<\/p>\n<p>7. Integro \u201esieht\u201c, dass die Aufgabe bereit f\u00fcr die Ver\u00f6ffentlichung ist und startet ihr Deployment im Canary-Modus (Jenkins-Microservice). Die Bereitstellung zur Ver\u00f6ffentlichung wird durch eine Reihe von Regeln bestimmt. Zum Beispiel muss die Aufgabe im richtigen Status sein, es d\u00fcrfen keine Blockierungen auf andere Aufgaben existieren, es gibt derzeit keine aktiven Deployments dieses Microservices usw.<\/p>\n<p>8. Die Aufgabe wird in den Status Canary (Jira-Microservice) \u00fcberf\u00fchrt.<\/p>\n<p>9. Jenkins startet \u00fcber Nomad das Deployment der Aufgabe im Canary-Modus (in der Regel 1-3 Instanzen) und benachrichtigt den Release-Monitoring-Service (DeployWatch-Microservice) \u00fcber das Deployment.<\/p>\n<p>10. Der DeployWatch-Microservice sammelt den Fehlerhintergrund und reagiert darauf, falls n\u00f6tig. Bei \u00dcberschreitung des Fehlerhintergrunds (die Norm wird automatisch berechnet) erfolgt eine Benachrichtigung der Entwickler \u00fcber den Notify-Microservice. Wenn der Entwickler nach 5 Minuten nicht reagiert hat (Revert oder Stay gedr\u00fcckt hat), wird ein automatischer Rollback der Canary-Instanzen gestartet. Wenn der Hintergrund nicht \u00fcberschritten wird, muss der Entwickler manuell das Deployment der Aufgabe in die Produktion starten (durch Knopfdruck im UI). Wenn der Entwickler innerhalb von 60 Minuten das Deployment in die Produktion nicht gestartet hat, werden aus Sicherheitsgr\u00fcnden auch die Canary-Instanzen zur\u00fcckgefahren.<\/p>\n<p>11. Nach dem Start des Deployments in die Produktion:<\/p>\n<ul>\n<li>Die Aufgabe wird in den Status Produktion (Jira-Microservice) \u00fcberf\u00fchrt.<\/li>\n<li>Der Jenkins-Microservice startet den Deployment-Prozess und benachrichtigt den DeployWatch-Microservice \u00fcber das Deployment.<\/li>\n<li>Der DeployWatch-Microservice \u00fcberpr\u00fcft, dass alle Container in der Produktion aktualisiert wurden (es gab F\u00e4lle, in denen nicht alle aktualisiert wurden).<\/li>\n<li>Eine Benachrichtigung \u00fcber die Ergebnisse des Deployments in die Produktion wird \u00fcber den Notify-Microservice versendet.<\/li>\n<\/ul>\n<p>\n12. Die Entwickler haben 30 Minuten Zeit, um das Rollback der Aufgabe aus der Produktion im Falle unerw\u00fcnschten Verhaltens des Microservices zu starten. Nach Ablauf dieser Zeit wird die Aufgabe automatisch in den Master integriert (Git-Microservice).<\/p>\n<p>13. Nach dem erfolgreichen Merge in den Master wird der Status der Aufgabe auf Geschlossen (Jira-Microservice) ge\u00e4ndert.<\/p>\n<p>Das Schema erhebt nicht den Anspruch auf Vollst\u00e4ndigkeit (in der Realit\u00e4t gibt es noch mehr Schritte), erm\u00f6glicht jedoch eine Bewertung des Integrationsgrads in die Prozesse. Wir betrachten dieses Schema nicht als ideal und verbessern die Prozesse der automatischen Bereitstellung von Releases und Deployments.<\/p>\n<h2>Was kommt als n\u00e4chstes<\/h2>\n<p>\nWir haben gro\u00dfe Pl\u00e4ne zur Entwicklung der Automatisierung, zum Beispiel den Verzicht auf manuelle Operationen bei der Ver\u00f6ffentlichung des Monolithen, die Verbesserung der \u00dcberwachung bei automatischen Deployments und die Optimierung der Zusammenarbeit mit den Entwicklern.<\/p>\n<p>Doch an dieser Stelle halten wir zun\u00e4chst inne. Viele Themen in der \u00dcbersicht zur Automatisierung haben wir nur oberfl\u00e4chlich behandelt, einige gar nicht erw\u00e4hnt, deshalb freuen wir uns darauf, Fragen zu beantworten. Wir warten auf Vorschl\u00e4ge, was wir detailliert beleuchten sollen, schreiben Sie uns 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 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\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) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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.\" \/>\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 \u0426\u0418\u0410\u041d automatisiert haben | ProHoster","description":"Auf der RIT 2019.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/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}]}}