Das Baseline-Gate lässt CodeCharter einen Build nur an neuen Findings scheitern, während ein bekannter Satz bestehender Findings geduldet wird. Das ist der ideale Weg, CodeCharter in einer bestehenden Codebasis einzuführen: die heutigen Findings als Baseline akzeptieren und neue zuverlässig draußen halten.
Unterschied zum Diff-Modus
- Diff-Modus (
--diff/--git-ref) beschränkt auf die geänderten Zeilen („neu in diesem PR, zeilenbasiert"). - Baseline-Modus (
--baseline) beschränkt auf Findings, die nicht in einem akzeptierten Snapshot stehen („neu gegenüber der Baseline, identitätsbasiert"). Erfasst auch ein neues Finding auf einer Zeile, die der PR nicht angefasst hat.
Beides kombiniert: mit beiden gesetzt muss ein Finding auf einer geänderten Zeile liegen und nicht in der Baseline stehen, um gemeldet zu werden.
Fingerprints
Jedes Finding erhält einen stabilen Fingerprint aus seiner Identität (Regel,
Entitätsart, Entitätsname, Kategorie), seinem Dateipfad (repo-relativ, wenn
--workspace-root gesetzt ist) und einem Vorkommenszähler, der mehrere
gleichartige Findings in derselben Datei unterscheidbar hält.
Er ist zeilenunabhängig und übersteht damit Zeilenverschiebungen und
Reformatierungen. Eine Datei verschieben oder die Entität umbenennen ändert den
Fingerprint, sodass das Finding als neu erscheint. Baseline neu generieren, um es
wieder zu akzeptieren. Der Fingerprint steht auch in der JSON-Ausgabe und als
SARIF partialFingerprints.
Ablauf
# 1. Aktuelle Findings als Baseline akzeptieren und einchecken.
codecharter analyze MySolution.sln --write-baseline .codecharter/baseline.json
git add .codecharter/baseline.json && git commit -m "chore: codecharter baseline"
# 2. In der CI nur an neuen Findings gaten.
codecharter analyze MySolution.sln --baseline .codecharter/baseline.json --fail-on error
- Die Baseline mit den gleichen Optionen erzeugen, mit denen Sie gaten (Regeln,
--severity), damit der aufgezeichnete Satz zum später ausgewerteten passt. - Beim Erzeugen und Gaten
--workspace-root <Repo-Root>übergeben (oder aus dem Repo-Root heraus laufen), damit Fingerprints repo-relative Pfade nutzen und die Baseline maschinen- und CI-übergreifend portabel ist. Die GitHub Action setzt das automatisch. - Die Baseline-Datei ist deterministisch (sortiert, ohne Timestamps) und erzeugt saubere Diffs in der Versionsverwaltung.
- Um neu eingeführte Findings zu akzeptieren (oder behobene zu entfernen), die
Datei mit
--write-baselineneu generieren und einchecken.
Verhalten
- Eine fehlende
--baseline-Datei analysiert alles und gibt eine Warnung aus; sie lässt nicht still durch. (Nützlich, bevor die erste Baseline eingecheckt ist.) - Eine kaputte Datei oder eine nicht unterstützte Schemaversion ist ein harter
Fehler (Exit
2). --write-baselineschreibt nur und endet mit0; es meldet keine Findings und löst kein--fail-onaus.--write-baselinezeichnet immer das vollständige (nach Severity gefilterte) Analyseergebnis auf: in Kombination mit--diff/--git-refwird die geschriebene Baseline nicht auf den Diff beschränkt.