{"id":93885,"date":"2020-09-10T19:42:23","date_gmt":"2020-09-10T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov"},"modified":"2020-09-10T19:42:23","modified_gmt":"2020-09-10T17:42:23","slug":"continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns besprechen, warum CI-Tools und CI etwas ganz Unterschiedliches sind.<\/p>\n<p><\/p>\n<p>Welches Problem soll CI l\u00f6sen, woher kam die Idee, welche letzten Best\u00e4tigungen gibt es, dass es funktioniert, und wie erkennen Sie, dass Sie tats\u00e4chlich eine Praxis haben und nicht nur ein installiertes Jenkins.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Die Idee, einen Vortrag \u00fcber Continuous Integration zu halten, entstand vor einem Jahr, als ich zu Vorstellungsgespr\u00e4chen ging und nach einem Job suchte. Ich sprach mit 10-15 Unternehmen, von denen nur eines in der Lage war, verst\u00e4ndlich zu erkl\u00e4ren, was CI ist, und zu erl\u00e4utern, wie sie begriffen haben, dass sie es nicht hatten. Die anderen redeten wirres Zeug \u00fcber Jenkins \ud83d\ude42 Nun, wir haben Jenkins, es macht Builds, CI! F\u00fcr den Vortrag werde ich versuchen zu erkl\u00e4ren, was Continuous Integration tats\u00e4chlich ist und warum Jenkins und \u00e4hnliche Werkzeuge so wenig damit zu tun haben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und was f\u00e4llt den Leuten normalerweise ein, wenn sie das Wort CI h\u00f6ren? Den meisten wird Jenkins, Gitlab CI, Travis usw. einfallen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selbst wenn wir googeln, wird uns eine Liste dieser Tools angezeigt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn man fragt, was CI ist, dann erz\u00e4hlen sie Ihnen sofort nach der Aufz\u00e4hlung der Werkzeuge, dass CI bedeutet, dass beim Pull Request von einem Commit ein Build und Testdurchlauf erfolgt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuous Integration handelt nicht von Werkzeugen, nicht von Builds mit Tests im Branch! Continuous Integration ist eine Praxis der sehr h\u00e4ufigen Integration neuen Codes, und daf\u00fcr ist es \u00fcberhaupt nicht notwendig, Jenkins, GitLab usw. aufzubauen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bevor wir uns anschauen, wie ein vollst\u00e4ndiges CI aussieht, lassen Sie uns zun\u00e4chst in den Kontext der Leute eintauchen, die das erfunden haben, und das Schmerzgef\u00fchl nachvollziehen, das sie zu l\u00f6sen versuchten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sie wollten das Problem der gemeinsamen Arbeit im Team l\u00f6sen!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Schauen wir uns an, mit welchen Schwierigkeiten Entwickler bei der Teamarbeit konfrontiert sind. Angenommen, wir haben ein Projekt, den Master-Branch in Git und zwei Entwickler.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und sie fangen an zu arbeiten, wie es seit langem \u00fcblich ist. Sie nehmen eine Aufgabe im JIRA, erstellen einen Feature-Branch und schreiben Code.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Einer hat die Funktion schneller fertiggestellt und hat in den Master gemergt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der andere ben\u00f6tigte mehr Zeit, er hat sp\u00e4ter gemergt und erhielt einen Konflikt. Jetzt verbringt der Entwickler, anstatt die notwendigen gesch\u00e4ftlichen Funktionen zu schreiben, seine Zeit und Energie mit der Behebung von Konflikten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je komplizierter es ist, Ihr Feature mit dem Haupt-Repository zu verbinden, desto mehr Zeit investieren wir daf\u00fcr. Und das ist noch ein relativ einfaches Beispiel. Das ist ein Beispiel, bei dem es nur zwei Entwickler gibt. Stellen Sie sich vor, wenn in einem Unternehmen 10, 15 oder 100 Leute in ein und dasselbe Repository schreiben. Sie werden verr\u00fcckt, all diese Konflikte zu l\u00f6sen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt einen etwas anderen Fall. Wir haben einen Haupt-Branch und mehrere Entwickler, die etwas tun.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sie haben jeweils einen Branch erstellt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Einer hat seine \u00c4nderungen gemergt, alles gut, Aufgabe abgegeben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der zweite Entwickler hat in der Zwischenzeit seine Aufgabe abgeschlossen. Angenommen, er hat sie zur \u00dcberpr\u00fcfung eingereicht. In vielen Unternehmen gibt es die Praxis \u2013 die \u00dcberpr\u00fcfung. Einerseits ist diese Praxis gut und n\u00fctzlich, andererseits bremst sie uns oft. Wir wollen nicht darauf eingehen, aber das ist ein hervorragendes Beispiel daf\u00fcr, wohin eine fehlgeleitete \u00dcberpr\u00fcfung f\u00fchren kann. Sie haben einen Pull-Request zur \u00dcberpr\u00fcfung eingereicht. Der Entwickler hat nichts mehr zu tun. Was f\u00e4ngt er an zu tun? Er beginnt, andere Aufgaben zu \u00fcbernehmen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In der Zwischenzeit hat der zweite Entwickler noch etwas gemacht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der erste hat die dritte Aufgabe erledigt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und nach einer gewissen Zeit wurde sein Review bearbeitet und er versucht, sich zu mergen. Und was passiert? Er ger\u00e4t in eine riesige Menge an Konflikten. Warum? Weil, w\u00e4hrend sein Pull-Request zur \u00dcberpr\u00fcfung anh\u00e4ngig war, sich im Code bereits vieles ge\u00e4ndert hat. <\/p>\n<p><\/p>\n<p>Neben der Konfliktgeschichte gibt es auch eine Kommunikationsgeschichte. Solange Ihr Branch zur \u00dcberpr\u00fcfung anh\u00e4ngt, w\u00e4hrend er auf etwas wartet und Sie lange an einem Feature arbeiten, h\u00f6ren Sie auf zu verfolgen, was sich in der Codebasis Ihres Dienstes noch \u00e4ndert. M\u00f6glicherweise haben andere das, was Sie jetzt zu l\u00f6sen versuchen, bereits gestern gel\u00f6st, und Sie k\u00f6nnten eine Methode wiederverwenden. Aber das werden Sie nicht sehen, weil Sie immer mit einem veralteten Branch arbeiten. Und dieser veraltete Branch f\u00fchrt immer dazu, dass Sie einen Merge-Konflikt l\u00f6sen m\u00fcssen. <\/p>\n<p><\/p>\n<p>Es ergibt sich also, dass wenn wir im Team arbeiten, d. h. wenn nicht nur eine Person im Repository arbeitet, sondern 5-10 Personen, desto l\u00e4nger wir unseren Code nicht in den Haupt-Branch einf\u00fcgen, desto mehr leiden wir darunter, dass wir letztendlich etwas mergen m\u00fcssen. Und je mehr Konflikte wir haben und je \u00e4lter die Version ist, mit der wir arbeiten, desto mehr Probleme haben wir.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gemeinsam etwas zu tun ist schmerzhaft! Wir behindern uns immer gegenseitig. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dieses Problem wurde vor \u00fcber 20 Jahren erkannt. Die erste Erw\u00e4hnung der Continuous Integration-Praktik fand ich im Extreme Programming.<\/p>\n<p><\/p>\n<p>Extreme Programming ist das erste Agile Framework. Die Seite erschien im Jahr 1996. Die Idee war, bestimmte Programmier- und Planungspraktiken zu verwenden, um die Entwicklung so flexibel wie m\u00f6glich zu gestalten, damit wir schneller auf \u00c4nderungen und Anforderungen unserer Kunden reagieren k\u00f6nnen. Vor 24 Jahren begannen sie, mit der Herausforderung umzugehen, dass, wenn man etwas sehr lange und isoliert macht, man daf\u00fcr mehr Zeit aufwendet, weil es zu Konflikten kommt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt werden wir den Begriff \u201eContinuous Integration\u201c Wort f\u00fcr Wort durchgehen. \u00dcbersetzt man es w\u00f6rtlich, bedeutet es kontinuierliche Integration. Aber wie kontinuierlich es wirklich ist, ist unklar; es ist tats\u00e4chlich sehr unterbrochen. Auch wie viel Integration darin steckt, ist nicht ganz offensichtlich. <\/p>\n<p><\/p>\n<p>Und deshalb bringe ich Ihnen jetzt Zitate aus dem Extreme Programming. Wir werden beide Begriffe getrennt analysieren. <\/p>\n<p><\/p>\n<p>Integration \u2013 wie ich bereits sagte, streben wir an, dass jeder Ingenieur mit der aktuellsten Version des Codes arbeitet, sodass er seinen Code so oft wie m\u00f6glich in den Hauptzweig einf\u00fcgt und dass es kleine Zweige sind. Denn wenn sie gro\u00df sind, k\u00f6nnen wir leicht eine Woche mit Merge-Konflikten stecken bleiben. Besonders, wenn wir einen langen Entwicklungszyklus wie Waterfall haben, bei dem ein Entwickler einen Monat damit verbringt, eine riesige Funktion zu entwickeln. Und w\u00e4hrend der Integrationsphase kann er sehr lange stecken bleiben. <\/p>\n<p><\/p>\n<p>Integration \u2013 das ist, wenn wir unseren Branch nehmen und ihn mit dem Master integrieren, wir ihn zusammenf\u00fchren. Es gibt einen ultimativen Ansatz, bei dem wir als Transbase-Entwickler anstreben, direkt im Master zu schreiben, ohne unn\u00f6tige Branches.<\/p>\n<p><\/p>\n<p>Zusammengefasst ist Integration das \u00dcbernehmen des eigenen Codes und das Bereitstellen im Master. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was bedeutet hier das Wort \u201econtinuous\u201c, was wird unter Kontinuit\u00e4t verstanden? Die Praxis sieht vor, dass der Entwickler seinen Code so schnell wie m\u00f6glich integriert. Das ist sein Ziel bei jeder Aufgabe \u2013 daf\u00fcr zu sorgen, dass sein Code so schnell wie m\u00f6glich in den Master kommt. In einer idealen Welt w\u00fcrden die Entwickler dies alle paar Stunden tun. Das hei\u00dft, du nimmst dir eine kleine Aufgabe, merge sie in den Master. Alles l\u00e4uft wunderbar. Darauf strebst du hin. Und das muss kontinuierlich geschehen. Sobald du etwas gemacht hast, dr\u00fcckst du es sofort in den Master. <\/p>\n<p><\/p>\n<p>Und der Entwickler, der etwas macht, ist daf\u00fcr verantwortlich, dass es funktioniert und nichts kaputt gemacht wird. Hier kommt normalerweise das Thema Tests ins Spiel. Wir m\u00f6chten einige Tests f\u00fcr unser Commit, f\u00fcr unser Merge durchf\u00fchren, um sicherzustellen, dass es funktioniert. Hierbei kann Ihnen Jenkins wirklich helfen.<\/p>\n<p><\/p>\n<p>Aber bei den Geschichten: Lass uns die \u00c4nderungen klein halten, lass uns die Aufgaben klein halten, lass uns die Aufgabe erledigen und sie sofort versuchen, in den Master zu mergen \u2013 da helfen dir keine Jenkins. Denn Jenkins hilft dir ausschlie\u00dflich, die Tests auszuf\u00fchren. <\/p>\n<p><\/p>\n<p>Du kannst auch ohne sie auskommen. Das wird dir nicht schaden. Denn das Ziel der Praxis ist es, so oft wie m\u00f6glich zu mergen, um nicht viel Zeit mit zuk\u00fcnftigen Konflikten zu verschwenden. <\/p>\n<p><\/p>\n<p>Stell dir vor, wir haben das Jahr 2020 aus irgendeinem Grund ohne Internet. Und wir arbeiten lokal. Wir haben kein Jenkins. Das ist in Ordnung. Du kannst immer noch einen lokalen Branch erstellen. Du hast dort einen bestimmten Code geschrieben. Hast die Aufgabe in 3-4 Stunden erledigt. Bist zu Master gewechselt, hast git pull gemacht, und hast deinen Branch dort gemerged. Fertig. Wenn du das oft machst \u2013 herzlichen Gl\u00fcckwunsch, du hast Continuous Integration!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Welche Beweise gibt es in der modernen Welt daf\u00fcr, dass es sich lohnt, Kr\u00e4fte darauf zu verwenden? Denn im Gro\u00dfen und Ganzen ist es kompliziert. Wenn du versuchst, so zu arbeiten, wirst du feststellen, dass du jetzt irgendwie mit der Planung konfrontiert wirst und mehr Zeit mit der Dekomposition von Aufgaben verbringen musst. Denn wenn du man\u2026 machst, wirst du nicht schnell mergen k\u00f6nnen und als Ergebnis in Schwierigkeiten geraten. Dann gibt es keine Praxis mehr. <\/p>\n<p><\/p>\n<p>Und das wird teuer. Ab morgen direkt mit Continuous Integration zu arbeiten, wird nicht m\u00f6glich sein. Ihr werdet alle sehr lange brauchen, um euch daran zu gew\u00f6hnen, die Aufgaben zu dekomponieren, sehr lange brauchen, um euch daran zu gew\u00f6hnen, die Review-Praxis zu \u00e4ndern, falls ihr diese habt. Denn unser Ziel ist es, dass es heute gemerged wird. Wenn ihr jedoch drei Tage f\u00fcr die Review braucht, habt ihr Probleme und es funktioniert nicht mit Continuous Integration. <\/p>\n<p><\/p>\n<p>Aber gibt es irgendwelche aktuellen Beweise, die uns direkt jetzt sagen, dass es sinnvoll ist, in diese Praxis zu investieren?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das Erste, was mir in den Sinn kam, war der State of DevOps. Diese Studie wird seit 7 Jahren von einem Team durchgef\u00fchrt. Momentan machen sie das als unabh\u00e4ngige Organisation, aber unter Google.<\/p>\n<p><\/p>\n<p>Und ihre Studie im Jahr 2018 zeigte eine Korrelation zwischen Unternehmen, die kurze Branches verwenden, die schnell und h\u00e4ufig integriert werden. Diese Unternehmen haben viel bessere IT-Leistungskennzahlen.<\/p>\n<p><\/p>\n<p>Was sind das f\u00fcr Kennzahlen? Es handelt sich um 4 Metriken, die sie in ihren Umfragen von allen Unternehmen erfassen: Deployment-Frequenz, Vorlaufzeit f\u00fcr \u00c4nderungen, Wiederherstellungszeit des Dienstes, \u00c4nderungsfehlerrate.<\/p>\n<p><\/p>\n<p>Und erstens gibt es diese Korrelation, wir wissen, dass Unternehmen, die h\u00e4ufig mergen, viel bessere Metriken haben. Sie haben die Unternehmen in mehrere Kategorien unterteilt: langsame Unternehmen, die etwas langsam produzieren, Mittelm\u00e4\u00dfige, Hochleister und die Elite. Die Elite sind Netflix, Amazon, die super schnell sind, alles schnell, sch\u00f6n und qualitativ hochwertig machen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die zweite Geschichte, die vor einem Monat passiert ist. Im Technology Radar erschien ein wunderbarer Artikel \u00fcber Gitflow. Gitflow unterscheidet sich von allen anderen dadurch, dass seine Branches lange leben. Es gibt Release-Branches, die lange leben, und Feature-Branches, die ebenfalls lange leben. Diese Praxis wurde im Technology Radar in den HOLD-Status versetzt. Warum? Weil die Leute mit den Schwierigkeiten der Integration konfrontiert sind. <\/p>\n<p><\/p>\n<p>Wenn deine Branch sehr lange lebt, ger\u00e4t sie in die Irre und wird veraltet, wir beginnen mehr Zeit damit zu verbringen, irgendeine \u00c4nderung zu integrieren. <\/p>\n<p><\/p>\n<p>Und k\u00fcrzlich sagte der Autor von Gitflow, dass, wenn Sie auf Continuous Integration abzielen und m\u00f6chten, dass Sie so oft wie m\u00f6glich integrieren, Gitflow eine schlechte Idee ist. Er f\u00fcgte in einem separaten Artikel hinzu, dass, wenn Sie ein Backend haben, auf das Sie hinarbeiten k\u00f6nnen, Gitflow f\u00fcr Sie \u00fcberfl\u00fcssig ist, da es Sie verlangsamen und Integrationsprobleme verursachen kann. <\/p>\n<p><\/p>\n<p>Das bedeutet jedoch nicht, dass Gitflow schlecht ist und dass man es nicht nutzen sollte. Es ist f\u00fcr andere F\u00e4lle geeignet. Zum Beispiel, wenn Sie mehrere Versionen eines Dienstes oder einer Anwendung unterst\u00fctzen m\u00fcssen, d. h. wenn Sie \u00fcber einen l\u00e4ngeren Zeitraum hinweg Support bieten m\u00fcssen. <\/p>\n<p><\/p>\n<p>Aber wenn Sie mit Menschen sprechen, die solche Dienste unterst\u00fctzen, werden Sie viel dar\u00fcber h\u00f6ren, dass diese Version 3.2 gewesen ist, die vor 4 Monaten war, und dass dieser Fix nicht enthalten war. Jetzt muss man viele \u00c4nderungen vornehmen, um ihn zu integrieren. Und schon stecken sie wieder fest und k\u00e4mpfen eine Woche lang darum, eine neue Funktion zu mergen. <\/p>\n<p><\/p>\n<p>Wie Alexander Kowalew richtig im Chat bemerkte, ist Korrelation nicht gleich Ursache und Wirkung. Das ist richtig. Das hei\u00dft, es gibt keine direkte Verbindung, dass, wenn Sie Continuous Integration haben, all Ihre Metriken gro\u00dfartig sind. Aber es gibt eine positive Korrelation, dass, wenn das eine zutrifft, das andere wahrscheinlich auch zutrifft. Es ist keine Tatsache, aber h\u00f6chstwahrscheinlich. Es ist nur eine Korrelation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration als Praxis, nicht Jenkins. Andrei Alexandrow\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es scheint, als ob wir bereits etwas tun und mergen, aber wie k\u00f6nnen wir feststellen, dass wir tats\u00e4chlich Continuous Integration haben und gen\u00fcgend oft mergen?<\/p>\n<p><\/p>\n<p>Jez Humble ist der Autor des Handbuchs, von Accelerate, der Website f\u00fcr Continuous Delivery und des Buches 'Continuous Delivery'. Er schl\u00e4gt diesen Test vor:<\/p>\n<p><\/p>\n<ul>\n<li>Der Code eines Ingenieurs gelangt t\u00e4glich in den Master. <\/li>\n<li>Bei jedem Commit f\u00fchren Sie Unit-Tests durch.<\/li>\n<li>Der Build im Master ist ausgefallen, und er wurde innerhalb von etwa 10 Minuten repariert.<\/li>\n<\/ul>\n<p><\/p>\n<p>Er schl\u00e4gt vor, diesen Test zu verwenden, um sicherzustellen, dass Sie die Praxis tats\u00e4chlich haben. <\/p>\n<p><\/p>\n<p>Das Letzte finde ich ein wenig umstritten. Das hei\u00dft, wenn Sie in der Lage sind, innerhalb von 10 Minuten zu reparieren, haben Sie Continuous Integration, was meiner Meinung nach ein wenig seltsam klingt, aber es macht Sinn. Warum? Weil, wenn Sie h\u00e4ufig mergen, bedeutet das, dass Ihre \u00c4nderungen klein sind. Wenn eine kleine \u00c4nderung dazu f\u00fchrt, dass Ihr Master-Build kaputt geht, werden Sie schnell einen Fehler finden k\u00f6nnen, weil die \u00c4nderung geringf\u00fcgig ist. Nehmen wir an, Sie hatten ein kleines Mergen, bei dem sich 20-30 Zeilen ge\u00e4ndert haben. Dementsprechend k\u00f6nnen Sie schnell verstehen, was das Problem war, weil die \u00c4nderungen winzig sind und Sie ein sehr kleines Suchfeld f\u00fcr das Problem haben. <\/p>\n<p><\/p>\n<p>Und selbst wenn unser Prod nach dem Release zusammenbricht, wenn wir die Continuous-Integration-Praxis haben, wird es uns viel einfacher fallen zu handeln, weil die \u00c4nderungen gering sind. Ja, das wird die Planung betreffen. Es wird schmerzhaft sein. Und wahrscheinlich ist das Schwierigste an dieser Praxis, sich daran zu gew\u00f6hnen, Aufgaben zu zerlegen, d.h. wie man etwas nimmt und es in ein paar Stunden fertigstellt und dabei eine \u00dcberpr\u00fcfung durchl\u00e4uft, wenn Sie eine haben. Die \u00dcberpr\u00fcfung ist ein separates \u00dcbel. <\/p>\n<p><\/p>\n<p>Unit-Tests sind einfach ein Helfer, der Ihnen hilft zu verstehen, ob Ihre Integration erfolgreich war, ob nichts kaputt gegangen ist. Meiner Meinung nach ist das nicht ganz zwingend erforderlich, denn der Sinn der Praxis liegt nicht darin. <\/p>\n<p><\/p>\n<p>Das ist eine kurze Einf\u00fchrung in Continuous Integration. Das ist alles, was es in dieser Praxis gibt. Ich bin bereit f\u00fcr Fragen. <\/p>\n<p><\/p>\n<p>Zusammenfassend m\u00f6chte ich noch einmal die Ergebnisse zusammenfassen:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration ist nicht Jenkins, es ist nicht Gitlab.<\/li>\n<li>Es ist kein Werkzeug, es ist eine Praxis, bei der wir unseren Code so oft wie m\u00f6glich in den Master mergen. <\/li>\n<li>Wir tun dies, um enorme Schmerzen zu vermeiden, die in Zukunft durch Merges entstehen, d.h. wir erfahren jetzt einen kleinen Schmerz, um in Zukunft keinen gro\u00dfen zu empfinden. Darin liegt der ganze Sinn. <\/li>\n<li>Von der Seite her passiert die Kommunikation durch den Code, aber ich sehe das sehr selten, obwohl es auch daf\u00fcr gedacht ist.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Fragen<\/strong><\/p>\n<p><\/p>\n<p><em>Was ist mit Aufgaben, die nicht zerlegt werden k\u00f6nnen?<\/em><\/p>\n<p><\/p>\n<p>Zerlegen. Was ist das Problem? K\u00f6nnen Sie ein Beispiel geben, wo es eine Aufgabe gibt, die sich nicht zerlegen l\u00e4sst?<\/p>\n<p><\/p>\n<p><em>Es gibt solche Aufgaben, die von \u201e\u00fcberhaupt nicht\u201c nicht zerlegt werden k\u00f6nnen, zum Beispiel solche, die sehr tiefes Fachwissen erfordern und die tats\u00e4chlich \u00fcber einen Monat bis zu einem bestimmten akzeptablen Ergebnis bearbeitet werden m\u00fcssen.<\/em> <\/p>\n<p><\/p>\n<p>Wenn ich dich richtig verstanden habe, gibt es eine gro\u00dfe und komplexe Aufgabe, deren Ergebnis erst in einem Monat sichtbar sein wird.<\/p>\n<p><\/p>\n<p><em>Ja, das ist korrekt. Ja, das Ergebnis kann fr\u00fchestens in einem Monat bewertet werden.<\/em> <\/p>\n<p><\/p>\n<p>Gut. Insgesamt ist das kein Problem. Warum? Weil wir in diesem Fall, wenn wir \u00fcber Branches sprechen, nicht \u00fcber eine Branch mit einer Funktion reden. Funktionen k\u00f6nnen gro\u00df und komplex sein. Sie k\u00f6nnen viele Komponenten betreffen. Und vielleicht k\u00f6nnen wir sie nicht vollst\u00e4ndig in einer Branch umsetzen. Das ist in Ordnung. Wir m\u00fcssen diese Geschichte einfach aufteilen. Wenn die Funktion bis zum Ende nicht fertig ist, bedeutet das nicht, dass bestimmte Teile ihres Codes nicht zusammengef\u00fchrt werden k\u00f6nnen. Du hast zum Beispiel eine Migration hinzugef\u00fcgt und innerhalb der Funktion gibt es bestimmte Phasen. Du hast, sagen wir, eine Phase - die Migration zu machen, eine neue Methode hinzuzuf\u00fcgen. Und diese Dinge kannst du bereits t\u00e4glich zusammenf\u00fchren. <\/p>\n<p><\/p>\n<p><em>Gut. Was ist der Sinn davon?<\/em><\/p>\n<p><\/p>\n<p>Was bringt es, kleine Dinge t\u00e4glich zusammenzuf\u00fchren?<\/p>\n<p><\/p>\n<p><em>Ja.<\/em><\/p>\n<p><\/p>\n<p>Wenn sie dir etwas kaputt gemacht haben, siehst du das sofort. Du hast ein kleines St\u00fcck, das etwas kaputt gemacht hat, und es ist einfacher, das zu reparieren. Der Sinn ist, dass es viel einfacher ist, jetzt ein kleines St\u00fcck zusammenzuf\u00fchren, als in ein paar Wochen etwas Gro\u00dfes zusammenzuf\u00fchren. Und ein dritter Grund ist, dass andere Ingenieure mit der bereits aktuellen Version des Codes arbeiten werden. Sie werden sehen, dass hier einige Migrationen hinzugef\u00fcgt wurden und dort eine Methode erschien, die sie m\u00f6glicherweise auch nutzen m\u00f6chten. Jeder wird sehen, was in deinem Code passiert. Genau aus diesen drei Gr\u00fcnden wird diese Praxis durchgef\u00fchrt. <\/p>\n<p><\/p>\n<p><em>Danke, die Frage ist damit gekl\u00e4rt!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Darf ich noch etwas hinzuf\u00fcgen? Du hast alles richtig gesagt, ich m\u00f6chte nur einen Satz erg\u00e4nzen.<\/em><\/p>\n<p><\/p>\n<p>Okay.<\/p>\n<p><\/p>\n<p><em>Bei Continuous Integration wird der Code nicht zusammengef\u00fchrt, wenn die Funktion vollst\u00e4ndig bereit ist, sondern wenn der Build nicht mehr fehlschl\u00e4gt. Und ihr k\u00f6nnt so oft ihr wollt t\u00e4glich in den Master committen. Ein zweiter Aspekt - wenn ihr aus irgendeinem Grund die monatliche Aufgabe nicht in Aufgaben von mindestens drei Tagen aufteilen k\u00f6nnt, ich schweige von drei Stunden, dann habt ihr ein gro\u00dfes Problem. Und die Tatsache, dass ihr keine Continuous Integration habt - das ist das geringste dieser Probleme. Das bedeutet, dass ihr Probleme mit der Architektur habt und eure Ingenieurpraktiken gleich null sind. Denn selbst wenn es sich um Forschung handelt, muss das immer noch in Form von Hypothesen oder Zyklen strukturiert werden.<\/em> <\/p>\n<p><\/p>\n<p><em>Wir haben \u00fcber 4 Metriken gesprochen, die erfolgreiche Unternehmen von den weniger erfolgreichen unterscheiden. Man muss erst einmal zu diesen 4 Metriken kommen. Wenn du durchschnittlich einen Monat f\u00fcr eine Aufgabe brauchst, w\u00fcrde ich mich zuerst auf diese Metrik konzentrieren. Ich w\u00fcrde sie zun\u00e4chst auf 3 Tage reduzieren. Und danach w\u00fcrde ich anfangen, \u00fcber Continuous nachzudenken.<\/em><\/p>\n<p><\/p>\n<p>Habe ich dich richtig verstanden, dass du denkst, dass es im Allgemeinen keinen Sinn macht, in Ingenieurl\u00f6sungen zu investieren, wenn du f\u00fcr jede Aufgabe einen Monat ben\u00f6tigst?<\/p>\n<p><\/p>\n<p><em>Du hast Continuous Integration. Und da gibt es das Thema, dass du innerhalb von 10 Minuten entweder eine Korrektur \u00fcbernimmst oder zur\u00fccksetzt. Stell dir vor, du hast es ausgef\u00fchrt. Angenommen, du hast sogar ein Continuous Deployment, du hast es auf Prod ausgef\u00fchrt und hast erst danach bemerkt, dass etwas nicht stimmt. Und du musst es zur\u00fccksetzen, aber deine Datenbankmigration hat bereits stattgefunden. Deine Datenbankstruktur ist schon auf die n\u00e4chste Version, und dar\u00fcber hinaus wurde auch ein Backup durchgef\u00fchrt, in das bereits Daten geschrieben wurden.<\/em><\/p>\n<p><\/p>\n<p><em>Und was f\u00fcr eine Alternative hast du? Wenn du den Code zur\u00fccksetzt, kann er mit dieser aktualisierten Datenbank nicht mehr funktionieren.<\/em><\/p>\n<p><\/p>\n<p>Die Datenbank bewegt sich nur vorw\u00e4rts, ja. <\/p>\n<p><\/p>\n<p><em>Bei Leuten mit schlechter Ingenieurausbildung haben sie wahrscheinlich auch kein dickes Buch \u00fcber ... gelesen. Was macht man mit Backups? Wenn du aus einem Backup wiederherstellst, verlierst du die Daten, die sich in der Zwischenzeit angesammelt haben. Zum Beispiel hast du drei Stunden mit der neuen Version der Datenbank gearbeitet, in die sich Benutzer registriert haben. Du greifst auf das alte Backup zur\u00fcck, weil mit der neuen Version die Struktur nicht funktioniert, folglich hast du diese Benutzer verloren. Und sie sind unzufrieden, sie beschweren sich.<\/em><\/p>\n<p><\/p>\n<p><em>Um ein umfassendes Spektrum an Praktiken zu beherrschen, die Continuous Integration und Continuous Delivery unterst\u00fctzen, reicht es nicht aus, einfach nur zu lernen, wie man schreibt \u2026. Erstens k\u00f6nnte es sehr viele werden, was unpraktisch w\u00e4re. Au\u00dferdem gibt es viele andere Praktiken, zum Beispiel Scientific. Es gibt eine Praxis, die von GitHub zu seiner Zeit popul\u00e4r gemacht wurde. Dabei wird gleichzeitig alter und neuer Code ausgef\u00fchrt. Es handelt sich um eine unvollendete Funktion, die jedoch einen Wert zur\u00fcckgeben kann: entweder als Funktion oder als REST API. Du f\u00fchrst sowohl den neuen als auch den alten Code aus und vergleichst die Unterschiede zwischen ihnen. Wenn es Unterschiede gibt, protokollierst du dieses Ereignis. So wei\u00dft du, dass deine neue Funktion bereit ist, anstelle der alten bereitgestellt zu werden, wenn es w\u00e4hrend eines bestimmten Zeitraums keine Abweichungen zwischen diesen beiden gibt.<\/em> <\/p>\n<p><\/p>\n<p><em>Es gibt Hunderte solcher Praktiken. Ich w\u00fcrde vorschlagen, mit transbase development zu beginnen. Es ist nicht zu 100 % auf Continuous Integration ausgerichtet, aber die Praktiken sind dieselben, und eins kann ohne das andere nicht gut funktionieren.<\/em> <\/p>\n<p><\/p>\n<p>Hast du transbase development als Beispiel genannt, wo man Praktiken anschauen kann, oder schl\u00e4gst du vor, dass die Leute transbase development nutzen?<\/p>\n<p><\/p>\n<p><em>Schauen, da sie es nicht benutzen k\u00f6nnen. Um es zu verwenden, muss man viel lesen. Und wenn bei einer Person die Frage auftaucht: \u201eWas soll ich mit einer Funktion machen, die einen Monat dauert?\u201c, bedeutet das, dass sie nicht \u00fcber transbase development gelesen hat. Ich w\u00fcrde es auch nicht empfehlen. Ich w\u00fcrde vorschlagen, sich ausschlie\u00dflich darauf zu konzentrieren, wie man gro\u00dfe Aufgaben architektonisch korrekt in kleinere aufteilen kann. Das ist die Essenz der Dekomposition.<\/em><\/p>\n<p><\/p>\n<p><em>Dekomposition ist eines der Werkzeuge des Architekten. Zuerst machen wir eine Analyse, dann Dekomposition, dann Synthese und schlie\u00dflich Integration. So f\u00fcgen wir alles zusammen. Und um zur Continuous Integration zu kommen, muss man zuerst durch die Dekomposition wachsen. Zu Beginn treten Fragen auf, und wir sprechen bereits \u00fcber die vierte Phase, d.h. je h\u00e4ufiger man integriert, desto besser. Es ist noch zu fr\u00fch, um es zu tun; es w\u00e4re besser, zuerst das eigene Monolithen zu zerschneiden.<\/em> <\/p>\n<p><\/p>\n<p><em>Es m\u00fcssen ein paar Pfeile und Quadrate in irgendeinem Diagramm gezeichnet werden. Du kannst nicht sagen, dass ich dir jetzt das Architekturdiagramm der neuen Anwendung zeige und ein Quadrat zeige, in dem ein gr\u00fcner Knopf f\u00fcr die Anwendung ist. Auf jeden Fall wird es mehr Quadrate und Pfeile geben. In jedem Diagramm, das ich gesehen habe, gab es mehr als eines. Die Dekomposition wird sogar auf der Ebene der grafischen Darstellung bereits durchgef\u00fchrt. Daher k\u00f6nnen die Quadrate unabh\u00e4ngig gemacht werden. Wenn nicht, dann habe ich gro\u00dfe Fragen an den Architekten.<\/em> <\/p>\n<p><\/p>\n<p>Es gibt eine Frage aus dem Chat: \"Wenn das Review zwingend erforderlich ist und lange dauert, einen Tag oder l\u00e4nger?\".<\/p>\n<p><\/p>\n<p>Ihr habt Probleme mit der Praxis. Ein Review sollte nicht einen Tag oder l\u00e4nger dauern. Das ist die gleiche Geschichte wie bei der vorherigen Frage, nur etwas milder. Wenn das Review einen Tag dauert, bedeutet das wahrscheinlich, dass es sich um eine sehr gro\u00dfe \u00c4nderung handelt. Das bedeutet, man sollte kleinere \u00c4nderungen vornehmen. In der Transbase-Entwicklung, die Oleg empfohlen hat, gibt es eine Geschichte, die kontinuierliches Review genannt wird. Die Idee dahinter ist, dass wir absichtlich so kleine Pull-Requests machen, weil wir immer wieder und in kleinen Schritten zusammenf\u00fchren wollen. Daher \u00e4ndert der Pull-Request eine Abstraktion oder vielleicht 10 Zeilen. Dadurch dauert unser Review nur ein paar Minuten. <\/p>\n<p><\/p>\n<p>Wenn das Review einen Tag oder l\u00e4nger dauert, ist etwas nicht in Ordnung. Erstens k\u00f6nnten Sie Probleme mit der Architektur haben. Oder es handelt sich um ein gro\u00dfes St\u00fcck Code, sagen wir 1.000 Zeilen. Oder Ihre Architektur ist so komplex, dass es schwierig ist, sie zu verstehen. Das ist ein Problem, das gel\u00f6st werden muss. Vielleicht brauchen Sie \u00fcberhaupt kein Review. Dar\u00fcber sollten Sie auch nachdenken. Das Review ist das, was Sie ausbremst. Es hat insgesamt seine Vorteile, aber Sie m\u00fcssen verstehen, warum Sie es machen. Ist es f\u00fcr Sie eine M\u00f6glichkeit, schnell Informationen zu \u00fcbermitteln, oder ist es eine M\u00f6glichkeit, bestimmte Standards zu setzen? Warum brauchen Sie das? Denn Reviews sollten entweder sehr schnell sein oder ganz abgeschafft werden. Das ist wie die Transbase-Entwicklung \u2013 eine sehr sch\u00f6ne Geschichte, aber nur f\u00fcr erfahrene Leute. <\/p>\n<p><\/p>\n<p>Was die 4 Metriken betrifft, w\u00fcrde ich trotzdem empfehlen, sie zu erfassen, um zu verstehen, wohin das f\u00fchrt. Sehen Sie sich die Zahlen an, schauen Sie sich das Bild an, wie schlecht es ist. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Ich bin bereit, dieses Thema mit dir zu diskutieren. Zahlen und Metriken sind toll, Praktiken sind gro\u00dfartig. Aber man muss verstehen, ob das f\u00fcr das Gesch\u00e4ft notwendig ist. Es gibt Unternehmen, die nicht so schnell \u00c4nderungsprozesse ben\u00f6tigen. Ich kenne Firmen, in denen man nicht alle 15 Minuten \u00c4nderungen vornehmen kann. Und das liegt nicht daran, dass sie schlecht sind. Es ist ein bestimmter Lebenszyklus. Und um Funktionen wie Branches oder Toggles einzuf\u00fchren, sind tiefgehende Kenntnisse erforderlich.<\/em> <\/p>\n<p><\/p>\n<p>Es ist kompliziert. Wenn du mehr \u00fcber die Geschichte von Feature Toggles lesen m\u00f6chtest, kann ich dir das sehr empfehlen. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Und es gibt einen hervorragenden Artikel von Martin Fowler \u00fcber Feature Toggles: \u00fcber die verschiedenen Typen, Lebenszyklen usw. Feature Toggles sind komplex. <\/p>\n<p><\/p>\n<p><em>Und du hast die Frage nicht beantwortet: \u201eBraucht man Jenkins oder nicht?\u201c<\/em><\/p>\n<p><\/p>\n<p>Jenkins ist in Wahrheit auf keinen Fall notwendig. Wenn ich ehrlich bin, werden dir Werkzeuge wie Jenkins und Gitlab mehr Komfort bieten. Du wirst sehen, ob der Build erfolgreich war oder nicht. Sie k\u00f6nnen helfen, aber sie werden dir keine Praktiken vermitteln. Sie k\u00f6nnen dir nur ein kleines Zeichen geben \u2013 ok, nicht ok. Und das gilt, wenn du auch Tests schreibst, denn ohne Tests ist es fast sinnlos. Daher ist es n\u00fctzlich, weil es praktischer ist, aber im Allgemeinen kann man auch ohne leben, man verliert nicht viel. <\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, wenn du Praktiken hast, brauchst du es dann nicht?<\/em><\/p>\n<p><\/p>\n<p>Ganz genau. Ich empfehle den Test von Jez Humble. Da habe ich zu dem letzten Punkt eine zwiesp\u00e4ltige Meinung. Aber im Allgemeinen, wenn du drei Dinge hast: du mergen st\u00e4ndig, du f\u00fchrst Tests bei Commits im Master aus und reparierst schnell den Build im Master, dann brauchst du vielleicht nicht mehr. <\/p>\n<p><\/p>\n<p><em>W\u00e4hrend wir auf Fragen von den Teilnehmern warten, habe ich eine Frage. Wir haben jetzt \u00fcber Produktcode gesprochen. Hast du auch f\u00fcr Infrastrukturcode verwendet? Ist das derselbe Code, hat er dieselben Prinzipien und denselben Lebenszyklus, oder gibt es dort andere Lebenszyklen und Prinzipien? \u00dcblicherweise, wenn alle \u00fcber Continuous Integration und Development sprechen, vergessen sie, dass es auch Infrastrukturcode gibt. Und in letzter Zeit wird es immer mehr davon. Sollten all diese Regeln auch dort gelten?<\/em><\/p>\n<p><\/p>\n<p>Es ist nicht nur so, dass es sinnvoll w\u00e4re, es w\u00e4re gro\u00dfartig, denn es w\u00fcrde das Leben sicher genauso erleichtern. Sobald wir mit Code arbeiten, nicht mit Bash-Skripten, sondern wenn wir richtigen Code haben.<\/p>\n<p><\/p>\n<p><em>Stopp, stopp, ein Bash-Skript ist auch Code. Fass meine alte Liebe nicht an.<\/em> <\/p>\n<p><\/p>\n<p>Gut, ich werde deine Erinnerungen nicht treten. Ich habe eine pers\u00f6nliche Abneigung gegen Bash. Es bricht auf h\u00e4ssliche und furchterregende Weise st\u00e4ndig. Und es bricht oft unvorhersehbar, daher mag ich es nicht so sehr. Aber gut, nehmen wir an, du hast Code in Bash. Vielleicht habe ich wirklich keine Ahnung und es gibt vern\u00fcnftige Test-Frameworks daf\u00fcr. Ich bin einfach nicht im Thema. Und wir bekommen die gleichen Vorteile.<\/p>\n<p><\/p>\n<p>Sobald wir mit Infrastruktur wie mit Code arbeiten, bekommen wir all die gleichen Probleme wie Entwickler. Vor ein paar Monaten hatte ich eine Situation, in der mir ein Kollege einen Pull-Request mit 1.000 Zeilen Bash geschickt hat. Und du h\u00e4ngst vier Stunden in der \u00dcberpr\u00fcfung fest. Die Probleme sind immer noch die gleichen. Es ist immer noch Code. Und immer noch Teamarbeit. Wir stecken bei Pull-Requests fest und h\u00e4ngen bei den gleichen Merge-Konflikten von Bash fest, zum Beispiel. <\/p>\n<p><\/p>\n<p>Ich schaue mir jetzt sehr aktiv das gesamte Thema an, um die Infrastruktur so sch\u00f6n wie m\u00f6glich zu programmieren. Ich habe gerade Pulumi in die Infrastruktur eingef\u00fchrt. Das ist Programmierung pur. Dort sieht es noch ansprechender aus, weil ich alle M\u00f6glichkeiten der Programmiersprache habe, d. h. ich habe mit denselben If-Anweisungen auf einfache Weise sch\u00f6ne Toggles erstellt und alles ist gut. Das hei\u00dft, meine \u00c4nderung ist bereits im Master. Jeder kann sie jetzt sehen. Andere Ingenieure sind dar\u00fcber informiert. Es hat bereits Einfluss gehabt. Aber es wurde nicht f\u00fcr alle Infrastrukturen aktiviert. Es wurde zum Beispiel f\u00fcr meine Testumgebungen aktiviert. Daher, um deine Frage nochmal zu beantworten, es ist notwendig. Es erleichtert unser Leben als Ingenieure, die mit Code arbeiten, auf die gleiche Weise. <\/p>\n<p><\/p>\n<p><em>Hat noch jemand Fragen?<\/em> <\/p>\n<p><\/p>\n<p>Ich habe eine Frage. Ich m\u00f6chte die Diskussion mit Oleg fortsetzen. Insgesamt denke ich, dass du recht hast, dass, wenn eine Aufgabe einen Monat dauert, du ein Problem mit der Architektur hast, ein Problem mit der Analyse, der Dekomposition, der Planung usw. Aber ich habe das Gef\u00fchl, dass, wenn du versuchst, nach Continuous Integration zu leben, du anf\u00e4ngst, die Schmerzen bei der Planung zu beheben, denn du kannst davon nicht mehr weg. <\/p>\n<p><\/p>\n<p><em>(Oleg) Ja, das ist so. In Bezug auf den Arbeitsaufwand ist diese Praxis mit jeder anderen ernsthaften Praxis vergleichbar, die die Kultur ver\u00e4ndert. Das Schwierigste bei der \u00dcberwindung sind die Gewohnheiten, insbesondere die schlechten Gewohnheiten. Und wenn es notwendig ist, dass die Gewohnheiten der Umgebung ge\u00e4ndert werden: Entwickler, Management, Produktionsleiter, dann erwartet Sie eine \u00dcberraschung.<\/em> <\/p>\n<p><\/p>\n<p><em>Welche \u00dcberraschungen k\u00f6nnte es geben? Angenommen, Sie haben beschlossen, dass Sie die Integration h\u00e4ufiger durchf\u00fchren werden. Und mit der Integration sind noch andere Dinge verbunden, nehmen wir an, Artefakte. In Ihrem Unternehmen gibt es beispielsweise die Richtlinie, dass jedes Artefakt auf irgendeine Weise in einem System zur Lagerung von Artefakten erfasst werden muss. Und das kostet eine gewisse Zeit. Eine Person muss ein H\u00e4kchen setzen, dass sie als Release-Manager dieses Artefakt auf die Betriebsbereitschaft f\u00fcr die Ver\u00f6ffentlichung in der Produktion getestet hat. Wenn das 5-10-15 Minuten dauert, aber Sie einmal pro Woche eine Ver\u00f6ffentlichung machen, dann einmal pro Woche eine halbe Stunde zu investieren \u2013 das ist eine geringe Steuer.<\/em> <\/p>\n<p><\/p>\n<p><em>Wenn Sie Continuous Integration 10 Mal am Tag durchf\u00fchren, m\u00fcssen Sie 10 Mal 30 Minuten multiplizieren. Und das \u00fcbersteigt die Arbeitszeit dieses Release-Managers. Er ist einfach m\u00fcde, das zu tun. Es gibt st\u00e4ndige Kosten f\u00fcr bestimmte Praktiken. Und das ist alles.<\/em> <\/p>\n<p><\/p>\n<p><em>Und Sie m\u00fcssen entweder diese Regel aufheben, damit Sie sich nicht mehr mit diesem Unsinn besch\u00e4ftigen, d.h. Sie weisen nicht mehr manuell einen Grad der \u00dcbereinstimmung von etwas mit etwas zu. Sie verlassen sich voll und ganz auf einen automatisierten Testsatz f\u00fcr die Betriebsbereitschaft.<\/em> <\/p>\n<p><\/p>\n<p><em>Und wenn Sie von jemandem einen Nachweis ben\u00f6tigen, damit der Chef unterschreibt, und Sie nicht in die Produktion gehen, ohne dass Wanja gesagt hat, dass er es erlaubt usw. \u2013 all dieser Unsinn steht den Praktiken im Weg. Denn wenn damit verbundene Aktivit\u00e4ten als Steuer fungieren, vervielfacht sich alles um das 100-fache. Daher wird eine Ver\u00e4nderung oft nicht von allen positiv aufgenommen. Denn Gewohnheiten sind schwer zu \u00e4ndern.<\/em> <\/p>\n<p><\/p>\n<p><em>Wenn eine Person die gewohnte Arbeit verrichtet, tut sie dies praktisch nicht nachdenken. Die kognitive Belastung betr\u00e4gt null. Er bearbeitet einfach das Vorhandene, hat bereits eine Checkliste im Kopf, die er tausend Mal durchgegangen ist. Und sobald du kommst und ihm sagst: \u201eLass uns diese Praxis abschaffen und ab Montag eine neue einf\u00fchren\u201c, wird dies eine enorme kognitive Belastung f\u00fcr ihn. Und das trifft alle sofort.<\/em> <\/p>\n<p><\/p>\n<p><em>Deshalb ist es am einfachsten, obwohl sich diese Eleganz nicht alle leisten k\u00f6nnen, genau so zu verfahren. Wenn ein neues Projekt gestartet wird, werden oft sofort alle unerprobten Praktiken in dieses Projekt integriert. Solange das Projekt jung ist, riskieren wir nicht viel. Es gibt noch kein Prod, also gibt es nichts, was man ruinieren k\u00f6nnte. Daher kann es als Training genutzt werden. Dieser Ansatz funktioniert. Aber nicht alle Unternehmen haben die M\u00f6glichkeit, solche Projekte h\u00e4ufig zu starten. Obwohl es auch etwas seltsam ist, denn derzeit ist die digitale Transformation durchg\u00e4ngig, jeder sollte Experimente durchf\u00fchren, um mit den Wettbewerbern Schritt zu halten.<\/em> <\/p>\n<p><\/p>\n<p>Hier kommt man zu dem Punkt, dass man zun\u00e4chst verstehen muss, was man tun muss. Die Welt ist nicht perfekt, das Prod ist auch nicht perfekt. <\/p>\n<p><\/p>\n<p><em>Ja, diese Dinge h\u00e4ngen zusammen.<\/em><\/p>\n<p><\/p>\n<p>Die Unternehmen haben auch nicht immer das Verst\u00e4ndnis, dass sie dorthin gehen sollten. <\/p>\n<p><\/p>\n<p><em>Es gibt Situationen, in denen keine Ver\u00e4nderungen \u00fcberhaupt m\u00f6glich sind. Dies ist der Fall, wenn der Druck auf das Team gr\u00f6\u00dfer wird. Das Team ist bereits ziemlich ersch\u00f6pft. Es hat keine Reservezeit f\u00fcr Experimente. Sie arbeiten von morgens bis abends an Features. Und den F\u00fchrungskr\u00e4ften sind die Features nie genug. Es wird immer mehr verlangt. In einer solchen Situation sind keine Ver\u00e4nderungen m\u00f6glich. Dem Team kann nur gesagt werden, dass sie morgen genauso arbeiten wie gestern, einfach etwas mehr Features machen m\u00fcssen. Keinerlei \u00dcberg\u00e4nge zu irgendeiner Praxis sind in diesem Sinne m\u00f6glich. Dies ist die klassische Situation, in der es keine Zeit gibt, die Axt zu sch\u00e4rfen, man muss die B\u00e4ume f\u00e4llen, also wird mit der stumpfen Axt gearbeitet. Hier gibt es keine einfachen Ratschl\u00e4ge.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Ich lese eine Klarstellung aus dem Chat vor: \u201eAber es ist notwendig, eine umfangreiche Testabdeckung auf verschiedenen Ebenen zu haben. Wie viel Zeit wird f\u00fcr Tests aufgewendet? Irgendwie ist das teuer, nimmt viel Zeit in Anspruch.\u201c<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) Das ist ein klassisches Missverst\u00e4ndnis. Es sollten ausreichend Tests vorhanden sein, damit Sie selbst Vertrauen haben. Continuous Integration ist keine Methode, bei der zuerst 100 % der Tests durchgef\u00fchrt werden und erst dann beginnen Sie, diese Praxis anzuwenden. Continuous Integration reduziert Ihre kognitive Belastung, weil jede \u00c4nderung, die Sie mit eigenen Augen sehen, so offensichtlich ist, dass Sie sofort verstehen, ob sie etwas kaputt macht oder nicht, sogar ohne Tests. Sie k\u00f6nnen dies im Kopf schnell testen, da es kleine \u00c4nderungen sind. Selbst wenn Sie nur manuelle Tester haben, wird es auch f\u00fcr sie einfacher. Sie haben das Release gemacht und gesagt: \u201eSchau mal, ist nichts kaputt?\u201c Sie haben gepr\u00fcft und gesagt: \u201eNein, es ist nichts kaputt.\u201c Weil der Tester wei\u00df, wo er schauen muss. Ihr Commit ist mit einem Codefragment verkn\u00fcpft. Und es wird durch ein bestimmtes Verhalten ausgef\u00fchrt.<\/em><\/p>\n<p><\/p>\n<p>Hier hast du nat\u00fcrlich \u00fcbertrieben. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Da stimme ich nicht zu. Es gibt die Praxis \u2013 Testgetriebene Entwicklung, die gerade davor rettet.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Dazu bin ich noch nicht gekommen. Die erste Illusion ist, dass man genau 100 % Tests schreiben muss oder \u00fcberhaupt keine Continuous Integration betreiben kann. Das ist nicht wahr. Das sind zwei parallele Praktiken. Und sie h\u00e4ngen nicht direkt voneinander ab. Ihre Testabdeckung sollte optimal sein. Optimal bedeutet, dass Sie selbst sicher sind, dass die Qualit\u00e4t des Masters, die nach dem Commit \u00fcbrig bleibt, es Ihnen erm\u00f6glicht, sicher am Freitagabend im betrunkenen Zustand auf die Schaltfl\u00e4che \u201eDeploy\u201c zu klicken. Wie erreichen Sie das? Durch Reviews, durch Abdeckung, durch gutes Monitoring.<\/em> <\/p>\n<p><\/p>\n<p><em>Gutes Monitoring ist nicht von Tests zu unterscheiden. Wenn Sie die Tests einmal im Pre-Prod ausf\u00fchren, \u00fcberpr\u00fcfen sie einmal alle Ihre Benutzerszenarien und das war's. Wenn Sie sie jedoch in einem endlosen Zyklus ausf\u00fchren, haben Sie Ihr erweitertes Monitoring-System, das endlos alles testet \u2013 ob es abgest\u00fcrzt ist oder nicht. In diesem Fall liegt der Unterschied nur in der Einmaligkeit oder Mehrmaligkeit. Ein sehr guter Satz von Tests \u2026, die endlos ausgef\u00fchrt werden, ist Monitoring. Und richtiges Monitoring sollte so sein.<\/em> <\/p>\n<p><\/p>\n<p><em>Und wie genau Sie diesen Zustand erreichen, in dem Sie am Freitagabend deployen und nach Hause gehen, ist eine andere Frage. Vielleicht sind Sie einfach ein mutiger Typ.<\/em> <\/p>\n<p><\/p>\n<p>Lass uns einen Schritt zur\u00fcck zu Continuous Integration machen. Wir sind ein wenig in eine andere komplexe Praxis abgedriftet. <\/p>\n<p><\/p>\n<p><em>Und die zweite Illusion ist, dass man MVP angeblich schnell erstellen muss, weshalb Tests dort \u00fcberhaupt nicht notwendig seien. Das ist nicht ganz richtig. Es geht darum, dass man, wenn man im MVP eine User Story schreibt, diese entweder unbedacht umsetzt, d. h. man hat geh\u00f6rt, dass es eine User Story gibt, und springt sofort ins Codieren, oder nach TDD arbeitet. Und nach TDD, wie die Praxis zeigt, dauert es nicht l\u00e4nger, d. h. Tests sind ein Nebeneffekt. Die TDD-Praxis besteht nicht darin, Tests zu schreiben. Trotz des Begriffs Test Driven Development geht es dabei in Wirklichkeit gar nicht um Tests. Es handelt sich eher um einen architektonischen Ansatz. Es ist ein Ansatz, um genau das zu schreiben, was n\u00f6tig ist, und nicht das, was nicht n\u00f6tig ist. Diese Praxis fokussiert darauf, wie man die n\u00e4chste Iteration seines Denkens in Bezug auf die Erstellung der Anwendungsarchitektur angeht.<\/em> <\/p>\n<p><\/p>\n<p><em>Es ist also nicht so einfach, sich von diesen Illusionen zu befreien. MVP und Tests widersprechen sich nicht. Ganz im Gegenteil, wenn Sie das MVP nach der TDD-Praxis erstellen, werden Sie es besser und schneller umsetzen, als wenn Sie ohne diese Praxis arbeiten und einfach drauflos programmieren.<\/em><\/p>\n<p><\/p>\n<p>Das ist ein sehr unauff\u00e4lliger und komplexer Gedanke. Wenn du h\u00f6rst, dass du jetzt noch Tests schreiben musst und dabei etwas schneller machst, klingt das absolut unangemessen. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Viele, wenn sie von MVP sprechen, haben einfach keine Lust, etwas Vern\u00fcnftiges zu schreiben. Und das sind immer noch verschiedene Dinge. Man sollte MVP nicht in eine schlechte Sache verwandeln, die nicht funktioniert.<\/em> <\/p>\n<p><\/p>\n<p>Ja, ja, du hast recht.<\/p>\n<p><\/p>\n<p><em>Und dann kommt pl\u00f6tzlich das MVP in die Produktion.<\/em><\/p>\n<p><\/p>\n<p>F\u00fcr immer. <\/p>\n<p><\/p>\n<p>TDD klingt sehr ungewohnt, wenn man h\u00f6rt, dass man Tests schreibt und dabei scheinbar mehr Arbeit verrichtet. Das klingt sehr seltsam, aber in Wirklichkeit bekommt man es dadurch schneller und sch\u00f6ner hin. Wenn du einen Test schreibst, denkst du bereits viel dar\u00fcber nach, welchen Code und wie er aufgerufen wird sowie welches Verhalten wir von ihm erwarten. Du sagst nicht einfach, dass du eine Funktion geschrieben hast und sie etwas macht. Du hast zuerst dar\u00fcber nachgedacht, dass sie unter bestimmten Bedingungen so aufgerufen wird. Du deckst das mit Tests ab und daraus verstehst du, wie deine Schnittstellen innerhalb deines Codes aussehen werden. Das hat einen gro\u00dfen Einfluss auf die Architektur. Dein Code wird automatisch modularer, weil du zuerst versuchst zu verstehen, wie du ihn testen wirst, und erst dann schreibst du ihn. <\/p>\n<p><\/p>\n<p>Ich habe mit TDD Folgendes erlebt: Irgendwann habe ich einen Mentor f\u00fcr Ruby engagiert, als ich noch Ruby-Programmierer war. Und er sagt: \u201eLass uns TDD ausprobieren\u201c. Ich dachte mir: \u201eVerdammtes A, jetzt muss ich noch mehr zus\u00e4tzlich schreiben\u201c. Und wir haben uns darauf geeinigt, dass ich zwei Wochen lang allen funktionierenden Code in Python nach TDD schreibe. Nach zwei Wochen habe ich realisiert, dass ich nicht mehr zur\u00fcckwill. Nach zwei Wochen, in denen ich versucht habe, das \u00fcberall anzuwenden, verstehst du, wie viel einfacher es geworden ist, sogar nur zu denken. Aber das ist nicht offensichtlich, deshalb empfehle ich jedem, dass, wenn ihr das Gef\u00fchl habt, TDD ist kompliziert, langwierig und unn\u00f6tig, versucht es einfach f\u00fcr zwei Wochen. Mir haben zwei Wochen daf\u00fcr gereicht.<\/p>\n<p><\/p>\n<p><em>(Dmitri) Wir k\u00f6nnen diesen Gedanken aus der Sicht der Infrastruktur-Operationen weiter ausf\u00fchren. Bevor wir etwas Neues starten, machen wir ein Monitoring und starten dann. In diesem Fall wird unser Monitoring zu einer normalen Testung. Und es gibt eine Entwicklung durch Monitoring. Aber fast alle sagen, dass es lange dauert, ich habe keinen Bock, ich habe einen vorl\u00e4ufigen Entwurf gemacht. Wenn wir richtiges Monitoring gemacht haben, verstehen wir den Zustand des CI-Systems. Und im CI-System gibt es viel Monitoring. Wir verstehen den Zustand des Systems, wir verstehen, was sich darin befindet. Und w\u00e4hrend der Entwicklung stellen wir bewusst das System so ein, dass es den gew\u00fcnschten Zustand erreicht.<\/em> <\/p>\n<p><\/p>\n<p><em>Diese Praktiken sind schon lange bekannt. Wir haben vor etwa 4 Jahren dar\u00fcber diskutiert. Aber in den 4 Jahren hat sich praktisch nichts ge\u00e4ndert.<\/em> <\/p>\n<p><\/p>\n<p><em>Aber in dieser Note schlage ich vor, die offizielle Diskussion zu beenden.<\/em><\/p>\n<p><\/p>\n<p>Video (als Medienelement eingef\u00fcgt, funktioniert aber irgendwie nicht):<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/518406\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93886,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"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\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\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\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\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-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-10T17:42:23+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\udd47Continuous Integration als Praxis und nicht Jenkins. Andrej Alexandrow | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","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\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","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-09-10T17:42:23+00:00","article:modified_time":"2020-09-10T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93885","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 11:37:31","updated":"2022-09-27 15:57:30","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\/93885","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=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}