502 Eine Applikation als Container mit CI pipelines deployen [4 PT]

Updated . Posted . Visible to the public.

In diesem Kapitel wirst du eine Applikation in ein Containerimage verpacken und dieses via CI/CD bauen. Anschließend baust du die notwendige Infrastruktur für das Deployment mit Terraform und lässt die Terraform Aufgaben auch in CI/CD laufen. Dieses Kapitel ist sehr praxisnah und ähnliche Aufgaben werden dich auch später erwarten.

Ziele

  • Du verstehst wie du eine Applikation als Container Image bauen und deployen kannst
  • Du hast gelernt wie CI Jobs in Gitlab funktionieren
    • Du weißt was Pipelines und Jobs sind
    • Du kannst erklären was stages sind
    • Welche "Daten"/"Dateien" stehen einem Job zur Verfügung?
    • Welche Arten von Variablen gibt es?
    • Was ist ein Executor und welche Arten gibt es?
    • Was sind Artifacts und für was benötige ich diese?
    • Wie unterscheidet sich ein Cache von einem Artifact?
    • Erkläre Rules für die CI Pipelines
      • Wenn eine Rule matched, werden dann die anderen noch evaluiert?
  • Du kannst die Gitlab Container Registry verwenden
  • Du kannst ECR verwenden
  • Du hast Terraform mit CI Jobs verwendet
  • Du verstehst was Continuous Integration bedeutet

Inhalte

Aufgaben

Die Anforderungen in diesem Kapitel sind abstrakter. Das bedeutet, dass du bis zu einem gewissen Grad selbst entscheiden kannst, wie du bestimmte Dinge umsetzt. Denke an Best Practices und das ein Mentor einen Blick darauf haben wird, dass eine Lösung gut funktioniert. Der Anspruch sollte einer Architektur entsprechen, die demnächst produktiv eingesetzt wird. Teile wie das Monitoring dürfen allerdings noch fehlen, da diese später hinzugefügt werden.

Als Szenario kannst du dir vorstellen, dass eine App entwickelt wurde, aber die Entwickler keinerlei Ahnung von Automatisierung und Deployment haben. Jetzt ist es deine Aufgabe den Entwicklern eine entsprechende Konfiguration zur Verfügung zu stellen.

Achte wie immer darauf die einzelnen Aufgaben in Feature Branches zu verpacken und einen Merge Request für deinen Mentor zu erstellen.

  1. Forke das Git Repository der Applikation notestar. Lies die README.md des Projekts um zu verstehen was erforderlich ist um diese Applikation zu betreiben.

  2. Sorge dafür, dass für die Applikation ein funktionierendes Dockerimage gebaut werden kann. Das Docker Image soll auch in CI Pipelines gebaut werden mit folgenden Regeln:

    • Verwenden der gitlab container registry
    • Wenn ein git tag gepushed wird, der die regex /^v\d+.\d+.\d+$/ matched, soll ein container image mit genau diesem tag gepushed werden. Außerdem auch latest
    • In einem Merge Request soll ein image mit dem Namen des Branches gepushed werden. Beachte, dass Branches / im Namen haben können aber Container Image Tags nicht. Finde einen einfachen Weg dieses Problem zu vermeiden.
  3. Verwende Docker Compose um die Applikation lokal zu testen. Erweitere die bestehende docker-compose.yml. Die vorhandene Datei ist nicht optimal konfiguriert, achte darauf das auch zu verbessern.

  4. Erstelle ein Terraform Repository mit einer funktionierenden CI Konfiguration für Terraform. Folgendes soll erfüllt sein:

    • Alles was in den main/master branch gepushed wird, wird automatisch geplant. Der erstellte Plan soll einem manuellen apply Job zur Verfügung stehen.
    • In Merge requests soll automatisch ein terraform plan ausgeführt werden
  5. Erstelle einen CI Job der in Merge Requests die Tests laufen lässt. Beachte, dass dafür ein laufender PostgreSQL benötigt wird und die Zugangsdaten per Environment Variable gesetzt werden müssen.

  6. Betrachte die Tests, die für dieses Projekt geschrieben wurden. Ohne dich im Detail vielleicht mit Go auszukennen: Nenne mindestens 2 Dinge, die man an den Tests verbessern könnte/sollte.

  7. Erstelle einen CI Job der pre-commit in Merge Request Pipelines laufen lässt. Da dafür einige Abhängigkeiten notwendig sind, kann es sein, dass du ein eigenes Container Image hierfür benötigst.

  8. Ersetze die Gitlab Container Registry mit ECR.

  9. Erstelle mit Terraform eine Infrastruktur für die Applikation, die folgende Anforderungen erfüllt:

    • Wichtig: Überlege dir erst eine Lösung und stelle sie kurz deinem Mentor vor. Frag auch nach force_ssl für RDS.
    • Beliebig viele Instanzen der Applikation startbar (horizontale Skalierung)
    • Im Idealfall möglichst wenig Komponenten, die einer aktiven Wartung bedürfen (z.B. EC2 Instanzen)
    • Da die Applikation keinerlei Authentifizierung hat, musst du den Zugriff beschränken. Das sollte mindestens auf IP-Ebene geschehen. Optional auch mit HTTP Basic Authentication.
  10. Überlege und baue eine CI/CD Lösung, die immer das zuletzt gepushte Container Image mit Versions Tag (nicht Branchname) automatisch deployed.

  11. terraform destroy nachdem du die Infrastruktur deinem Mentor gezeigt hast

Claus-Theodor Riegg
Last edit
Emma Heinle
License
Source code in this card is licensed under the MIT License.
Posted by Claus-Theodor Riegg to DevOps Curriculum (2023-01-11 16:00)