{"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 dar\u00fcber sprechen, warum CI-Tools und CI zwei ganz verschiedene Dinge sind.<\/p>\n<p><\/p>\n<p>Welches Problem soll CI l\u00f6sen, woher stammt die Idee, welche aktuellen Best\u00e4tigungen belegen, dass es funktioniert und wie erkennt man, dass man tats\u00e4chlich Praxis hat und nicht nur Jenkins installiert ist.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Die Idee, einen Vortrag \u00fcber Continuous Integration zu halten, kam vor einem Jahr auf, als ich zu Vorstellungsgespr\u00e4chen ging, um einen Job zu suchen. Ich hatte Gespr\u00e4che mit 10-15 Unternehmen und nur eines konnte mir nachvollziehbar erkl\u00e4ren, was CI ist und wie sie festgestellt haben, dass ihnen das fehlt. Die anderen redeten wirres Zeug \u00fcber Jenkins \ud83d\ude42 \"Wir haben Jenkins, das macht Builds, CI!\" In meinem Vortrag werde ich versuchen zu erkl\u00e4ren, was Continuous Integration wirklich ist und warum Jenkins und \u00e4hnliche Tools nur sehr 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 kommt den meisten Leuten in den Sinn, wenn sie das Wort CI h\u00f6ren? Die meisten denken sofort an Jenkins, Gitlab CI, Travis usw.<\/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, werden diese 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, ob sie bekannt sind, wird man sofort nach der Aufz\u00e4hlung der Tools h\u00f6ren, dass CI das ist, wenn bei einem Pull Request nach einem Commit ein Build durchgef\u00fchrt und Tests ausgef\u00fchrt werden.<\/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>Kontinuierliche Integration bedeutet nicht, sich auf Werkzeuge oder das Erstellen von Build-Prozessen mit Tests in Branches zu konzentrieren! Kontinuierliche Integration ist eine Praxis, die eine sehr h\u00e4ufige Integration neuen Codes erfordert, und dazu ist es keineswegs notwendig, komplizierte Systeme wie Jenkins, GitLab usw. zu verwenden.<\/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 damit besch\u00e4ftigen, wie eine vollst\u00e4ndige CI aussieht, lassen Sie uns zun\u00e4chst in den Kontext der Menschen eintauchen, die dies erfunden haben, und das Problem nachf\u00fchlen, 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 haben das Problem der Zusammenarbeit im Team gel\u00f6st!<\/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 anhand von Beispielen an, mit welchen Schwierigkeiten Entwickler bei der Teamarbeit konfrontiert sind. Angenommen, wir haben ein Projekt, einen 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 haben so gearbeitet, wie es schon lange \u00fcblich ist. Sie haben sich eine Aufgabe in Jira geschnappt, einen Feature-Branch erstellt und Code geschrieben.<\/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>Der eine hat das Feature schneller fertiggestellt und es in den Master gemerged.<\/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, hat sich sp\u00e4ter gemerged und erhielt einen Konflikt. Jetzt verbringt der Entwickler anstelle von der Erstellung wichtiger Gesch\u00e4ftsfeatures seine Zeit und Energie mit der L\u00f6sung 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, Ihre Funktion mit dem Hauptzweig zu verbinden, desto mehr Zeit investieren wir daf\u00fcr. Und das ist noch ein relativ einfaches Beispiel. Hier gibt es nur zwei Entwickler. Stellen Sie sich vor, es sind 10, 15 oder sogar 100 Personen in einem Unternehmen, die in dasselbe Repository schreiben. Sie w\u00fcrden verr\u00fcckt werden, 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 Hauptzweig 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>Jeder hat seinen eigenen 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 seinen Branch gemerged, 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 inzwischen seine Aufgabe fertiggestellt. Angenommen, er hat sie zur \u00dcberpr\u00fcfung eingereicht. In vielen Unternehmen gibt es die Praxis der \u00dcberpr\u00fcfung \u2013 einerseits eine gute und n\u00fctzliche Praxis, andererseits bremst sie uns an manchen Stellen. Lassen wir das mal beiseite, aber es ist ein hervorragendes Beispiel, wohin eine komplizierte Geschichte mit der \u00dcberpr\u00fcfung f\u00fchren kann. Sie haben einen Pull-Request zur \u00dcberpr\u00fcfung eingereicht. Der Entwickler hat nichts mehr zu tun. Was beginnt er zu tun? Er anf\u00e4ngt, 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 abgeschlossen. <\/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 getestet und er versucht, es zusammenzuf\u00fchren. Und was passiert? Er st\u00f6\u00dft auf eine Menge Konflikte. Warum? Weil w\u00e4hrend sein Pull Request zur \u00dcberpr\u00fcfung bereitstand, sich im Code bereits viel ver\u00e4ndert hat. <\/p>\n<p><\/p>\n<p>Neben der Problematik der Konflikte gibt es auch das Thema Kommunikation. Solange Ihre Branch zur \u00dcberpr\u00fcfung offen ist und auf etwas wartet, w\u00e4hrend Sie an einem Feature arbeiten, verlieren Sie den \u00dcberblick dar\u00fcber, was sich sonst noch in der Codebasis Ihres Services \u00e4ndert. M\u00f6glicherweise wurde das, was Sie gerade zu l\u00f6sen versuchen, bereits gestern gekl\u00e4rt, und Sie k\u00f6nnten eine Methode wiederverwenden. Aber das werden Sie nicht sehen, weil Sie immer mit einer veralteten Branch arbeiten. Und diese veraltete Branch f\u00fchrt immer dazu, dass Sie Merge-Konflikte l\u00f6sen m\u00fcssen. <\/p>\n<p><\/p>\n<p>Das bedeutet, wenn wir im Team arbeiten, also nicht nur eine Person im Repository arbeitet, sondern 5-10 Personen, desto l\u00e4nger wir unseren Code nicht in den Master einf\u00fcgen, desto mehr leiden wir darunter, dass schlie\u00dflich etwas zusammengef\u00fchrt werden muss. 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 kann schmerzhaft sein! Wir st\u00f6ren uns gegenseitig immer wieder. <\/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 angesprochen. Das erste Mal, dass ich von der Praxis der Continuous Integration geh\u00f6rt habe, fand ich im Zusammenhang mit extreme Programming.<\/p>\n<p><\/p>\n<p>Extreme Programming ist das erste agile Framework. Die Seite entstand 1996. Die Idee war, bestimmte Praktiken des Programmierens, Planens und anderer Bereiche zu nutzen, 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 zu erkennen, dass, wenn man etwas sehr lange im Abseits macht, man mehr Zeit darauf verwendet, da 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 \"Continuous Integration\" Wort f\u00fcr Wort analysieren. Wenn man w\u00f6rtlich \u00fcbersetzt, bedeutet es kontinuierliche Integration. Aber wie kontinuierlich sie ist, bleibt unklar; sie ist sogar sehr unterbrochen. Auch wie viel Integration tats\u00e4chlich stattfindet, ist nicht ganz offensichtlich. <\/p>\n<p><\/p>\n<p>Deshalb f\u00fchre ich Ihnen jetzt Zitate aus dem extreme Programming an. Und wir werden beide W\u00f6rter getrennt analysieren. <\/p>\n<p><\/p>\n<p>Integration \u2013 Wie bereits erw\u00e4hnt, streben wir danach, dass jeder Ingenieur mit der aktuellsten Version des Codes arbeitet und seinen Code so oft wie m\u00f6glich in den Hauptbranch integriert, wobei wir kleine Branches bevorzugen. Denn wenn sie gro\u00df sind, k\u00f6nnen wir leicht eine Woche mit Merge-Konflikten stecken bleiben, insbesondere wenn wir einen langen Entwicklungszyklus wie Waterfall haben, wo ein Entwickler einen Monat an einer umfangreichen Funktion arbeitet. In der Integrationsphase k\u00f6nnte er dann sehr lange festh\u00e4ngen. <\/p>\n<p><\/p>\n<p>Integration bedeutet, dass wir unseren Branch nehmen und ihn mit dem Master zusammenf\u00fchren, wir mergen ihn. Es gibt die ultimative Variante, wo wir als Transbase-Entwickler sofort in den Master schreiben, ohne unn\u00f6tige Branches zu erzeugen.<\/p>\n<p><\/p>\n<p>Im Grunde genommen bedeutet Integration, seinen Code zu nehmen und ihn in den Master zu bringen. <\/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 \u201ekontinuierlich\u201c, was hei\u00dft Kontinuit\u00e4t? In der Praxis strebt der Entwickler danach, seinen Code so schnell wie m\u00f6glich zu integrieren. Das ist sein Ziel bei jeder Aufgabe \u2013 daf\u00fcr zu sorgen, dass sein Code so schnell wie m\u00f6glich im Master verf\u00fcgbar ist. In einer idealen Welt w\u00fcrden die Entwickler dies alle paar Stunden tun. D. h. du nimmst eine kleine Aufgabe, mergst sie in den Master. Alles ist gro\u00dfartig. Das ist dein Ziel. Und du musst es kontinuierlich tun. Sobald du etwas abgeschlossen hast, schiebst du es sofort in den Master. <\/p>\n<p><\/p>\n<p>Und der Entwickler, der etwas tut, ist daf\u00fcr verantwortlich, dass es funktioniert und nichts kaputt macht. Genau hier kommt oft die Geschichte mit den Tests ins Spiel. Wir m\u00f6chten einige Tests f\u00fcr unser Commit, f\u00fcr unser Merge durchf\u00fchren, um sicherzustellen, dass alles funktioniert. Und hier kann Jenkins hilfreich sein.<\/p>\n<p><\/p>\n<p>Aber zu den Geschichten: Lassen Sie uns kleine \u00c4nderungen vornehmen, kleine Aufgaben stellen, und lassen Sie uns die Aufgabe gleich erledigen und versuchen, sie gleich in den Master-Branch zu integrieren \u2013 hier werden Ihnen keine Jenkins-Tools helfen. Denn Jenkins hilft Ihnen nur beim Ausf\u00fchren von Tests. <\/p>\n<p><\/p>\n<p>Sie k\u00f6nnen auch ohne sie auskommen. Das wird Ihnen nicht im Geringsten schaden. Denn das Ziel der Praxis ist es, so oft wie m\u00f6glich zu integrieren, um eine Menge Zeit f\u00fcr zuk\u00fcnftige Konflikte zu sparen. <\/p>\n<p><\/p>\n<p>Stellen wir uns vor, es ist das Jahr 2020 und aus irgendwelchen Gr\u00fcnden gibt es kein Internet. Und wir arbeiten lokal. Wir haben kein Jenkins. Das ist in Ordnung. Sie k\u00f6nnen immer noch einen lokalen Branch anlegen. Sie haben etwas Code geschrieben. Eine Aufgabe in 3-4 Stunden erledigt. Sie wechseln zu Master, f\u00fchren git pull aus und integrieren Ihren Branch. Fertig. Wenn Sie das oft machen \u2013 herzlichen Gl\u00fcckwunsch, Sie haben 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, sich daf\u00fcr zu engagieren? Denn insgesamt ist das kompliziert. Wenn Sie versuchen, so zu arbeiten, werden Sie feststellen, dass Sie einige Planungen ansto\u00dfen m\u00fcssen. Sie m\u00fcssen mehr Zeit f\u00fcr die Dekomposition von Aufgaben aufwenden. Denn wenn Sie das man... durchf\u00fchren, k\u00f6nnen Sie nicht schnell zusammenf\u00fchren und laufen entsprechend in Schwierigkeiten. Dann haben Sie keine Praxis mehr. <\/p>\n<p><\/p>\n<p>Und das wird teuer. Von morgen an mit Continuous Integration zu arbeiten, wird nicht funktionieren. Sie werden alle sehr lange brauchen, um sich daran zu gew\u00f6hnen, sehr lange, um die Dekomposition der Aufgaben zu lernen, und sehr lange, um die Review-Praxis zu \u00e4ndern, falls Sie eine haben. Denn unser Ziel ist es, dass es heute zusammengef\u00fchrt wird. Wenn Sie das Review \u00fcber drei Tage hinweg durchf\u00fchren, haben Sie Probleme, und Continuous Integration funktioniert nicht. <\/p>\n<p><\/p>\n<p>Aber gibt es aktuell g\u00fcltige Beweise, die uns 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, ist der State of DevOps. Diese Studie wird seit sieben Jahren durchgef\u00fchrt. Momentan geschieht das als unabh\u00e4ngige Organisation, aber unter Google.<\/p>\n<p><\/p>\n<p>Eine Studie aus dem Jahr 2018 hat gezeigt, dass Unternehmen, die auf kurzlebige Branches setzen \u2013 die sich schnell und h\u00e4ufig integrieren \u2013 deutlich bessere IT-Leistungskennzahlen aufweisen.<\/p>\n<p><\/p>\n<p>Welche Kennzahlen sind das? Es sind vier Metriken, die in ihren Umfragen von allen Unternehmen erfasst werden: H\u00e4ufigkeit der Bereitstellungen, Vorlaufzeit f\u00fcr \u00c4nderungen, Wiederherstellungszeit des Dienstes und \u00c4nderungsfehlerquote.<\/p>\n<p><\/p>\n<p>Erstens gibt es diese Korrelation: Wir wissen, dass Unternehmen, die h\u00e4ufig mergen, in diesen Metriken erheblich besser abschneiden. Es gibt eine Klassifizierung der Unternehmen in verschiedene Kategorien: langsame Unternehmen, die Dinge langsam produzieren, mittelm\u00e4\u00dfige Leistungstr\u00e4ger, hochleistende Unternehmen und die Elite. Die Elite umfasst Unternehmen wie Netflix und Amazon, die extrem schnell, effizient und qualitativ hochwertig arbeiten.<\/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>Eine weitere Geschichte, die vor nur einem Monat passiert ist: Im Technology Radar erschien ein interessanter Artikel \u00fcber Gitflow. Gitflow unterscheidet sich von anderen Methoden dadurch, dass seine Branches lange leben. Es gibt Release-Branches, die lange bestehen, sowie Feature-Branches, die ebenfalls lange aktiv bleiben. Diese Praxis wurde im Technology Radar als \"HOLD\" eingestuft. Warum? Weil die Menschen bei der Integration auf Probleme sto\u00dfen. <\/p>\n<p><\/p>\n<p>Wenn ein Branch sehr lange besteht, stockt er, verfault und wir investieren zunehmend mehr Zeit, um eine \u00c4nderung darin vorzunehmen. <\/p>\n<p><\/p>\n<p>Vor kurzem \u00e4u\u00dferte der Autor von Gitflow, dass, wenn Sie auf Continuous Integration abzielen und so oft wie m\u00f6glich Deployments durchf\u00fchren m\u00f6chten, Gitflow eine schlechte Idee ist. In einem zus\u00e4tzlichen Abschnitt des Artikels stellte er klar, dass Gitflow \u00fcberfl\u00fcssig ist, wenn Sie eine Backend-Umgebung haben, die dies unterst\u00fctzt, weil Gitflow Sie verlangsamen und Integrationsprobleme verursachen kann. <\/p>\n<p><\/p>\n<p>Das bedeutet nicht, dass Gitflow schlecht ist und nicht verwendet werden sollte. Es ist f\u00fcr andere F\u00e4lle geeignet. Zum Beispiel, wenn Sie mehrere Versionen eines Dienstes oder einer Anwendung unterst\u00fctzen m\u00fcssen, also wenn Sie \u00fcber einen l\u00e4ngeren Zeitraum Support leisten m\u00fcssen. <\/p>\n<p><\/p>\n<p>Aber wenn Sie mit Leuten sprechen, die solche Dienste betreuen, h\u00f6ren Sie oft von den Schwierigkeiten, dass die Version 3.2, die vor 4 Monaten ver\u00f6ffentlicht wurde, diesen Fix nicht enth\u00e4lt, und um ihn einzuf\u00fcgen, m\u00fcssen viele \u00c4nderungen vorgenommen werden. Und dann stecken sie wieder fest und k\u00e4mpfen eine Woche lang, um eine neue Funktion zusammenzuf\u00fchren. <\/p>\n<p><\/p>\n<p>Wie Alexander Kovalev im Chat richtig bemerkte, bedeutet Korrelation nicht, dass es eine Kausalit\u00e4t gibt. Das ist richtig. Das hei\u00dft, es gibt keine direkte Verbindung, dass wenn Sie Continuous Integration haben, alle Metriken gro\u00dfartig sein werden. Aber es besteht eine positive Korrelation: wenn das eine vorhanden ist, ist es wahrscheinlich, dass auch das andere zutrifft. Es ist kein Fakt, aber wahrscheinlich. Es ist lediglich 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 w\u00fcrden wir bereits etwas tun, als w\u00fcrden wir bereits mergen. Aber wie k\u00f6nnen wir sicherstellen, dass wir tats\u00e4chlich Continuous Integration haben und oft genug mergen?<\/p>\n<p><\/p>\n<p>Jez Humble ist der Autor des Handbuchs, '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 des Ingenieurs wird t\u00e4glich in den Master integriert. <\/li>\n<li>Bei jedem Commit f\u00fchren Sie Unit-Tests aus.<\/li>\n<li>Der Build im Master ist gescheitert, wurde aber innerhalb von etwa 10 Minuten behoben.<\/li>\n<\/ul>\n<p><\/p>\n<p>Er schl\u00e4gt vor, einen solchen Test zu verwenden, um sicherzustellen, dass diese Praxis bei Ihnen tats\u00e4chlich vorhanden ist. <\/p>\n<p><\/p>\n<p>Ich finde das letzte ein wenig umstritten. Das hei\u00dft, wenn Sie es innerhalb von 10 Minuten reparieren k\u00f6nnen, haben Sie Continuous Integration. Das klingt f\u00fcr mich ein wenig merkw\u00fcrdig, aber es macht Sinn. Warum? Weil h\u00e4ufige Merges bedeuten, dass Ihre \u00c4nderungen klein sind. Wenn eine kleine \u00c4nderung dazu f\u00fchrt, dass Ihr Master-Build fehlschl\u00e4gt, k\u00f6nnen Sie schnell einen konkreten Fehler finden, weil die \u00c4nderungen minimal sind. Nehmen wir an, Sie hatten einen kleinen Merge, der 20-30 Zeilen ge\u00e4ndert hat. Dadurch k\u00f6nnen Sie schnell nachvollziehen, was das Problem war, da die \u00c4nderungen sehr gering sind, und Sie haben ein sehr kleines Suchgebiet f\u00fcr das Problem. <\/p>\n<p><\/p>\n<p>Selbst wenn unser Produzenten-System nach einem Release zusammenbricht, wird es uns mit einer Continuous Integration-Praxis viel leichter fallen, zu reagieren, da die \u00c4nderungen klein sind. Ja, das wird die Planung beeinflussen. Es wird schmerzhaft sein. Und wahrscheinlich ist das Schwierigste an dieser Praxis, sich daran zu gew\u00f6hnen, die Aufgaben zu unterteilen. Das hei\u00dft, herauszufinden, wie man etwas in ein paar Stunden erledigt und dabei ein Review durchl\u00e4uft, falls man eines hat. Das Review ist ein ganz anderes Problem. <\/p>\n<p><\/p>\n<p>Unit-Tests sind einfach Werkzeuge, die Ihnen helfen zu verstehen, ob Ihre Integration erfolgreich war und ob alles funktioniert. Meiner Meinung nach ist dies auch kein zwingender Punkt, denn der Sinn der Praxis liegt nicht darin. <\/p>\n<p><\/p>\n<p>Das ist eine kurze Zusammenfassung \u00fcber Continuous Integration. Das ist alles, was es zu dieser Praxis zu sagen gibt. Ich bin bereit f\u00fcr Fragen. <\/p>\n<p><\/p>\n<p>Ich fasse nur kurz zusammen:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration ist nicht Jenkins, es ist nicht GitLab.<\/li>\n<li>Es ist kein Tool, sondern eine Praxis, bei der wir unseren Code so oft wie m\u00f6glich in den Master-Branch mergen. <\/li>\n<li>Wir tun dies, um die gro\u00dfe Schmerzen zu vermeiden, die durch sp\u00e4tere Merges entstehen. Das bedeutet, wir erleben jetzt kleine Schmerzen, um in der Zukunft nicht gro\u00dfe Schmerzen zu erleiden. Das ist der gesamte Sinn. <\/li>\n<li>Au\u00dferhalb findet Kommunikation \u00fcber den Code statt, aber ich sehe das sehr selten. Dennoch ist das auch ein Teil des Konzepts.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Fragen<\/strong><\/p>\n<p><\/p>\n<p><em>Was ist zu tun, wenn Aufgaben nicht dekonstruiert werden k\u00f6nnen?<\/em><\/p>\n<p><\/p>\n<p>Dekonstruieren. Was ist das Problem? K\u00f6nnen Sie ein Beispiel nennen, bei dem eine Aufgabe nicht dekonstruiert werden kann?<\/p>\n<p><\/p>\n<p><em>Es gibt Aufgaben, die lassen sich \u00fcberhaupt nicht von Grund auf zerlegen, wie beispielsweise solche, die eine sehr tiefgehende Expertise erfordern und deren L\u00f6sung tats\u00e4chlich Monate in Anspruch nehmen kann, um zu einem akzeptablen Ergebnis zu gelangen.<\/em> <\/p>\n<p><\/p>\n<p>Wenn ich dich richtig verstanden habe, gibt es also eine gro\u00dfe und komplexe Aufgabe, deren Ergebnis erst in einem Monat sichtbar sein wird?<\/p>\n<p><\/p>\n<p><em>Ja, genau. Das Ergebnis wird fr\u00fchestens in einem Monat absch\u00e4tzbar sein.<\/em> <\/p>\n<p><\/p>\n<p>Gut. Im Gro\u00dfen und Ganzen ist das kein Problem. Warum? Weil wir in diesem Fall, wenn wir \u00fcber Branches sprechen, nicht von einer Branch mit einer Funktion sprechen. Funktionen k\u00f6nnen umfangreich und komplex sein und viele Komponenten betreffen. M\u00f6glicherweise k\u00f6nnen wir sie nicht in einer einzigen Branch vollst\u00e4ndig umsetzen. Das ist in Ordnung. Wir m\u00fcssen lediglich diese Aufgabe aufteilen. Wenn eine Funktion noch nicht vollst\u00e4ndig fertig ist, bedeutet das nicht, dass Teile ihres Codes nicht gemergt werden k\u00f6nnen. Angenommen, du hast eine Migration durchgef\u00fchrt, und innerhalb der Funktion gibt es verschiedene Schritte. Zum Beispiel hast du den Schritt \u2013 Migration erstellen, eine neue Methode hinzuf\u00fcgen. Diese Dinge kannst du bereits t\u00e4glich mergen. <\/p>\n<p><\/p>\n<p><em>Gut. Was ist also der Sinn dahinter?<\/em><\/p>\n<p><\/p>\n<p>Was bringt es, t\u00e4glich kleine \u00c4nderungen zusammenzuf\u00fchren?<\/p>\n<p><\/p>\n<p><em>Ja.<\/em><\/p>\n<p><\/p>\n<p>Wenn etwas bei dir kaputtgeht, siehst du das sofort. Mit einem kleinen St\u00fcck ist es einfacher, den Fehler zu beheben. Der Sinn ist, dass es viel einfacher ist, jetzt kleine \u00c4nderungen zusammenzuf\u00fchren, als in ein paar Wochen etwas Gr\u00f6\u00dferes zu mergen. Und der dritte Punkt ist, dass andere Ingenieure mit der bereits aktuellen Version des Codes arbeiten. Sie werden sehen, dass hier einige Migrationen hinzugef\u00fcgt wurden und hier eine Methode erschienen ist, die sie m\u00f6glicherweise ebenfalls verwenden m\u00f6chten. Alle werden sehen, was in deinem Code passiert. Genau aus diesen drei Gr\u00fcnden wird diese Praxis etabliert. <\/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 etwas hinzuf\u00fcgen? Du hast alles richtig gesagt, ich m\u00f6chte nur einen Satz hinzuf\u00fcgen.<\/em><\/p>\n<p><\/p>\n<p>So.<\/p>\n<p><\/p>\n<p><em>Bei Continuous Integration wird der Code nicht dann in den Hauptbranch zusammengef\u00fchrt, wenn die Funktion vollst\u00e4ndig entwickelt ist, sondern sobald der Build nicht mehr fehlerhaft ist. Dadurch k\u00f6nnen Sie unbesorgt so oft wie gew\u00fcnscht am Tag ins Master committen. Ein weiterer Aspekt ist, dass, wenn es Ihnen aus irgendeinem Grund nicht m\u00f6glich ist, eine monatliche Aufgabe in kleinere Aufgaben von mindestens drei Tagen zu gliedern \u2013 ich schweige von drei Stunden \u2013, dann haben Sie ein gro\u00dfes Problem. Und die Tatsache, dass Sie kein Continuous Integration haben, ist das kleinere Problem. Das bedeutet, dass es Probleme mit der Architektur und den ingenieurtechnischen Praktiken gibt, die bei Null stehen. Denn selbst wenn es sich um Forschung handelt, muss sie in jedem Fall als Hypothesen oder Zyklen formuliert werden.<\/em> <\/p>\n<p><\/p>\n<p><em>Wir haben von vier Kennzahlen gesprochen, die erfolgreiche Unternehmen von weniger erfolgreichen unterscheiden. Zun\u00e4chst m\u00fcssen wir jedoch die Voraussetzungen schaffen, um zu diesen vier Kennzahlen zu gelangen. Wenn es im Durchschnitt einen Monat dauert, eine Aufgabe zu erledigen, w\u00fcrde ich mich zun\u00e4chst auf diese Kennzahl konzentrieren und sie auf drei Tage reduzieren. Danach k\u00f6nnten wir \u00fcber Continuous Integration nachdenken.<\/em><\/p>\n<p><\/p>\n<p>Habe ich dich richtig verstanden, dass du denkst, dass es keinen Sinn macht, in ingenieurtechnische Praktiken zu investieren, wenn jede Aufgabe einen Monat dauert?<\/p>\n<p><\/p>\n<p><em>Sie verf\u00fcgen \u00fcber Continuous Integration. Dabei gibt es die M\u00f6glichkeit, innerhalb von 10 Minuten entweder eine Korrektur vorzunehmen oder zur\u00fcckzusetzen. Stellen Sie sich vor, Sie haben es ver\u00f6ffentlicht. Und selbst wenn Sie Continuous Deployment verwenden und es auf die Produktionsumgebung ausgerollt haben, bemerken Sie erst danach, dass etwas schiefgelaufen ist. Nun m\u00fcssen Sie es zur\u00fccksetzen, aber Ihre Datenbankmigration hat bereits stattgefunden. Ihr Datenbankschema ist auf die n\u00e4chste Version aktualisiert, au\u00dferdem gab es ein Backup, und es wurden auch Daten hinzugef\u00fcgt.<\/em><\/p>\n<p><\/p>\n<p><em>Was ist Ihre Alternative? Wenn Sie den Code zur\u00fccksetzen, kann dieser nicht mehr mit der aktualisierten Datenbank arbeiten.<\/em><\/p>\n<p><\/p>\n<p>Die Entwicklung erfolgt nur in eine Richtung, richtig? <\/p>\n<p><\/p>\n<p><em>Menschen mit schwachen Ingenieurpraktiken haben wahrscheinlich auch kein dickes Buch \u00fcber ... gelesen. Was tun mit Backups? Wenn Sie aus einem Backup wiederherstellen, verlieren Sie die Daten, die in diesem Zeitraum gesammelt wurden. Zum Beispiel haben Sie drei Stunden mit der neuen Version der Datenbank gearbeitet, und Benutzer haben sich registriert. Sie kehren auf ein altes Backup zur\u00fcck, weil das Schema mit der neuen Version nicht funktioniert, und somit haben Sie diese Benutzer verloren. Und sie sind unzufrieden und beschweren sich.<\/em><\/p>\n<p><\/p>\n<p><em>Um ein umfassendes Verst\u00e4ndnis f\u00fcr die Praktiken zu erlangen, die Continuous Integration und Continuous Delivery unterst\u00fctzen, reicht es nicht aus, einfach nur zu lernen, wie man schreibt. Erstens kann es sehr viele verschiedene Praktiken geben, was unpraktisch w\u00e4re. Zudem gibt es viele andere Ans\u00e4tze, wie die wissenschaftliche Methode. Diese wurde zum Beispiel einmal von GitHub popul\u00e4r gemacht. Dabei l\u00e4uft sowohl der alte Code als auch der neue Code gleichzeitig. Es handelt sich um die Entwicklung einer unvollendeten Funktion, die jedoch ein Ergebnis zur\u00fcckgeben kann, sei es 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 eine Abweichung gibt, protokollierst du dieses Ereignis. Auf diese Weise wei\u00dft du, dass deine neue Funktion bereit ist, \u00fcber den alten Code ausgerollt zu werden, wenn es \u00fcber einen bestimmten Zeitraum keine Unterschiede zwischen diesen beiden gibt.<\/em> <\/p>\n<p><\/p>\n<p><em>Solcher Praktiken gibt es Hunderte. Ich w\u00fcrde empfehlen, mit der Transbase-Entwicklung zu beginnen. Sie basiert nicht vollst\u00e4ndig auf Continuous Integration, aber die Praktiken sind die gleichen; ein Aspekt lebt schlecht ohne den anderen.<\/em> <\/p>\n<p><\/p>\n<p>Hast du die Transbase-Entwicklung als Beispiel gegeben, um zu zeigen, wo man Praktiken betrachten kann, oder empfiehlst du den Leuten, mit der Transbase-Entwicklung zu beginnen?<\/p>\n<p><\/p>\n<p><em>Schau dir das an, denn sie k\u00f6nnen es nicht nutzen. Um sie zu verwenden, muss man viel lesen. Und wenn die Frage bei jemandem auftaucht: \"Was soll ich mit einer Funktion anfangen, die einen Monat dauert?\", bedeutet das, dass er nicht \u00fcber die Entwicklung von Transbase gelesen hat. Ich w\u00fcrde es nicht empfehlen. Ich w\u00fcrde vorschlagen, sich ausschlie\u00dflich auf das Thema zu konzentrieren, wie man gro\u00dfe Aufgaben architektonisch in kleinere aufteilen kann. Das ist das Wesen der Dekomposition.<\/em><\/p>\n<p><\/p>\n<p><em>Dekomposition ist eines der Werkzeuge des Architekten. Zuerst f\u00fchren wir eine Analyse durch, dann die Dekomposition, gefolgt vom Synthese und schlie\u00dflich der Integration. So f\u00fcgt sich alles zusammen. Und wir m\u00fcssen zu Continuous Integration durch Dekomposition hindurch wachsen. Fragen tauchen in der ersten Phase auf, und wir sprechen bereits \u00fcber die vierte Phase, d. h. je h\u00e4ufiger man die Integration durchf\u00fchrt, desto besser. Es w\u00e4re noch zu fr\u00fch, sie zu machen; es w\u00e4re besser, zun\u00e4chst an seinem Monolithen zu arbeiten.<\/em> <\/p>\n<p><\/p>\n<p><em>Es m\u00fcssen einige Pfeile und K\u00e4stchen auf einem Diagramm gezeichnet werden. Man kann nicht einfach sagen, ich zeige jetzt das Architekturdiagramm einer neuen Anwendung und pr\u00e4sentiere ein K\u00e4stchen, in dem sich ein gr\u00fcner Knopf f\u00fcr die Anwendung befindet. In jedem Fall wird es mehr K\u00e4stchen und Pfeile geben. In jedem Diagramm, das ich gesehen habe, waren es mehr als eins. Und die Dekomposition erfolgt sogar auf der Ebene der grafischen Darstellung. Daher k\u00f6nnen die K\u00e4stchen unabh\u00e4ngig gemacht werden. Wenn nicht, habe ich gro\u00dfe Fragen an den Architekten.<\/em> <\/p>\n<p><\/p>\n<p>Es gibt eine Frage aus dem Chat: \u201eWenn das Review obligatorisch ist und lange dauert, also einen Tag oder mehr?\u201c<\/p>\n<p><\/p>\n<p>Sie haben Probleme mit dem Review-Prozess. Ein Review sollte nicht l\u00e4nger als einen Tag dauern. Das steht im Zusammenhang mit der vorherigen Frage, nur etwas entsch\u00e4rft. Wenn ein Review einen Tag dauert, dann handelt es sich wahrscheinlich um eine sehr umfangreiche \u00c4nderung, und es sollte kleiner gehalten werden. Im Transbase-Development, das Oleg empfohlen hat, gibt es einen Ansatz namens Continuous Review. Die Idee dahinter ist, dass wir absichtlich sehr kleine Pull Requests erstellen, weil wir darauf abzielen, kontinuierlich und schrittweise zu mergen. Daher \u00e4ndert der Pull Request nur eine Abstraktion oder 10 Zeilen. Dadurch ben\u00f6tigt das Review nur ein paar Minuten. <\/p>\n<p><\/p>\n<p>Wenn das Review einen Tag oder l\u00e4nger dauert, stimmt etwas nicht. Zun\u00e4chst einmal k\u00f6nnte es an Ihrer Architektur liegen. Vielleicht handelt es sich um einen gro\u00dfen Codeabschnitt von beispielsweise 1.000 Zeilen. Oder Ihre Architektur ist so komplex, dass sie f\u00fcr andere schwer verst\u00e4ndlich ist. Das ist ein seitliches Problem, das auch gel\u00f6st werden muss. M\u00f6glicherweise ist ein Review \u00fcberhaupt nicht notwendig. Das sollten Sie ebenfalls in Betracht ziehen. Ein Review kann ein Hemmschuh sein. Es bringt zwar einige Vorteile, aber Sie m\u00fcssen verstehen, warum Sie es durchf\u00fchren. Ist es ein schneller Weg, Informationen zu \u00fcbermitteln, oder m\u00f6chten Sie interne Standards festlegen? Wozu brauchen Sie das? Denn ein Review sollte entweder sehr schnell erfolgen oder g\u00e4nzlich entf\u00e4llt. Es geht darum wie bei der Transbase-Entwicklung \u2013 eine sehr sch\u00f6ne Geschichte, aber nur f\u00fcr erfahrene Leute. <\/p>\n<p><\/p>\n<p>Was die vier Metriken angeht, w\u00fcrde ich empfehlen, sie dennoch zu erfassen, um zu verstehen, wohin das f\u00fchrt. Schauen Sie sich die Zahlen an, sehen Sie sich das Bild an, um zu erkennen, wie schlecht die Situation ist. <\/p>\n<p><\/p>\n<p><em>(Dmitri) Ich bin bereit, mit dir dar\u00fcber zu diskutieren. Zahlen und Metriken sind gro\u00dfartig, praktikable L\u00f6sungen auch. Aber man muss verstehen, ob das f\u00fcr das Gesch\u00e4ft notwendig ist. Es gibt Unternehmen, die nicht so schnell \u00c4nderungen umsetzen m\u00fcssen. Ich kenne Firmen, bei denen man nicht alle 15 Minuten \u00c4nderungen vornehmen kann. Und das liegt nicht daran, dass sie schlecht sind. Das ist einfach der Lebenszyklus. Um Feature-Branches und Feature-Toggles zu implementieren, sind tiefgehende Kenntnisse notwendig.<\/em> <\/p>\n<p><\/p>\n<p>Das ist kompliziert. Wenn Sie mehr \u00fcber die Geschichte von Feature-Toggles lesen m\u00f6chten, kann ich Ihnen das sehr empfehlen. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. Und es gibt einen gro\u00dfartigen Artikel von Martin Fowler \u00fcber Feature-Toggles: welche Typen es gibt, Lebenszyklen usw. Feature-Toggles sind komplex. <\/p>\n<p><\/p>\n<p><em>Und du hast trotzdem die Frage nicht beantwortet: \u201eIst Jenkins notwendig oder nicht?\u201c<\/em><\/p>\n<p><\/p>\n<p>Jenkins ist in keiner Hinsicht notwendig. Ernsthaft, Werkzeuge wie Jenkins und Gitlab bieten Ihnen Komfort. Sie werden sehen, ob der Build erfolgreich war oder nicht. Sie k\u00f6nnen Ihnen helfen, aber sie bieten Ihnen keine Praxis. Sie k\u00f6nnen Ihnen nur ein \u201eOk\u201c oder \u201eNicht Ok\u201c geben. Und das, falls Sie \u00fcberhaupt Tests schreiben, denn wenn es keine Tests gibt, ist es fast sinnlos. Daher ist es zwar bequemer, aber insgesamt kann man auch ohne ihn leben und verliert nicht viel. <\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, wenn Sie Praktiken haben, ben\u00f6tigen Sie ihn nicht?<\/em><\/p>\n<p><\/p>\n<p>Ganz genau. Ich empfehle den Test von Jez Humble. Zuletzt habe ich eine gespaltene Meinung zu dem letzten Punkt. Aber insgesamt, wenn Sie drei Dinge haben: Sie f\u00fchren st\u00e4ndig Merges durch, Sie f\u00fchren Tests bei Commits im Master aus und beheben Builds im Master schnell, dann ben\u00f6tigen Sie wahrscheinlich nicht viel mehr. <\/p>\n<p><\/p>\n<p><em>W\u00e4hrend wir auf Fragen der Teilnehmer warten, habe ich eine Frage. Wir haben gerade \u00fcber Produktcode gesprochen. Hast du auch Infrastrukturcode verwendet? Ist das derselbe Code, mit denselben Prinzipien und demselben Lebenszyklus, oder gibt es dort andere Lebenszyklen und Prinzipien? Normalerweise, wenn alle \u00fcber Continuous Integration und Development sprechen, wird oft vergessen, dass es auch Infrastrukturcode gibt. In letzter Zeit wird das immer mehr. Sollten diese Regeln auch dort Anwendung finden?<\/em><\/p>\n<p><\/p>\n<p>Es w\u00e4re nicht nur angebracht, es w\u00e4re gro\u00dfartig, denn es w\u00fcrde das Leben definitiv erleichtern. Sobald wir mit Code arbeiten, nicht nur mit Bash-Skripten, sondern mit richtigem Code.<\/p>\n<p><\/p>\n<p><em>Halt, halt, 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 verletzen. Ich habe eine pers\u00f6nliche Abneigung gegen Bash. Es bricht oft unsch\u00f6n und unvorhersehbar, deshalb mag ich es nicht. Aber nehmen wir an, du hast Code in Bash. Vielleicht habe ich wirklich keine Ahnung, und dort gibt es gute Testframeworks. Ich bin einfach nicht auf dem Laufenden. Und wir erhalten die gleichen Vorteile.<\/p>\n<p><\/p>\n<p>Sobald wir mit Infrastruktur als Code arbeiten, sto\u00dfen wir auf die gleichen Probleme wie Entwickler. Vor einigen Monaten erhielt ich einen Pull-Request mit 1.000 Zeilen Bash-Code von einem Kollegen. Und man bleibt vier Stunden mit dem Review besch\u00e4ftigt. Die Probleme sind die gleichen. Es ist immer noch Code. Und immer noch Teamarbeit. Wir stecken bei dem Pull-Request fest und haben die gleichen Merge-Konflikte beim Bash zu l\u00f6sen. <\/p>\n<p><\/p>\n<p>Ich besch\u00e4ftige mich derzeit intensiv mit der attraktiven Programmierung von Infrastrukturen. Ich habe Pulumi in die Infrastruktur integriert. Das ist reines Programmieren. Dort sieht es noch ansprechender aus, weil ich alle M\u00f6glichkeiten der Programmiersprache habe, d. h. ich habe mit den gleichen If-Bedingungen an einer Stelle sch\u00f6ne Toggle erstellt, und alles l\u00e4uft hervorragend. Mein Beitrag ist bereits im Master. Alle k\u00f6nnen ihn sehen. Die anderen Ingenieure sind dar\u00fcber informiert. Es hat bereits Auswirkungen gehabt. Allerdings wurde es nicht f\u00fcr alle Infrastrukturen aktiviert, sondern zun\u00e4chst f\u00fcr meine Testumgebungen. Um deine Frage noch einmal zu beantworten: Ja, es ist notwendig. Es erleichtert uns Ingenieuren, die mit Code arbeiten, definitiv das Leben. <\/p>\n<p><\/p>\n<p><em>Gibt es noch weitere Fragen?<\/em> <\/p>\n<p><\/p>\n<p>Ich habe eine Frage. Ich m\u00f6chte die Diskussion mit Oleg fortsetzen. Insgesamt denke ich, dass Sie recht haben, dass wenn eine Aufgabe einen Monat in Anspruch nimmt, es ein Problem mit der Architektur gibt, es ein Problem mit der Analyse, Dekomposition, Planung usw. gibt. Aber ich habe das Gef\u00fchl, dass wenn Sie beginnen, nach Continuous Integration zu leben, Sie anfangen werden, die Probleme mit der Planung zu beheben, denn das wird Ihnen nicht erspart bleiben. <\/p>\n<p><\/p>\n<p><em>(Oleg) Ja, das stimmt. In Bezug auf den Aufwand ist diese Praxis mit jeder anderen ernsthaften Praxis vergleichbar, die die Kultur ver\u00e4ndert. Das Schwierigste beim \u00dcberwinden sind die Gewohnheiten, insbesondere die schlechten Gewohnheiten. Und wenn es notwendig ist, diese Praxis umzusetzen, erfordert das eine ernsthafte \u00c4nderung der Gewohnheiten der Beteiligten: Entwickler, Management, Produktionsleiter, dann k\u00f6nnen Sie mit \u00dcberraschungen rechnen.<\/em> <\/p>\n<p><\/p>\n<p><em>Welche \u00dcberraschungen k\u00f6nnten auftreten? Angenommen, Sie haben beschlossen, h\u00e4ufiger Integrationen durchzuf\u00fchren. Und an der Integration sind einige andere Dinge gebunden, zum Beispiel Artefakte. In Ihrem Unternehmen gibt es m\u00f6glicherweise die Regel, dass jedes Artefakt in irgendeinem System zur Lagerung von Artefakten erfasst werden muss. Und das nimmt Zeit in Anspruch. Eine Person muss best\u00e4tigen, dass sie als Release-Manager dieses Artefakt auf die Produktionsbereitschaft getestet hat. Wenn das 5-10-15 Minuten dauert und Sie einmal pro Woche ein Release machen, dann ist es nicht viel, wenn man einmal pro Woche eine halbe Stunde aufwendet.<\/em> <\/p>\n<p><\/p>\n<p><em>Wenn Sie Continuous Integration 10 Mal am Tag durchf\u00fchren, dann m\u00fcssen Sie 10 Mal 30 Minuten berechnen. Und das \u00fcbersteigt die Arbeitszeit dieses Release-Managers. Er wird m\u00fcde, das zu tun. Es gibt st\u00e4ndig laufende Kosten f\u00fcr bestimmte Praktiken. Und das ist alles.<\/em> <\/p>\n<p><\/p>\n<p><em>Sie m\u00fcssen entweder diese Regel aufheben, sodass Sie sich nicht mehr mit so etwas besch\u00e4ftigen, d.h. Sie ordnen nicht mehr manuell einen Grad der \u00dcbereinstimmung von etwas zu etwas anderem zu. Sie verlassen sich vollst\u00e4ndig auf einen automatisierten Satz von Tests zur Bereitstellung.<\/em> <\/p>\n<p><\/p>\n<p><em>Und wenn Sie von jemandem eine Best\u00e4tigung ben\u00f6tigen, damit der Hauptverantwortliche unterschreibt, und Sie ohne Vasja, der sagt, dass er es erlaubt, nicht in die Produktion gehen, dann st\u00f6ren all diese Dinge die Praktiken. Denn wenn es mit Steuern verbundene Aktivit\u00e4ten gibt, vervielfacht sich alles um das 100-Fache. Deshalb wird eine Ver\u00e4nderung oft nicht von allen mit Freude wahrgenommen. Denn es ist schwierig, die Gewohnheiten der Menschen zu \u00e4ndern.<\/em> <\/p>\n<p><\/p>\n<p><em>Wenn jemand eine gewohnte Arbeit verrichtet, macht er das, ohne gro\u00df dar\u00fcber nachzudenken. Die kognitive Belastung ist gleich null. Er arbeitet einfach nach einem vorgefertigten Plan, in seinem Kopf gibt es bereits eine Checkliste, er hat es tausendmal gemacht. Und sobald Sie kommen und ihm sagen: 'Lass uns diese Praxis abschaffen und ab Montag eine neue einf\u00fchren', wird das f\u00fcr ihn eine erhebliche kognitive Belastung. Und diese tritt sofort f\u00fcr alle ein.<\/em> <\/p>\n<p><\/p>\n<p><em>Es ist zwar nicht f\u00fcr jeden m\u00f6glich, sich diesen Luxus zu leisten, aber ich handhabe es immer so: Wenn ein neues Projekt startet, werden gew\u00f6hnlich alle ungepr\u00fcften Praktiken sofort integriert. Solange das Projekt noch in den Anf\u00e4ngen steckt, sind wir praktisch nicht gef\u00e4hrdet. Es gibt noch kein Prod, also gibt es nichts, was wir ruinieren k\u00f6nnten. Daher k\u00f6nnen wir diesen Ansatz als \u00dcbung nutzen. Das funktioniert. Allerdings haben nicht alle Unternehmen die M\u00f6glichkeit, solche Projekte h\u00e4ufig zu starten. Das ist auch etwas seltsam, da es derzeit einen umfassenden digitalen Wandel gibt; alle sollten Experimente durchf\u00fchren, um mit der Konkurrenz Schritt zu halten.<\/em> <\/p>\n<p><\/p>\n<p>Hier kommen wir zu dem Punkt, dass man zun\u00e4chst ein klares Verst\u00e4ndnis daf\u00fcr haben muss, was man tun m\u00f6chte. Die Welt ist nicht perfekt, und das Prod ist ebenfalls nicht ideal. <\/p>\n<p><\/p>\n<p><em>Ja, diese Dinge sind miteinander verbunden.<\/em><\/p>\n<p><\/p>\n<p>Auch Unternehmen haben oft nicht den klaren \u00dcberblick, dass sie genau in diese Richtung gehen sollten. <\/p>\n<p><\/p>\n<p><em>Es gibt Situationen, in denen wirklich keine \u00c4nderungen m\u00f6glich sind. Das ist der Fall, wenn der Druck auf das Team steigt. Das Team ist bereits ziemlich ersch\u00f6pft. Es hat keine Zeit f\u00fcr Experimente. Von morgens bis abends entwickeln sie neue Funktionen. Und das Management verlangt immer mehr. In einer solchen Situation sind Ver\u00e4nderungen unm\u00f6glich. Das Team kann nur gesagt werden, dass es morgen genau wie gestern arbeiten wird, nur dass die Funktionen etwas umfangreicher sein m\u00fcssen. Es sind keine \u00dcberg\u00e4nge zu anderen Praktiken m\u00f6glich. Dies ist die klassische Situation, in der es keine Zeit zum Feilen gibt, weil die B\u00e4ume gef\u00e4llt werden m\u00fcssen; also wird mit einer 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 wichtig, eine umfassende Testabdeckung auf verschiedenen Ebenen zu haben. Wie viel Zeit wird f\u00fcr Tests aufgewendet? Das ist irgendwie teuer und nimmt viel Zeit in Anspruch.\u201c<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) Das ist ein klassisches Missverst\u00e4ndnis. Es sollten gen\u00fcgend Tests vorhanden sein, damit Sie selbst sicher sind. Continuous Integration ist nicht so aufgebaut, dass zuerst 100 % der Tests durchgef\u00fchrt werden, und erst dann fangen Sie an, diese Praxis anzuwenden. Continuous Integration reduziert Ihre kognitive Belastung, da jede \u00c4nderung, die Sie sehen, so offensichtlich ist, dass Sie verstehen, ob sie etwas kaputt macht oder nicht, auch ohne Tests. Sie k\u00f6nnen dies mental schnell testen, weil es sich um kleine \u00c4nderungen handelt. Selbst wenn Sie nur manuelle Tester haben, wird es auch einfacher f\u00fcr sie. Sie haben das Update herausgebracht und gesagt: \u201eSchau mal, ist etwas kaputt?\u201c Sie haben \u00fcberpr\u00fcft und gesagt: \u201eNein, es ist nichts kaputt.\u201c Weil der Tester wei\u00df, wo er hinschauen muss. Ihr Commit ist mit einem bestimmten Codeabschnitt verkn\u00fcpft. Und das wird durch ein spezifisches Verhalten ausgel\u00f6st.<\/em><\/p>\n<p><\/p>\n<p>Das hast du nat\u00fcrlich gesch\u00f6nt. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Da stimme ich nicht zu. Es gibt die Praxis des Testgetriebenen Entwickelns, die genau davor sch\u00fctzt.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Ich habe das bisher noch nicht angesprochen. Die erste Illusion ist, dass man 100 % Tests schreiben muss oder dass man sich \u00fcberhaupt nicht mit Continuous Integration befassen sollte. Das ist nicht wahr. Es sind zwei parallele Praktiken, die nicht direkt voneinander abh\u00e4ngen. Ihre Testabdeckung sollte optimal sein. Optimal bedeutet, dass Sie selbst sicher sind, dass die Qualit\u00e4t des Masters, die nach einem Commit \u00fcbrig bleibt, Ihnen erlaubt, am Freitagabend betrunken den \u201eDeploy\u201c-Button mit Zuversicht zu dr\u00fccken. Wie erreichen Sie das? Durch Reviews, durch Abdeckung, durch gutes Monitoring.<\/em> <\/p>\n<p><\/p>\n<p><em>Gutes Monitoring ist nicht zu unterscheiden von Tests. Wenn Sie Tests einmal in der Pre-Prod-Phase ausf\u00fchren, \u00fcberpr\u00fcfen sie alle Ihre Anwendungsf\u00e4lle nur einmal. Wenn Sie jedoch einen unendlichen Zyklus laufen lassen, ist dies Ihr ausgebautes Monitoring-System, das st\u00e4ndig alles testet \u2013 ob es ausgefallen ist oder nicht. In diesem Fall besteht der Unterschied nur in der Einmaligkeit oder der Wiederholung. Ein sehr gutes Set an Tests \u2026, die unendlich oft ausgef\u00fchrt werden, ist Monitoring. Und richtiges Monitoring sollte genau so sein.<\/em> <\/p>\n<p><\/p>\n<p><em>Und wie genau erreichen Sie den Zustand, in dem Sie sich am Freitagabend bereit f\u00fchlen, nach Hause zu gehen, ist eine ganz andere Frage. Vielleicht sind Sie einfach ein mutiger Draufg\u00e4nger.<\/em> <\/p>\n<p><\/p>\n<p>Lassen Sie uns ein wenig zu Continuous Integration zur\u00fcckkehren. Wir sind ein wenig in eine andere komplexe Praxis abgeschweift. <\/p>\n<p><\/p>\n<p><em>Und die zweite Illusion ist, dass MVP schnell erstellt werden sollte, weshalb Tests \u00fcberhaupt nicht notwendig sind. Das ist nicht ganz richtig. Wenn Sie bei einem MVP eine User Story schreiben, k\u00f6nnen Sie entweder impulsiv handeln, indem Sie geh\u00f6rt haben, dass es eine bestimmte User Story gibt, und sofort mit dem Codieren beginnen, oder Sie arbeiten nach TDD. Die Erfahrung zeigt, dass es nicht l\u00e4nger dauert, wenn Sie nach TDD arbeiten; Tests sind ein Nebeneffekt. Die TDD-Praxis besteht nicht darin, zu testen. Obwohl es Test Driven Development hei\u00dft, geht es dabei eigentlich nicht um Tests. Es ist eher ein architektonischer Ansatz. Es geht darum, genau das zu schreiben, was ben\u00f6tigt wird, und das, was nicht ben\u00f6tigt wird, zu vermeiden. Diese Praxis konzentriert sich auf die n\u00e4chste Iteration Ihrer Gedanken hinsichtlich des Aufbaus der Anwendungsarchitektur.<\/em> <\/p>\n<p><\/p>\n<p><em>Es ist also nicht einfach, sich von diesen Illusionen zu befreien. MVP und Tests stehen nicht im Widerspruch zueinander. Ganz im Gegenteil, wenn Sie Ihr MVP gem\u00e4\u00df der TDD-Praxis erstellen, werden Sie es besser und schneller umsetzen, als wenn Sie dies ohne Praktiken und zuf\u00e4llig tun.<\/em><\/p>\n<p><\/p>\n<p>Das ist eine sehr nicht offensichtliche und komplexe \u00dcberlegung. Wenn man h\u00f6rt, dass ich jetzt noch Tests schreiben werde und gleichzeitig schneller etwas machen kann, klingt das absolut unplausibel. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Viele, wenn sie von MVP sprechen, haben einfach keine Lust, etwas Vern\u00fcnftiges zu schreiben. Und das sind letztendlich verschiedene Dinge. Man sollte MVP nicht in etwas Schlechtes verwandeln, das nicht funktioniert.<\/em> <\/p>\n<p><\/p>\n<p>Ja, ja, du hast recht.<\/p>\n<p><\/p>\n<p><em>Und dann pl\u00f6tzlich das MVP in der Produktion.<\/em><\/p>\n<p><\/p>\n<p>F\u00fcr immer. <\/p>\n<p><\/p>\n<p>TDD klingt zun\u00e4chst ungew\u00f6hnlich, wenn man h\u00f6rt, dass man Tests schreibt und scheinbar mehr Arbeit leistet. Es mag merkw\u00fcrdig erscheinen, aber tats\u00e4chlich l\u00e4uft es so schneller und ansprechender. Wenn du einen Test schreibst, denkst du bereits intensiv dar\u00fcber nach, welcher Code geschrieben wird, wie er aufgerufen wird und welches Verhalten wir davon erwarten. Du sagst nicht einfach, dass du eine Funktion geschrieben hast, die etwas tut. Stattdessen \u00fcberlegst du dir zuerst, welche Bedingungen sie erf\u00fcllen muss und wie sie aufgerufen werden soll. Du deckst das mit Tests ab und daraus erkennst du, wie die Schnittstellen innerhalb deines Codes aussehen werden. Das hat einen erheblichen Einfluss auf die Architektur. Dein Code wird automatisch modularer, weil du zuerst versuchst zu verstehen, wie du ihn testen wirst, bevor du ihn schreibst. <\/p>\n<p><\/p>\n<p>Ich hatte mit TDD die Erfahrung, dass ich zu einem bestimmten Zeitpunkt einen Mentor f\u00fcr Ruby engagiert habe, als ich noch Ruby-Programmierer war. Und er sagt: \"Lass uns TDD machen.\" Ich dachte mir: \"Mist, jetzt muss ich noch etwas zus\u00e4tzlich schreiben.\" Und wir haben vereinbart, dass ich in den n\u00e4chsten zwei Wochen den gesamten funktionierenden Code in Python nach TDD schreibe. Nach zwei Wochen wurde mir klar, dass ich nicht mehr zur\u00fcck will. Wenn man zwei Wochen lang versucht, dies \u00fcberall anzuwenden, merkt man, wie viel einfacher es wird, auch nur zu denken. Aber das ist nicht offensichtlich, deshalb empfehle ich jedem, wenn ihr das Gef\u00fchl habt, dass TDD kompliziert, langwierig und \u00fcberfl\u00fcssig ist, haltet euch zwei Wochen lang daran. Mir haben zwei Wochen daf\u00fcr gereicht.<\/p>\n<p><\/p>\n<p><em>(Dmitrij) Wir k\u00f6nnen diesen Gedanken aus der Perspektive des Infrastrukturmanagements weiterentwickeln. Bevor wir etwas Neues einf\u00fchren, f\u00fchren wir ein Monitoring durch und starten dann. In diesem Fall wird das Monitoring zu einem regul\u00e4ren Test. Es gibt eine Entwicklung durch Monitoring. Aber fast alle sagen, dass es lange dauert, dass sie es als l\u00e4stig empfinden und einen vorl\u00e4ufigen Entwurf erstellt haben. Wenn wir das Monitoring richtig durchf\u00fchren, verstehen wir den Zustand des CI-Systems. In einem CI-System gibt es viel Monitoring. Wir verstehen den Zustand des Systems und wissen, was darin vor sich geht. Und w\u00e4hrend der Entwicklung gestalten wir das System so, dass es den gew\u00fcnschten Zustand erreicht.<\/em> <\/p>\n<p><\/p>\n<p><em>Diese Praktiken sind seit langem bekannt. Wir haben das vor etwa 4 Jahren besprochen. Aber in den letzten 4 Jahren hat sich praktisch nichts ge\u00e4ndert.<\/em> <\/p>\n<p><\/p>\n<p><em>Ich schlage vor, die offizielle Diskussion an dieser Stelle zu beenden.<\/em><\/p>\n<p><\/p>\n<p>Video (als Medienelement eingef\u00fcgt, funktioniert aber aus irgendeinem Grund 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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\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:description\" content=\"\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\" \/>\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, nicht Jenkins. Andrei Alexandrov | ProHoster","description":"Wir werden besprechen, warum CI-Tools und CI v\u00f6llig unterschiedliche Konzepte sind. Welches Problem CI l\u00f6sen soll, woher die Idee stammt, welche aktuellen Beweise es daf\u00fcr gibt, dass es funktioniert, und wie man erkennt, dass man \u00fcber echte Praxis verf\u00fcgt und nicht nur Jenkins installiert hat. Der Gedanke, einen Vortrag \u00fcber Continuous Integration zu halten, entstand vor einem Jahr, als ich bei Vorstellungsgespr\u00e4chen nach einem Job suchte. Ich habe mit","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:description":"\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","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"},"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}]}}