diff --git a/.github/workflows/pr-guard.yml b/.github/workflows/pr-guard.yml new file mode 100644 index 00000000..9f3f3876 --- /dev/null +++ b/.github/workflows/pr-guard.yml @@ -0,0 +1,16 @@ +name: PR Guard + +on: + pull_request: + branches: [ "**" ] + +jobs: + no-hardcoded-versions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run hardcoded versions check + shell: bash + run: | + chmod +x config/quality/check-no-hardcoded-versions.sh + config/quality/check-no-hardcoded-versions.sh diff --git a/config/quality/check-no-hardcoded-versions.sh b/config/quality/check-no-hardcoded-versions.sh new file mode 100644 index 00000000..ee98c98a --- /dev/null +++ b/config/quality/check-no-hardcoded-versions.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Guard: prevent hardcodierte Versionsangaben in Modul-Builddateien +# Erlaubt sind ausschließlich: +# - Zentrale Verwaltung in gradle/libs.versions.toml +# - Referenzen über libs.* Aliases oder ${libs.versions.*.get()} im :platform BOM +# - Ausnahmen müssen dokumentiert sein und mit // ALLOW_VERSION_JUSTIFIED kommentiert werden + +ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)" + +echo "[PR-GUARD] Prüfe auf hartcodierte Versionen in build.gradle(.kts) Dateien..." + +# 1) Finde Abhängigkeits-Notation mit expliziter Versionsnummer z.B. "group:artifact:1.2.3" +# Erlaube explizit Einträge, die mit einem Kommentar ALLOW_VERSION_JUSTIFIED versehen sind +VIOLATIONS_A=$(grep -RIn \ + --include='build.gradle' --include='build.gradle.kts' \ + -E '"[^"\$]+:[0-9]+\.[0-9]+' \ + --exclude-dir='.git' \ + --exclude-dir='build' \ + --exclude-dir='.gradle' \ + --exclude='**/platform-bom/build.gradle.kts' \ + --exclude='**/platform-dependencies/build.gradle.kts' \ + "$ROOT_DIR" | grep -v 'ALLOW_VERSION_JUSTIFIED' || true) + +# 2) Finde version = "1.2.3" in Gradle-Dateien (selten genutzt, aber absichern) +VIOLATIONS_B=$(grep -RIn \ + --include='build.gradle' --include='build.gradle.kts' \ + -E 'version\s*=\s*"[0-9]+\.[0-9]+' \ + --exclude-dir='.git' \ + --exclude-dir='build' \ + --exclude-dir='.gradle' \ + "$ROOT_DIR" | grep -v 'ALLOW_VERSION_JUSTIFIED' || true) + +# 3) Ausnahmen: zentrale Dateien sind erlaubt +# - gradle/libs.versions.toml (nicht in include) +# - :platform BOM darf ${libs.versions.*.get()} verwenden (kein Match) + +if [[ -n "$VIOLATIONS_A" || -n "$VIOLATIONS_B" ]]; then + echo "[PR-GUARD] Verletzungen gefunden (hartcodierte Versionen):" + [[ -n "$VIOLATIONS_A" ]] && echo "$VIOLATIONS_A" + [[ -n "$VIOLATIONS_B" ]] && echo "$VIOLATIONS_B" + echo "\n[HINWEIS] Bitte Versionen in gradle/libs.versions.toml pflegen und über libs.* / Platform-BOM referenzieren." + echo "[AUSNAHME] Falls zwingend erforderlich, kommentiere die betroffene Zeile mit // ALLOW_VERSION_JUSTIFIED und dokumentiere die Ausnahme in docs/01_Architecture/README.md." + exit 1 +fi + +echo "[PR-GUARD] OK – keine hartcodierten Versionen gefunden."