Skip to content

Bitbucket Pipelines

CodeCharter in Bitbucket Pipelines integrieren.

Bitbucket Pipelines führt CodeCharter als normalen Shell-Step im Docker-basierten Runner aus. Das Setup unten lädt die CLI herunter, analysiert die Solution und speichert den SARIF-Report als Pipeline-Artifact.

Liegt Ihr Repository auf GitHub und läuft nur der Build in Bitbucket Pipelines, können Sie aus dieser Pipeline zusätzlich einen gebrandeten CodeCharter-Check-Run und PR-Kommentar veröffentlichen, siehe Checks aus beliebigem CI veröffentlichen.

bitbucket-pipelines.yml:

image: mcr.microsoft.com/dotnet/sdk:9.0

pipelines:
  default:
    - step:
        name: CodeCharter
        caches:
          - codecharter
        script:
          - curl -sSL -H "Authorization: Bearer $CODECHARTER_API_KEY" \
              -o codecharter.tar.gz \
              https://codecharter.tools/api/v1/cli/linux-x64/1.0.12
          - mkdir -p /opt/codecharter && tar -xzf codecharter.tar.gz -C /opt/codecharter
          - chmod +x /opt/codecharter/codecharter
          - export PATH="/opt/codecharter:$PATH"
          - codecharter analyze MySolution.sln --fail-on error --output sarif:codecharter.sarif
        artifacts:
          - codecharter.sarif

definitions:
  caches:
    codecharter: .codecharter/cache

Ersetzen Sie MySolution.sln durch den Pfad zu Ihrer Solution- oder Projektdatei: analyze erwartet eine .sln-, .slnx- oder .csproj-Datei, kein Verzeichnis.

API-Key

In Bitbucket: Repository settings → Repository variables, Variable CODECHARTER_API_KEY anlegen, "Secured" aktivieren.

Die Variable erfüllt zwei Aufgaben: Der curl-Step lädt damit die CLI herunter, und der analyze-Step holt damit automatisch eine kurzlebige Lizenz, wenn keine im Cache liegt. Bitbucket stellt Repository-Variablen in jedem Step als Umgebungsvariablen bereit, weitere Konfiguration ist nicht nötig.

PR-Annotations via Bitbucket Reports API

Optional können Sie die Findings als Bitbucket Code Insights posten. CodeCharter hat dafür keinen direkten Konverter, aber das JSON-Format ist gut handzuhaben:

- codecharter analyze MySolution.sln --output json --output-file findings.json
- # Wandle findings.json in Code-Insights-API-Calls um
- python3 ./scripts/publish-to-bitbucket-insights.py findings.json

Pull-Request-Pipelines: nur geänderte Zeilen

In Pull-Request-Pipelines lassen sich sowohl die gemeldeten Findings als auch das --fail-on-Gate mit --git-ref auf die im PR geänderten Zeilen beschränken:

pipelines:
  pull-requests:
    '**':
      - step:
          name: CodeCharter (nur geänderte Zeilen)
          clone:
            depth: full
          script:
            # ... CLI-Download wie oben ...
            - git fetch origin $BITBUCKET_PR_DESTINATION_BRANCH
            - codecharter analyze MySolution.sln --fail-on error --git-ref "origin/$BITBUCKET_PR_DESTINATION_BRANCH..HEAD"

--git-ref führt intern git diff <range> --unified=0 aus, der Ziel-Branch muss also im Clone vorhanden sein (daher clone: depth: full und das git fetch).

Für Bestandscode gibt es außerdem Baseline-Unterstützung: --write-baseline zeichnet die aktuellen Findings einmalig auf, mit --baseline gelten Ausgabe und --fail-on danach nur noch für neue Findings.

Caching

CodeCharter hat keinen Cache für Analyseergebnisse, durch das Cachen von Analyse-Output lässt sich also nichts beschleunigen. Lohnend ist nur der Rule-Bundle-Cache: Wenn Ihr Projekt Portal-Regelprofile nutzt (eine .codecharter/codecharter.lock.json im Verzeichnis .codecharter/), landen heruntergeladene Bundles in .codecharter/cache. Der caches: codecharter-Block oben zusammen mit der Custom-Cache-Definition persistiert dieses Verzeichnis und erspart bei warmen Runs das erneute Herunterladen der Bundles.

Liegt Ihre Solution-Datei nicht im Repo-Root, passen Sie den Pfad in der Cache-Definition entsprechend an. Ohne Portal-Profile gibt es nichts zu cachen und Sie können die Cache-Blöcke weglassen.

Versions-Pinning

Wie immer empfohlen: konkrete CLI-Version pinnen, siehe Versionierung.

Jede Download-Antwort enthält einen X-CodeCharter-Sha256-Header. Vergleichen Sie ihn mit der Prüfsumme des heruntergeladenen Archivs, wenn Sie die Integrität des Downloads im Step verifizieren wollen.

Exit-Codes

Bitbucket markiert den Step bei jedem Exit-Code ungleich null als fehlgeschlagen. codecharter analyze verwendet diese Exit-Codes:

Code Bedeutung
0 Keine gate-relevanten Findings
1 Findings auf oder über dem --fail-on-Level; ohne --fail-on jedes Finding
2 Bedienfehler (ungültige Optionen, defekte Baseline, ...)
3 Solution oder Projekt konnte nicht geladen werden
6 Lizenzfehler

Schlägt die Pipeline plötzlich beim Download oder beim Analyze-Step mit HTTP 402 fehl, ist das Abo abgelaufen: Sowohl der CLI-Download als auch das Ausstellen der Lizenz liefern in diesem Fall 402.