Infrastruktur als Code: Wie wir Überarbeitung unseres Entwicklungs- / Freigabeprozesses an unsere Teamskala

Veröffentlicht

(11. Dezember 2020)

In diesem Artikel zeigen wir, wie wir in der Vergangenheit mit unserem kontinuierlichen Bereitstellungsprozess umgegangen sind und was uns dazu veranlasst hat, das zu ändern, was wir haben. und welche Anstrengungen wir unternommen haben, um den Prozess so einfach / effektiv wie möglich zu gestalten.

Der Artikel mag einen ersten Eindruck von Entwicklern vermitteln, aber im Wesentlichen wirkt sich der Release-Prozess auf alle Teams aus und darauf, wie sie selbst funktionieren Wenn Sie mit anderen Teams zusammenarbeiten, werden wir zeigen, wie Rollen verschoben werden, indem wir den Prozess ändern.

Über uns

Wir bei Halan helfen bei der Bereitstellung von Ride-Hagel- und On-Demand-Logistiklösungen ( Raten, Lieferung, Online-Zahlungen, E-Commerce) für die unterversorgte Bevölkerung durch die vorhandenen Technologien in Transport und anderen Dienstleistungen, können Sie unsere ap überprüfen p hier ( android / iOS )

Den alten Prozess angeben Es ist fällig, das Gute und das Schlechte.

Wir werden damit beginnen, wie wir unseren Prozess in der Vergangenheit gehandhabt haben und wie sich dies entweder positiv oder negativ auf uns ausgewirkt hat.

Für mein Team haben wir Fast alles wurde über AWS mit GitHub als Versionskontrollsystem bereitgestellt. Daher müssen wir einen Weg finden, um Funktionen aus unseren GitHub-Repos an AWS-Services zu senden.

Bereitstellungen zur Versionskontrolle

Wir Basierend auf AWS-Code-Pipeline setzen wir Trigger, um eine -Bereitstellungspipeline zu starten , wenn ein neues Commit in einem der Hauptzweige zusammengeführt wird, die die bekannten Stufen darstellen: dev , prod und Staging Umgebungen.

Übersicht darüber, wie Bereitstellungen ausgelöst werden

Dieser Ablauf bedeutet dass sich jede Funktion im Master-Zweig in der -Produktion befindet, , die das Zusammenführen zum Master sicher zu einem Tabuthema macht, das diskutiert werden muss und nicht jeder hatte dass die Erlaubnis hat, Ihre PR auf dem Master zusammenzuführen.

Das Gleiche galt für andere Zweige, aber das war es nicht. Dies ist kein wirkliches Problem, da Entwickler- und Staging-Envs nicht wirklich beängstigend sind.

Unsere Qualitätskontrolle hat begonnen, Funktionen zu testen und zu überprüfen, wenn sie auf dem Staging zusammengeführt werden. Dies bedeutet, dass sie zuerst auf Staging-Env und dann, wenn sie überprüft werden, getestet werden wird das Feature in den Zweig master zusammengeführt. Das scheint gut zu funktionieren, aber schauen wir uns die Nachteile eines solchen Prozesses an.

Auf diese Weise konnten wir auf jeder Stufe (dev, staging) mehrere Funktionen gleichzeitig testen und bereitstellen, was gut und schlecht ist Zur gleichen Zeit, weil:

  • Das bedeutet, dass Entwickler nicht aufeinander warten müssen, um die Kontrolle über die Entwicklungs- / Staging-Umgebung zu erlangen.
  • Dies bedeutet jedoch, dass die Funktionen aktiviert sind Die Entwicklungsstufe könnte dazu führen, dass fälschlicherweise sich gegenseitig dazu veranlasst, entweder nicht zu funktionieren oder arbeiten (falsch positiv), und beide Fälle sind wirklich schlecht und könnten Bewirken Sie, dass Code in die Produktion geht, während er nicht wirklich funktioniert.

Divergierende Zweige, unnötige Neubasis

Wie Sie vielleicht bereits bemerkt haben, haben wir dies für die Bereitstellung auf gesagt dev env, Sie müssen Ihren Code im dev-Zweig zusammenführen. Nun, dieser Teil hat die Zeitachse unserer Niederlassung leider schnell durcheinander gebracht, da:

  • Nicht alle Funktionen, die auf dev getestet wurden, gehen in die Produktion, so dass wir in unserer einheitlichen dev-Niederlassung wie Geister-Commits herumliegen hatten
  • Ohne Zweifel stellen die Leute in einem Experimentierlabor fest, dass sie nach einer Weile etwas falsch gemacht haben, und beschließen, ihren Code / ihre Commits zu löschen und einen neuen zu starten, aber das lässt uns immer noch bei ihren alten Commits auf dem Entwicklungszweig zusammengeführt.

Diese Art von Verhalten führte zu einer sogenannten Divergenz zwischen Zweigen, um ein -Feature Zweig, dessen Basis in dev ist, müssen Sie Konflikte ! Das ist unangenehm seltsam, dass Sie buchstäblich mit Geistern in Konflikt geraten und Dinge lösen, die niemals mehr in der Produktion sein werden Zwei schlechte Optionen:

  • Erstellen Sie einen neuen Zweig für Ihr Feature, der aus Ihrem ursprünglichen Feature-Zweig gegabelt wurde, und lösen Sie Konflikte. Wenn Sie den Test abgeschlossen haben, führen Sie den ursprünglichen Zweig in den Master ein.
  • Lösen Sie Konflikte in Ihrem Zweig, und wählen Sie dann Ihre Commits in einem neuen Zweig aus, wenn Sie mit Master zusammenführen.

Wenn mehr Entwickler unserem Team beitreten, werden die Dinge hässlicher und die Divergenz wird sicherlich einen Anstieg erfordern.

Überarbeitung des Erstellungs- / Bereitstellungsprozesses

Als erstes wollten wir diese divergierenden Zweige beseitigen. Wir brauchen eine neue Methode Um Features nahtlos sicher in die Produktion zu bringen und zu steuern, wie viele Features in der Produktion bereitgestellt werden, ohne dass die Quellcodeverwaltung mit dem Bereitstellungsgeschäft verbunden ist.

Ein kleiner Überblick über AWS

Zuerst müssen wir die Hauptfunktionen identifizieren Elemente, die bei uns eine Rolle spielen werden:

  • Github : Quellcodeverwaltung Repos für jeden Mikrodienst da draußen.
  • Amazon ECR : eine Docker-Image-Registrierung In Repos unterteilt, repräsentiert jedes Repo auch einen Mikrodienst und enthält Die Images, die für Service X gepusht wurden und direkt für diesen Service verwendet oder bereitgestellt werden können, damit er funktioniert.
  • Amazon ECS / EC2 / EKS : Hier leben unsere Mikrodienste zusammen mit ihren Umgebungen. ECS ist in Cluster unterteilt. Jeder Cluster enthält eine Reihe von Diensten, von denen jeder eine Aufgabendefinition enthält, die Informationen wie Umgebungsvariablen enthält , Berechnen von Spezifikationen, Netzwerk usw.

Wir müssen also einen Weg finden, diese miteinander zu verbinden, damit wir als Entwicklerteam die Bereitstellung von Funktionen erleichtern und die Qualitätskontrolle diese steuern und überprüfen kann Funktionen.

Wir dachten, wir könnten einen Mittelsmann-Dienst definieren, einen -Dienst , der für Bereitstellen von anderen Diensten. Wir hatten zwei Hauptbefehle, die dieser Dienst verarbeiten sollte:

  • Build-Befehl: wir Sie möchten in der Lage sein, ein Image zu erstellen und es von jedem gewünschten Zweig / Commit von einem bestimmten GitHub-Repo zu einem bestimmten ECR-Repo an ECR zu senden.
  • Bereitstellungsbefehl: Wir möchten in der Lage sein, ein bestimmtes Image aus einem Repo auf ECR ​​für alle Cluster bereitzustellen, die Service X enthalten.

Nehmen wir an Jeder dieser Befehle unter dem Mikroskop und sehen, was jeder dieser Befehle beinhaltet. Wir beginnen mit dem Befehl Build :

  • Zunächst müssen wir das Repo am angegebenen Commit / Branch klonen.
  • Erstellen Sie ein Docker-Image mit der Docker-Datei in diesem Repo.
  • Drücken Sie die Taste erstelltes Image für ECR-Repo mit einem neuen Tag, falls erforderlich oder spätestens.

Während all diese Schritte sicherlich doab sind Datei in unserem neuen Bereitstellungsdienst, aber wir haben festgestellt, dass dies umständlich ist, da das Erstellen von Docker -Bildern viel Ressourcen und das beschränkt unseren neuen Service auf einige gleichzeitige Bereitstellungen oder machen es so gigantisch in Ressourcen.

Wir dachten, wir könnten, anstatt all diese Arbeit am Dienst selbst zu erledigen, eine neue Workflow auf Github auf diesem Repo und Übergabe an alles Aufgabendetails wie der auszucheckende Zweig und das zu sendende ECR-Repo signalisieren dem Benutzer nach Abschluss des Vorgangs einen Web-Hook . Natürlich gibt es dafür auch andere Lösungen, wie z. B. Jenkins für eine bessere Sicherheit, um sicherzustellen, dass Ihr Code auf von Ihnen verwalteten Computern aufbaut.

Das hat den oben erwähnten Workflow geändert und sieht nun wie folgt aus:

  • Build-Details vom Benutzer erhalten.
  • Löst eine Github -Aktion auf dem aus angegebenes Repo.
  • Github-Aktionen drehen eine neue Maschine , die uns mit dem Build-Status benachrichtigt, wenn Wenn dies erledigt ist, wird das Commit auch mit der Jira-Kartennummer versehen, an der Sie arbeiten.

Der zweite Befehl ist der Depoly -Befehl, der viel einfacher ist als der Build-Befehl. Wir müssen hier nur:

  • Bereitstellungsdetails vom Benutzer erhalten.
  • Starten Sie eine neue Bereitstellungsaufgabe für jeden Cluster, der den Dienst enthält, und geben Sie die Image-URL in ECR an.

Bereitstellungsworkflow

Das ist es wirklich für die Bereitstellung! Vergleichen Sie diesen Workflow mit dem, was wir zuvor hatten, und sehen Sie, wie sich unsere Release-Strategie geändert hat.

Die Verwendung des neuen Prozesses zum Bereitstellen Ihres Codes auf einer der Stufen (prod, dev, staging) erfordert keinerlei Zusammenführungen , der Code ist völlig unabhängig von Bereitstellung , wir könnten 20 Funktionen sind im Hauptzweig bereit und wählen nur 10 von ihnen.

Dies impliziert aber auch, dass wir nur ein Merkmal haben können Auf dem Dev-Zweig getestet, es sei denn, zwei Entwickler haben zugestimmt, aufeinander abzustimmen

Dies lieferte uns auch ein besseres Rollback Strategie gegen Produktionsprobleme. Jetzt haben wir einen markierten Hauptzweig für jede Funktion / Aufgabe

Nächste Schritte

Wir arbeiten derzeit an der Automatisierung Unser Prozess ist besser, einschließlich Umgebungsvariablen und Maschinenspezifikationen. Sie werden alle als Code verfügbar sein, wenn wir diese Spezifikationen ändern Auf unseren Maschinen in AWS in der jeweiligen Umgebung müssen diese Werte nicht jedes Mal in AWS manuell codiert werden.

Damit haben wir eine bessere Kontrolle und Sichtbarkeit aller unserer Servicekonfigurationen, alles in unserer Infrastruktur wird in Code und nur einen Klick entfernt sein, um aktualisiert zu werden! Damit wir unsere Infrastruktur unabhängig vom Dienstanbieter ändern können, können wir beispielsweise von AWS auf die Google Cloud wechseln und müssen nur die Befehle ändern, die vom Bereitstellungsdienst verwendet werden, um unsere Infrastruktur auf dem neuen Dienstanbieter bereitzustellen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.