Wenn in einem Team an einer neuen Anwendung gearbeitet wird, teilt man gerne Aufgaben untereinander auf. Wenn jeder aber separat arbeitet und seine Aufgabe zuerst ganz erfüllt ohne zu wissen, was und wie die anderen ihre Aufgaben füllen, wird es sehr schwierig alle Teile der Anwendung zusammenzubringen. Das führt schnell zu Fehlern und braucht viel Zeit, bis alles gemeinsam integriert worden ist. Wahrscheinlich hast du die Erfahrung auch schon gemacht, dass man eine Sache ändert, weil es an der Stelle Sinn macht und plötzlich entstehen dadurch fünf neue Fehler an ganz anderen Stellen, da der Code nicht mehr zusammen passt beispielsweise.
Im Bereich des Softwareengineering, ist eine Kombination aus Continuous Integration (CI), Continuous Delivery und Continuous Deployment (CD) oft bekannt als CI/CD. CI/CD ist eine Methode, die die Integration von einem Code erleichtert. Dadurch kann der gesamte Zyklus von Entwicklung bis Nutzung in der Produktion automatisiert und überwacht werden und wird daher oft CI/CD-Pipeline genannt. Diese Pipeline besteht aus folgenden Schritten:
Für eine Continuous integration (CI) werden alle Codeänderungen im Main Branch eines Code Repositories gespeichert. Diese Änderungen sollen früh und häufig durchgeführt werden und automatisch jede Änderung testen. Dadurch sollen Fehler und Security Probleme früh identifiziert und behoben werden als sonst in einem normalen Softwareentwicklungszyklus. Durch häufiges pushen der eigenen Codeänderungen wird auch die Wahrscheinlichkeit reduziert, dass verschiedene Entwickler an der gleichen Stelle arbeiten. Da der Code in einem Repository gespeichert wird, wird damit jede Änderung durch die Versionsverwaltung nachverfolgt.
Im nächsten Schritt der Continuous Delivery wird der gesamte Code (Build) automatisch in beispielsweise einer Testumgebung getestet.
Im letzten Schritt der CI/CD Pipeline kann Continuous Deployment (CD) die erstellten Builds automatisiert an die Produktion freigeben und dadurch ausrollen.
AWS CodeCommit ist ein Versionsverwaltungsservice, um Dokumente, Source Code, Binary Files in der Cloud zu speichern. CodeCommit hostet private Git Repositories. Es unterstützt die Standardfunktionalitäten von Git. Ein Vorteil von CodeCommit ist, dass alle Repositories grundsätzlich verschlüsselt sind. Wenn eine CI/CD Pipeline in der AWS Cloud aufgebaut wird und somit auch andere AWS Services genutzt werden, kann CodeCommit dadurch leicht integriert werden.
AWS CodeBuild ermöglicht die kontinuierliche Integration in der Cloud. Er kann Quellcode kompilieren, Tests ausführen und Softwarepakete generieren. Der Nutzer muss dabei keine Entwicklungsserver verwalten, da der Service an sich vollständig verwaltet ist. Es können mehrere sogenannte Builds gleichzeitig ausgeführt werden und CodeBuild passt sich dementsprechend an. Um den Build durchzuführen, erstellt CodeBuild eigene Rechencontainer, der vorher definiert wird, welches Betriebssystem, wie lang die Laufzeit der Programmiersprache sein soll und welche Tools verwendet werden sollen.
Nachdem der Code getestet wurde, kann dieser bereitgestellt und ausgeführt werden. AWS CodeDeploy automatisiert diesen Prozess, wodurch Code einfach für eine oder tausende Instanzen bereitgestellt werden kann. Beispielsweise kann CodeDeploy mit Amazon Elastic Container Service (Amazon ECS) integriert werden, der bisher Container Image Kapitel genutzt wurde.
Nun haben wir drei wichtige Schritte der CI/CD separat besprochen. Damit CodeCommit, CodeBuild und CodeDeploy nicht manuell bedient werden müssen, können diese Anwendungen in AWS CodePipeline automatisiert werden. Dadurch lässt sich ein vollständiger Release-Prozess für die Entwicklung deines Codes modellieren, testen und für die Produktion freigeben. In jeder Phase von CodePipeline kann man eigene Tools integrieren oder manuelle Bestätigungen durch den Nutzer hinzufügen. Durch CodePipeline lassen sich Änderungen im Code leichter und standardisiert überprüfen, sodass Software-Updates schneller veröffentlicht werden können.
In den nächsten Schritten wirst du Stück für Stück deine CI/CD-Pipeline erstellen. Sie besteht wie bereits besprochen aus CodeCommit, CodeBuild und CodeDeploy.
Bei AWS Academy stehen nicht alle Dienste und Funktionen in vollem Umfang zur Verfügung. In AWS Academy kannst du nicht AWS CodePipeline und AWS CodeBuild nutzen. Deshalb haben wir Videos, die zeigen wie CI/CD in AWS konfiguriert und ausgeführt wird, aufgezeichnet. Wenn du diesen Workshop in einem AWS Account, der nicht durch AWS Academy bereitgestellt wird folgst, dann kannst du der Anleitung folgen.
todos_app
eingeben.cd ./cloud-app-builders-modules-german
aus, um in diesen Ordner zu wechseln. Dahinter steht (main), was der Branch ist des Repositories ist, in dem du dich gerade befindest.git remote add cc codecommit::us-east-1://todos_app
aus. Das Remote wird hier cc benannt, was für CodeCommit stehen soll.git push cc main
.Im nächsten Schritt kann die Pipeline erstellt werden, die den Source Code verarbeitet (Build Phase) und danach die Container Images in der Container Registry (ECR) publiziert.
Pipeline settings
TodoAppBackendService
eingeben.Source stage
main
auswählen.Build stage
TodosAppBackendService
eingeben.Ubuntu
auswählen.Standard
auswählen.aws/codebuild/standard:5.0
auswählen.Enable this flag if you want to build Docker images or want your builds to get elevated privileges
ausgewählt ist. Ein Docker Image wird dadurch gebaut.src/container-api/buildspec.yml
eingeben.TodosApp
eingeben, und bei Stream name BackendBuild
eingeben.112233445566
Deploy stage
workshop-cluster
auswählen.backend-service
auswählen.Die erste Ausführung von dem Build Prozess ist fehlgeschlagen. Das liegt daran, dass die Build Stage nicht aussreichende Berechtigungen hat. In diesem Abschnitt wirst du die fehlenden Permissions vergeben.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage"
],
"Resource": "arn:aws:ecr:us-east-1:<YOUR_AWS_ACCOUNT_ID>:repository/workshop-backend"
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
]
}
112233445566
CodeBuildECRAccess
.codebuild-TodosAppBackendService-service-role
sein. Wähle die Rolle aus.Jetzt sollte der Build Prozess funktionieren.
In diesem Schritt wird eine Änderung im CodeCommit Repository vorgenommen. Dieser wird danach automatisch über die CI/CD Pipeline veröffentlicht.
cloud-app-builders-modules-german/src/container-api/api.py
.data = Todo.query.all()
in der Methode get
der Klasse AllTodosResource
. Diese Methode gibt alle Todos die in der Datenbank gespeichert sind zurück.data = Todo.query.all()
zu data = Todo.query.order_by(Todo.title.asc())
. Dadurch wird das Ergebnis der Anfrage an die Datenbank alphabetisch absteigend nach dem Title der Todos sortiert.Jetzt können die Änderungen im CodeCommit Repository veröffentlicht werden:
git add src
git commit -m "Update Todo API v1 to order todos alphabetically"
git push cc main
In der AWS Console in den Details der CodePipeline kann der Fortschritt der Änderung überwacht werden. Nach Abschluss der Veröffentlichung wird die neue Antwort unter /todos/v1/
sichtbar werden.
Herzlichen Glückwunsch! Du hast erfolgreich eine CI/CD-Pipeline für deine ToDo-Anwendung implementiert. Durch dieses Setup ist es nun einfacher Änderungen in deinem Code schneller durchzuführen, zu testen und zu veröffentlichen. Im nächsten Kapitel geht es darum, die Infrastruktur, die du bereits für deine ToDo-App kennst, als Infrastructure-as-Code umzusetzen. Dadurch lässt sich die Anwendung leichter replizieren und verändern.