Semantic Versioning (SemVer) in einem Symfony-Projekt

Um Semantic Versioning (SemVer) in einem Symfony-Projekt mit Git zu automatisieren, kannst du eine Kombination aus Git-Hooks und einem Skript verwenden, das die Versionsnummern in einer Datei verwaltet und automatisch aktualisiert. Hier ist eine Schritt-für-Schritt-Anleitung, wie du dies einrichten kannst:

1. Skript zum Inkrementieren der Versionsnummer

Erstelle ein PHP-Skript, das die Versionsnummer basierend auf dem Typ der Änderung (PATCH, MINOR, MAJOR) automatisch erhöht. Nenne das Skript z.B. update_version.php.

<?php

function incrementVersion(string $version, string $type = 'patch'): string
{
    $parts = explode('.', $version);

    switch ($type) {
        case 'major':
            $parts[0]++;
            $parts[1] = 0;
            $parts[2] = 0;
            break;
        case 'minor':
            $parts[1]++;
            $parts[2] = 0;
            break;
        case 'patch':
        default:
            $parts[2]++;
            break;
    }

    return implode('.', $parts);
}

$versionFilePath = __DIR__ . '/version.txt';
$defaultVersion = '0.1.0';

// Check if the file exists
if (!file_exists($versionFilePath)) {
    // Create the file and write the default version
    file_put_contents($versionFilePath, $defaultVersion);
    print "version.txt created with version $defaultVersion\n";
} else {
    $currentVersion = trim(file_get_contents($versionFilePath));

    // Get the argument to determine the type of increment (patch, minor, major)
    $type = $argv[1] ?? 'patch';

    $newVersion = incrementVersion($currentVersion, $type);

    file_put_contents($versionFilePath, $newVersion);

    print "Version updated to $newVersion\n";
}

2. Git Hook einrichten

Ein Git Hook ist ein Skript, das bei bestimmten Git-Ereignissen ausgeführt wird. Für die automatische Versionsaktualisierung nutzen wir den pre-commit-Hook.

  • Erstelle eine Datei .git/hooks/pre-commit (falls sie nicht existiert) und mache sie ausführbar:
touch .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
  • Füge folgendes in die Datei .git/hooks/pre-commit ein:
#!/bin/sh

# Typ der Änderung über Argumente bestimmen oder default auf "patch"
VERSION_TYPE=${1:-patch}

# Versionsnummer erhöhen
php update_version.php $VERSION_TYPE

# version.txt zum Commit hinzufügen
git add version.txt

Dieser Hook führt das update_version.php-Skript aus und erhöht die Versionsnummer basierend auf dem übergebenen Argument (patch, minor, major). Danach wird die aktualisierte version.txt automatisch zum Commit hinzugefügt.

3. Verwendung

Bei jedem Commit wird die Versionsnummer automatisch aktualisiert. Standardmäßig wird die PATCH-Version erhöht. Du kannst den Typ der Versionserhöhung beim Commit angeben:

  • Für einen Patch (Standard):
git commit -m "Bugfix: ... "
  • Für ein Minor-Update:
git commit -m "New feature: ..." && git commit --amend -m "New feature: ..." && git hook run pre-commit minor
  • Für ein Major-Update:
git commit -m "Breaking change: ..." && git commit --amend -m "Breaking change: ..." && git hook run pre-commit major

4. Optional: Automatisierung der Commit-Nachricht

Um den Typ der Änderung besser im Workflow zu integrieren, kannst du ein weiteres Skript oder eine Konvention einführen, um den Typ der Änderung aus der Commit-Nachricht abzuleiten, und entsprechend die Versionsnummer zu erhöhen.

5. CI/CD Integration

Wenn du ein CI/CD-Tool verwendest (z.B. GitLab CI, GitHub Actions), kannst du diese Versionierungsschritte auch dort automatisieren, indem du das update_version.php-Skript in deine Pipeline integrierst.

Mit diesen Schritten hast du eine einfache, automatisierte Lösung, die SemVer in deinem Symfony-Projekt mithilfe von Git-Hooks implementiert. Die Versionsnummer wird bei jedem Commit basierend auf den vorgenommenen Änderungen aktualisiert und in der version.txt gespeichert.