Software Product Mastering / Inhaltsverzeichnis / Produkt & Projekt / Methoden / Deliberating structures / Werkzeuge & Automatisierung
SCM - Software configuration management¶
Was ist SCM (Software Configuration Management)?¶
SCM, oder Software Configuration Management, bezeichnet die systematische Kontrolle und Verwaltung von Änderungen an Softwareprojekten. SCM hilft, die Integrität eines Projekts sicherzustellen, indem es Änderungen nachvollziehbar macht, Versionen verwaltet und die Zusammenarbeit in Teams ermöglicht.
In der Praxis wird SCM oft durch Versionskontrollsysteme (VCS, Version Control Systems) wie Git umgesetzt. Diese Systeme erlauben es, den Quellcode eines Projekts zu verwalten, Änderungen zu verfolgen und bei Bedarf frühere Versionen wiederherzustellen.
Schlüsselkomponenten von SCM¶
Versionierung
- Verfolgung jeder Änderung am Code.
- Speicherung von Änderungen in verschiedenen Versionen (z. B. in Commits).
- Beispiel: Git verfolgt jede Änderung in einem Repository und speichert diese als Commit.
Branching und Merging
- Branching: Ermöglicht parallele Entwicklungsstränge, z. B. für neue Features oder Bugfixes.
- Merging: Zusammenführen von Branches in den Hauptentwicklungsstrang (z. B.
main
odermaster
). - Tools wie GitLab oder GitHub visualisieren und erleichtern diese Prozesse.
Verteiltes Arbeiten
- Systeme wie Git erlauben es, dass Entwickler lokal arbeiten und später Änderungen mit dem zentralen Repository synchronisieren.
- Konfliktmanagement hilft, wenn mehrere Entwickler denselben Code ändern.
Zusammenarbeit und Code-Review
- Plattformen wie GitHub und GitLab ermöglichen Code-Reviews durch Pull- oder Merge-Requests.
- Teams können Kommentare hinterlassen, Verbesserungen vorschlagen und Änderungen gemeinsam diskutieren.
Praktische Umsetzung von SCM mit Git und Tools¶
Git¶
- Git ist ein verteiltes Versionskontrollsystem, das Änderungen am Code in einem Repository speichert.
- Grundlegende Befehle:
git init
: Erstellt ein neues Repository.git add
: Fügt Änderungen zur Staging-Area hinzu.git commit
: Speichert Änderungen dauerhaft mit einer Nachricht.git push
: Überträgt Änderungen zu einem Remote-Repository.git pull
: Holt und integriert Änderungen aus einem Remote-Repository.git branch
: Erstellt und verwaltet Branches.git merge
: Führt Branches zusammen.
Git Cheatsheet
GitLab¶
- Eine Plattform zur Verwaltung von Git-Repositories mit Funktionen wie:
- CI/CD: Automatisiertes Testen, Bauen und Deployen.
- Merge-Requests: Für Code-Reviews und das Mergen von Branches.
- Issue-Tracking: Zum Verwalten von Aufgaben und Bugs.
GitHub¶
- Ähnlich wie GitLab, bietet aber eine große Community für Open-Source-Projekte.
- Besitzt ebenfalls Funktionen für CI/CD, Code-Review und Projektmanagement.
Sourcetree¶
- Ein grafisches Tool zur Verwaltung von Git-Repositories.
- Erleichtert die Nutzung von Git-Befehlen für Benutzer, die die Kommandozeile nicht bevorzugen.
Vorteile von SCM¶
Nachvollziehbarkeit
Jede Änderung am Code ist dokumentiert. Man kann sehen, wer was wann geändert hat.Kollaboration
Teams können parallel arbeiten, Konflikte vermeiden und Feedback erhalten.Code-Qualität
Code-Reviews fördern sauberen, wartbaren und fehlerfreien Code.Risikominimierung
Änderungen können bei Fehlern schnell zurückgesetzt werden.
Beispiel für eine Git-Workflow¶
Clone ein Repository:
git clone <repository-url>
Erstelle einen neuen Branch:
git checkout -b feature-neues-feature
Füge Änderungen hinzu und commite:
git add . git commit -m "Implementiere neues Feature"
Pushe den Branch und öffne einen Merge-Request (GitLab/GitHub):
git push origin feature-neues-feature
Führe einen Code-Review durch, löse Feedback auf und merge den Branch:
Nach Abschluss wird der Branch inmain
gemerged und ggf. gelöscht.
Fazit¶
SCM mit Tools wie Git, GitLab, GitHub oder Sourcetree ist unverzichtbar für moderne Softwareentwicklung. Es unterstützt Teams bei der Zusammenarbeit, fördert die Qualität und sorgt für die Nachverfolgbarkeit von Änderungen.
Weitere Tipps¶
Zusätzlich zu den bereits beschriebenen Aspekten gibt es weitere wichtige Punkte und fortgeschrittene Themen, die beim Software Configuration Management (SCM) beachtet werden sollten:
Weitere wichtige Aspekte von SCM¶
1. Sicherheit¶
- Zugriffssteuerung: Plattformen wie GitHub und GitLab ermöglichen es, Rollen und Berechtigungen zu definieren (z. B. Lese- oder Schreibrechte).
- Secrets Management: Um Umgebungsvariablen und API-Schlüssel zu schützen, sollten keine sensiblen Daten im Code gespeichert werden. Stattdessen Tools wie HashiCorp Vault oder GitLab Secrets verwenden.
2. Continuous Integration/Continuous Deployment (CI/CD)¶
- SCM ist oft eng mit CI/CD-Pipelines verbunden. Änderungen im Code können automatisch:
- Getestet (Unit- und Integrationstests).
- Gebaut (Build).
- Bereitgestellt (Deployment).
- Beispiele:
- GitHub Actions: Für das Erstellen von Workflows wie automatische Tests bei jedem Pull-Request.
- GitLab CI/CD: Automatisiertes Deployment bei Merges in den Hauptbranch.
3. Konfigurationsmanagement¶
- Neben Code-Versionierung kann SCM auch für Konfigurationsdateien verwendet werden, z. B.:
- Dockerfiles
- Kubernetes-Manifeste
- Terraform-Dateien (Infrastructure as Code).
4. GitOps¶
- Eine Weiterentwicklung von SCM für DevOps-Prozesse.
- Deklarative Konfigurationen für Infrastruktur (z. B. Kubernetes) werden in Git gespeichert und automatisch auf die Infrastruktur angewendet.
5. Tags und Releases¶
- Tags: Spezielle Markierungen im Git-Verlauf, z. B. für stabile Versionen (
v1.0.0
). - Releases: Kombinieren Tags mit zusätzlichen Informationen (z. B. Release Notes).
Best Practices für SCM¶
1. Schreibweise von Commit-Nachrichten¶
- Klare und beschreibende Nachrichten fördern die Nachvollziehbarkeit.
- Gut:
Fix NullPointerException in UserController
- Schlecht:
Bug fix
- Gut:
2. Branching-Strategien¶
- Klare Strategien, um Branches zu organisieren:
- Git Flow: Getrennte Branches für Entwicklung (
develop
), Produktion (main
) und Features (feature/*
). - GitHub Flow: Einfacher Ansatz mit einem
main
-Branch und kurzen Feature-Branches. - Trunk-based Development: Entwicklung direkt auf dem Hauptbranch, oft bei CI/CD genutzt.
- Git Flow: Getrennte Branches für Entwicklung (
3. Code-Review¶
- Code-Reviews sind unverzichtbar, um Qualität und Sicherheitsstandards zu gewährleisten.
- Tools wie GitLab ermöglichen es, spezifische Reviewer automatisch zuzuweisen.
4. Automatisierung¶
- Automatische Tests und Linter können bereits im Merge-Request geprüft werden.
- Vermeidet fehlerhaften Code im Hauptbranch.
Fortgeschrittene Themen in SCM¶
1. Monorepos vs. Multirepos¶
- Monorepo: Ein einziges Repository für alle Projekte eines Unternehmens.
- Vorteile: Einfache Änderungen über mehrere Projekte hinweg.
- Nachteile: Komplexität bei großen Projekten.
- Multirepo: Jedes Projekt hat ein eigenes Repository.
- Vorteile: Klare Trennung von Verantwortlichkeiten.
- Nachteile: Komplexere Abhängigkeiten.
2. Konfliktmanagement¶
- Konflikte treten auf, wenn zwei Entwickler denselben Codebereich ändern.
- Lösung: Rebase oder Merge verwenden.
- Rebase sorgt für eine saubere Historie, während Merge alle Konflikte als neuen Commit speichert.
3. Migrationen¶
- Beim Wechsel eines SCM-Tools (z. B. SVN zu Git) sollte darauf geachtet werden, die Historie korrekt zu übertragen.
- Tools wie
git-svn
odersvn2git
können dabei helfen.
4. Large File Storage (LFS)¶
- Git ist nicht optimal für große Dateien.
- Git LFS: Speichert große Dateien (z. B. Bilder, Videos) außerhalb des Repositories, nur Verweise bleiben im Git-Verlauf.
5. Audit Logs und Compliance¶
- In vielen Branchen ist es wichtig, nachvollziehen zu können, wer wann was geändert hat.
- GitLab und GitHub bieten Audit-Logs für Sicherheits- und Compliance-Anforderungen.
Herausforderungen und Lösungen in SCM¶
1. Skalierung bei großen Teams¶
- Mit zunehmender Teamgröße können Konflikte und unübersichtliche Branch-Strukturen zunehmen.
- Lösung: Strikte Branching-Strategien und regelmäßiges Mergen in den Hauptbranch.
2. Tool-Komplexität¶
- Viele Teams fühlen sich durch die Vielzahl an Tools (Git, CI/CD, Linter, IDE-Plugins) überfordert.
- Lösung: Einheitliche Toolchains und klare Schulungen.
3. Konflikte durch parallele Entwicklungen¶
- Lösung: Häufiges Pullen/Mergen und kleine, überschaubare Pull-Requests.
Fazit¶
SCM ist ein zentraler Bestandteil moderner Softwareentwicklung. Es umfasst nicht nur die Verwaltung von Quellcode, sondern integriert auch Automatisierung, Sicherheit und Zusammenarbeit. Durch den Einsatz bewährter Tools und Strategien lassen sich Skalierungsprobleme und Qualitätssicherungsanforderungen effektiv bewältigen.
Kleines Quiz zu CI/CD¶
Hier ist ein Python-Programm für ein Quiz, das spielerisch Wissen über SCM, Git und verwandte Themen testet:
import random
def ask_question(question, options, correct_option):
print("\n" + question)
for idx, option in enumerate(options, start=1):
print(f"{idx}. {option}")
while True:
try:
answer = int(input("Deine Antwort (1-4): "))
if 1 <= answer <= len(options):
return answer == correct_option
else:
print("Bitte wähle eine gültige Option (1-4).")
except ValueError:
print("Bitte gib eine Zahl ein.")
def main():
print("Willkommen zum SCM-Quiz! Teste dein Wissen über Git, GitHub und GitLab.")
questions = [
{
"question": "Wofür steht SCM?",
"options": [
"Software Configuration Management",
"Source Control Management",
"Systematic Code Maintenance",
"Standard Code Management"
],
"correct_option": 1
},
{
"question": "Welcher Befehl erstellt ein neues Git-Repository?",
"options": [
"git clone",
"git init",
"git commit",
"git branch"
],
"correct_option": 2
},
{
"question": "Was ist ein Feature-Branch?",
"options": [
"Ein separater Branch, um ein neues Feature zu entwickeln",
"Ein Branch, der immer in den Hauptbranch gemerged wird",
"Ein Branch, der nur für Bugfixes verwendet wird",
"Ein Backup des Hauptbranches"
],
"correct_option": 1
},
{
"question": "Welcher Befehl wird verwendet, um Änderungen in ein Remote-Repository zu senden?",
"options": [
"git pull",
"git push",
"git commit",
"git add"
],
"correct_option": 2
},
{
"question": "Was ist ein Merge-Konflikt?",
"options": [
"Ein Fehler, wenn ein Repository nicht gefunden wird",
"Ein Konflikt, wenn zwei Branches gleichzeitig gelöscht werden",
"Ein Problem, wenn zwei Änderungen denselben Codebereich betreffen",
"Ein Problem, wenn ein Commit fehlschlägt"
],
"correct_option": 3
}
]
random.shuffle(questions)
score = 0
for idx, q in enumerate(questions, start=1):
print(f"\nFrage {idx}/{len(questions)}:")
if ask_question(q["question"], q["options"], q["correct_option"]):
print("Richtig! 🎉")
score += 1
else:
print("Falsch. 😢")
print(f"\nQuiz beendet! Dein Punktestand: {score}/{len(questions)}")
if score == len(questions):
print("Ausgezeichnet! Du bist ein SCM-Profi! 🏆")
elif score >= len(questions) // 2:
print("Gut gemacht! Du kennst dich schon recht gut aus. 👍")
else:
print("Es gibt noch etwas zu lernen. Versuche es noch einmal! 💡")
if __name__ == "__main__":
main()
Willkommen zum SCM-Quiz! Teste dein Wissen über Git, GitHub und GitLab. Frage 1/5: Was ist ein Merge-Konflikt? 1. Ein Fehler, wenn ein Repository nicht gefunden wird 2. Ein Konflikt, wenn zwei Branches gleichzeitig gelöscht werden 3. Ein Problem, wenn zwei Änderungen denselben Codebereich betreffen 4. Ein Problem, wenn ein Commit fehlschlägt Richtig! 🎉 Frage 2/5: Wofür steht SCM? 1. Software Configuration Management 2. Source Control Management 3. Systematic Code Maintenance 4. Standard Code Management Richtig! 🎉 Frage 3/5: Was ist ein Feature-Branch? 1. Ein separater Branch, um ein neues Feature zu entwickeln 2. Ein Branch, der immer in den Hauptbranch gemerged wird 3. Ein Branch, der nur für Bugfixes verwendet wird 4. Ein Backup des Hauptbranches Richtig! 🎉 Frage 4/5: Welcher Befehl erstellt ein neues Git-Repository? 1. git clone 2. git init 3. git commit 4. git branch Richtig! 🎉 Frage 5/5: Welcher Befehl wird verwendet, um Änderungen in ein Remote-Repository zu senden? 1. git pull 2. git push 3. git commit 4. git add Richtig! 🎉 Quiz beendet! Dein Punktestand: 5/5 Ausgezeichnet! Du bist ein SCM-Profi! 🏆