Skip to content

Lokal andere Findings als in CI

Wenn das CI rot ist und Sie lokal nichts sehen oder umgekehrt.

CodeCharter ist deterministisch. Wenn lokal und CI unterschiedliche Findings zeigen, gibt es eine konkrete Ursache. Hier die häufigsten.

1. Unterschiedliche CodeCharter-Versionen

Häufigster Fall. Im CI läuft eine andere Version als lokal.

Check:

codecharter --version

Lokal und im CI vergleichen.

Fix: beide auf dieselbe Version bringen. Empfehlung: in CI pinnen (siehe Versionierung) und lokal dieselbe Version installieren.

2. Unterschiedliche Regel-Konfiguration

Das CI sieht eine andere rules/-Version als lokal, weil Sie in einem Branch arbeiten, der die Änderung noch nicht hat.

Check: git status lokal ausführen und prüfen, welcher Commit im CI ausgecheckt wurde.

Fix: sicherstellen, dass rules/ und .codecharter/config.yml committet sind und beide Seiten denselben Commit sehen.

Beachten Sie außerdem, wie Regeln ohne --rules-Flag aufgelöst werden: die CLI sucht zuerst ein rules/-Verzeichnis im aktuellen Arbeitsverzeichnis und fällt, wenn es keines gibt, auf die Beispielregeln zurück, die neben dem Binary ausgeliefert werden. Die GitHub Action verhält sich genauso: ohne eigenes Regel-Verzeichnis nutzt sie die in ihr Image eingebackenen Beispielregeln. "Keine Flags" kann also lokal und im CI unterschiedliche Regelsätze bedeuten. Im Zweifel auf beiden Seiten --rules explizit angeben.

3. Solution-State

CodeCharter nutzt MSBuild, um die Solution zu laden. Analysiert werden die Dateien auf der Festplatte: wenn das CI auf einem sauberen Checkout mit allen NuGet-Packages restored arbeitet, lokal aber nicht committete Änderungen vorliegen oder Packages nicht restored sind, weicht das Modell ab.

Check:

dotnet restore
dotnet build

Fix: lokal ein sauberes dotnet restore && dotnet build vor dem codecharter analyze laufen lassen.

4. Unterschiedliche --fail-on-Schwellen

Ohne --fail-on beendet sich codecharter analyze mit Exit-Code 1, sobald es irgendein Finding gibt, unabhängig von der Severity. Mit --fail-on error lassen nur Findings der Stufe error den Lauf fehlschlagen. Der Default ohne Flag ist also die strengere Schwelle: läuft das CI mit --fail-on error und Sie lokal ohne Flags, macht schon eine Warnung Ihren lokalen Lauf rot, während das CI grün bleibt.

Check: in Ihrer CI-Konfiguration nachsehen, welche Flags gesetzt sind.

Fix: lokal mit denselben Flags laufen lassen:

codecharter analyze MySolution.sln --fail-on error

5. Unterschiedliche --severity-Schwellen

--severity steuert die minimale Severity, die im Report erscheint (Default: info). Läuft eine Seite mit einer höheren Schwelle, etwa --severity warn, verschwinden info-Findings aus ihrer Ausgabe und die beiden Findings-Listen sehen unterschiedlich aus.

Fix: auf beiden Seiten denselben --severity-Wert verwenden.

6. Diff-Scoping

Mit --diff oder --git-ref meldet CodeCharter nur Findings auf geänderten Zeilen, und auch das --fail-on-Gate gilt nur für diese Findings. Der Action-Input diff: true der GitHub Action aktiviert dasselbe Verhalten auf Pull Requests. Das CI kann dann völlig korrekt weniger Findings zeigen als ein voller lokaler Lauf.

Check: ob das CI --diff, --git-ref oder den Action-Input diff: true verwendet.

Fix: den CI-Scope lokal nachstellen, zum Beispiel:

codecharter analyze MySolution.sln --git-ref main..HEAD

7. Baselines

Übergibt das CI eine --baseline-Datei, werden alle darin erfassten Findings unterdrückt; Ausgabe und --fail-on gelten nur noch für neue Findings. Ein lokaler Lauf ohne die Baseline zeigt alles.

Fix: lokal mit derselben Baseline-Datei laufen lassen oder --baseline auf beiden Seiten weglassen, um die vollen Ergebnisse zu vergleichen.

8. Plattform-Unterschiede

CodeCharter ist plattform-deterministisch. Gleiche Findings auf Windows und Linux. Wenn Sie trotzdem Unterschiede sehen, ist das ein Bug. Schreiben Sie uns mit einer minimalen Repro.

Debug-Workflow

Prüfen Sie zuerst den Exit-Code, nicht nur die Findings-Liste. Exit-Code 1 bedeutet, dass Findings die Schwelle gerissen haben. Andere Codes ungleich null bedeuten, dass der Lauf selbst nicht normal durchgelaufen ist: 2 (fehlende codecharter.lock.json bei konfigurierten Portal-Profilen), 3 (Solution konnte nicht geladen werden oder das Portal war beim Restore nicht erreichbar), 4 (Lockfile-Drift), 6 (Lizenzfehler). Ein rotes CI ohne Findings deutet meist auf einen dieser Codes hin.

Wenn nichts hilft, lassen Sie beide Seiten mit --verbose laufen und diffen die Logs:

codecharter analyze MySolution.sln --verbose 2> debug-local.log
# CI: dasselbe, Log als Artifact ablegen
diff debug-local.log debug-ci.log | less

Im --verbose-Modus gibt CodeCharter auf stderr aus:

  • Welcher Pfad analysiert wird
  • Welches Regel-Verzeichnis verwendet wird und wie viele Regeln daraus geladen wurden
  • Wie viele Typen und Methoden die Analyse gefunden hat

Das Verbose-Log umfasst nur wenige Zeilen. Der Diff zeigt daher sofort, ob beide Seiten dasselbe Regel-Verzeichnis nutzen, gleich viele Regeln laden und dieselbe Modellgröße sehen.

Wenn Sie es nicht finden

Schreiben Sie uns an [email protected] mit Ihrer CLI-Version, den --verbose-Logs beider Seiten und dem Diff der Findings-Listen.