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
undJobs
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 einemArtifact
? - Erkläre
Rules
für die CI Pipelines- Wenn eine Rule matched, werden dann die anderen noch evaluiert?
- Du weißt was
- 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
- Docker Compose Show archive.org snapshot
- Gitlab CI Show archive.org snapshot
- Basics of Gitlab CI Show archive.org snapshot
- First Gitlab Pipeline Show archive.org snapshot
- A Beginners Guide to Continuous Integration Show archive.org snapshot
- Infrastructure as Code with Terraform and GitLab Show archive.org snapshot
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.
-
Forke das Git Repository der Applikation notestar. Lies die
README.md
des Projekts um zu verstehen was erforderlich ist um diese Applikation zu betreiben. -
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 auchlatest
- 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.
-
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. -
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 manuellenapply
Job zur Verfügung stehen. - In Merge requests soll automatisch ein
terraform plan
ausgeführt werden
- Alles was in den
-
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.
-
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.
-
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. -
Ersetze die Gitlab Container Registry mit
ECR
. -
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.
-
Wichtig: Überlege dir erst eine Lösung und stelle sie kurz deinem Mentor vor. Frag auch nach
-
Überlege und baue eine CI/CD Lösung, die immer das zuletzt gepushte Container Image mit Versions Tag (nicht Branchname) automatisch deployed.
-
terraform destroy
nachdem du die Infrastruktur deinem Mentor gezeigt hast