# Continuous Development ## Configuration Management ### Version Control System (VCS) - Erlauben mehrere Versionen von Dateien - Falls etwas bearbeitet wurde, sieht man, wie es vorher aussah - Erlaubt dem Team zusammenzuarbeiten - auch wenn verteilt #### Good Practices VC - Absolut alles im VCS speichern - Tests, Datenbankscripte, Buildscripte, Dokumentationen, etc. - Alle Informationen, die benötigt werden, um irgendwelche Test- / Produktionsumgebungen wiederherzustellen ### VC - Release Versioning - Jeder Release sollte eine eigene Nummer haben #### Versionsschema - SemVer (Semantic Versioning) - **MAJOR**._Minor_.patch - Major - Bahnbrechende Änderungen (Hohes Risiko) - inkompatible API Änderungen - Entfernen von Features - Änderungen am Datenbankschema, die Daten entfernen - Minor Version - Features (Mittleres Risiko) - neues Feature - UI ändern - DB-Schema erweitern (keine Daten entfernen) - patch version - Alle anderen Änderungen (kaum Risiko) - kleinere Bug-Fixes - Zusätzliche Labels - alpha - beta - bspw: - _1.0.0-alpha.1_ - ![image_843.png](image_843.png) - ![image_844.png](image_844.png) ### VC - Meaningful Commits ```Git [optional scope]: [optional body] [optional footer(a)] ``` #### Commit Types - chore - bspw. Abhängigkeiten updaten - refactor - docs - style - Formatieren, fehlende Semikolons, ... - test - perf - Performance Verbesserungen - ci - CI/CD related - build - Änderungen, die das Build-System oder externe Abhängigkeiten betreffen - revert - Rückgängig machen ### VC - Branching - Vermeide lange Branches - Überprüfe regelmäßig die Main-Line #### VC - Branching GitFlow - ![image_845.png](image_845.png) - Development Branch (develop) - master/main für produktionsfertigen Code - develop für letzte Development Änderungen - Feature Branch (feature/*) - für neue Features - existiert nur so lange, wie das Feature entwickelt wird - Hotfix Branch (hotfix/*) - Wie ein Release-Branch, aber für unerwartete, kurzfristige Releases **Probleme:** - Hotfix / Release Branch - macht die Sache deutlich (teilweise unnötig) komplizierter - Devs machen häufig Fehler - direkt auf main mergen, ... ### Dependency Management - Komponenten / Module von anderen Teams innerhalb der Organisation - 3rd Party Bibliotheken #### Managing Components - größere Projekte sollten in mehrere Komponenten zerlegt werden - ggf. auch separate Pipelines zum builden #### Managing External Libraries - kommen meist in binärer Form - am besten lokale Kopien in Versionen, welche funktionieren - latest könnte bugs haben / die Anwendung kaputt machen - trotzdem regelmäßig updaten! ### Software Configurations - sollten gemanaged und getestet werden - erlauben der Software mehr Flexibilität - Wann? - Während des buildens / packaging - schlecht, dann ist das image nicht universell einsetzbar - Deployment / Startup / Run Time - egal wann – sie sollten immer über den gleichen Mechanismus geschehen - bspw. Passwörter sollten nicht gehardcoded werden ### Environment Management - Jede Software benötigt Hardware/Software/Infrastruktur/externe Systeme - = Environment - Sollte automatisiert laufen - sollte einfacher sein einfach den kaputten wegzuwerfen und neu zu erstellen, als zu reparieren ## CI/CD ![image_859.png](image_859.png) - Continuous Integration - kein Dev will immer die gesamte Anwendung testen / laufen lassen - CI übernimmt - automatisierte Tests - Bugs werden früher gefunden - Continuous Delivery - Erweiterung von CI um Release in Staging - Continuous Deployment - automatisches Deployment in Produktionsumgebung ### CI/CD Good Practices - Wenn ein Fehler auftritt, ist es höchste Prio diesen zu fixen - Vorher keine weiteren Änderungen pushen - nicht nach Hause gehen, wenns nicht mehr geht - entweder fixen oder rückgängig machen - wer Änderungen macht ist auch verantwortlich - Tests vorher lokal laufen lassen - wenn welche fehlschlagen → nicht auskommentieren - Pipeline nach dem pushen beobachten - Pipeline stoppen lassen bei Fehlern - fehlschlagende Tests - langsame Tests - hässlicher Codestyle ## Deployment Pipeline ![image_860.png](image_860.png) - binarys so selten wie möglich erstellen - dauert lange - falls eine doppelt verwendet werden kann → doppelt nutzen - bspw. Staging/Production - Smoke-Testing vom Environment - primitiv checken, ob Anwendung läuft und bspw. Startseite gewünschte Daten zeigt - Staging-Umgebung nutzen für Acceptance Stage - Alle Änderungen sollten durch die Pipeline gehen - Falls irgendwas fehlschlägt → Pipeline stoppen ### Stages #### Commit Stage ![image_861.png](image_861.png) - Bestandteile: - Code kompilieren - Tests laufen lassen (Unit, Integration) - Binaries erstellen - statische Codeanalyse - Falls Commit Stage funktioniert → Release Kandidaten erstellen #### Acceptance Stage ![image_862.png](image_862.png) - Bestandteile - Service Testing - Laufen in produktionsähnlicher Umgebung