Scanverra
CI/CD Integration

Anleitungen

CI/CD-Integration

Jeder Scanner-Endpunkt akzeptiert einen API-Schlüssel, sodass jeder davon als Pipeline-Schritt laufen kann. Diese Seite erklärt, was die Ausgabe jedes Tools bedeutet, wie Sie daraus ein Pass/Fail-Gate bauen, und liefert funktionierende Beispiele für vier CI-Plattformen.

Bewertungsgrundlage pro Tool

Was jeder Endpunkt zurückgibt und worauf Sie einen Schwellenwert setzen sollten.

ToolAusgabeGrundlageEingebautes Gate
Website-Audit4 Scores 0-100: performance, seo, accessibility, bestPracticesRohe Lighthouse-Scores. Konvention: ≥90 gut, 50-89 verbesserungswürdig, <50 schlecht.Kein eingebautes Gate — wählen Sie Ihren eigenen Schwellenwert pro Score.
Sicherheits-ScanriskScore 0-100 (höher = sicherer)100 minus schweregradgewichtete, pro Kategorie gedeckelte Abzüge. Notenbänder: A+ ≥90 … F <30.Kein eingebautes Gate — wählen Sie Ihren eigenen Schwellenwert.
Browser-TestArrays: jsErrors, brokenLinks, formIssues, imgIssues (jeweils severity: "error" | "warning")Kein Gesamt-Score.Absicherung anhand der Problemanzahl, z. B. jede severity === "error".
Repo-Scannerscore 0-100 + qualityGate: "passed" | "failed"100 minus schweregradgewichtete Abzüge, pro Kategorie gedeckelt.Eingebaut — schlägt automatisch bei jedem kritischen Fund oder score < 60 fehl.

Die Pipeline stoppen

Die CI-Mechanik ist plattformunabhängig gleich: Ein Schritt, der mit einem Nicht-Null-Code beendet wird, lässt den Job fehlschlagen. Um einen PR oder Merge Request tatsächlich am Mergen zu hindern, fügen Sie diesen Job als erforderlichen Status-Check im Branch-Schutz oder in den Merge-Request-Genehmigungseinstellungen Ihres Repo-Hosts hinzu — ein fehlgeschlagener Schritt zeigt allein nur Rot an, verhindert aber nicht selbst ein Merge.

Beispiel-Pipelines

Dieselben vier Prüfungen — Audit, Security Scan, Browser Test, Repo Scan — für vier Plattformen. Wählen Sie unten Ihr CI-System.

name: Scanverra checks
on: [pull_request]

jobs:
  scanverra:
    runs-on: ubuntu-latest
    env:
      API_KEY: ${{ secrets.SCANVERRA_API_KEY }}
      TARGET_URL: https://staging.example.com   # your deployed preview URL
    steps:
      - name: Website Audit (perf/SEO/a11y)
        run: |
          RES=$(curl -sf -X POST https://www.scanverra.com/api/audit \
            -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
            -d "{\"url\":\"$TARGET_URL\"}")
          echo "$RES" | jq .
          PERF=$(echo "$RES" | jq '.scores.performance')
          A11Y=$(echo "$RES" | jq '.scores.accessibility')
          if (( $(echo "$PERF < 50" | bc -l) )) || (( $(echo "$A11Y < 90" | bc -l) )); then
            echo "::error::Audit failed thresholds (perf=$PERF, a11y=$A11Y)"
            exit 1
          fi

      - name: Security Scan
        run: |
          RES=$(curl -sf -X POST https://www.scanverra.com/api/security-scan \
            -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
            -d "{\"url\":\"$TARGET_URL\"}")
          RISK=$(echo "$RES" | jq '.riskScore')
          echo "riskScore=$RISK"
          [ "$RISK" -lt 70 ] && { echo "::error::Security risk score too low ($RISK)"; exit 1; }
          true

      - name: Browser Test (JS errors, broken links)
        run: |
          RES=$(curl -sf -X POST https://www.scanverra.com/api/browser-test \
            -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
            -d "{\"url\":\"$TARGET_URL\"}")
          ERRORS=$(echo "$RES" | jq '[.jsErrors[]? | select(.severity=="error")] | length')
          [ "$ERRORS" -gt 0 ] && { echo "::error::$ERRORS JS errors found"; exit 1; }
          true

      - name: Repo Scan (SAST, secrets, deps, quality gate)
        run: |
          SCAN_ID=$(curl -sf -X POST https://www.scanverra.com/api/repo/scan \
            -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
            -d '{"owner":"your-org","repo":"your-repo","branch":"${{ github.head_ref }}"}' | jq -r .scanId)

          for i in $(seq 1 30); do
            RESULT=$(curl -sf "https://www.scanverra.com/api/repo/result?id=$SCAN_ID" -H "X-API-Key: $API_KEY")
            STATUS=$(echo "$RESULT" | jq -r .status)
            [ "$STATUS" != "running" ] && break
            sleep 10
          done

          echo "$RESULT" | jq '{score, qualityGate}'
          GATE=$(echo "$RESULT" | jq -r .qualityGate)
          [ "$GATE" = "failed" ] && { echo "::error::Repo quality gate failed"; exit 1; }
          true

Wo der API-Schlüssel als Secret gespeichert wird, je Plattform:

  • GitHub Actions: Repo-Secret — Settings → Secrets and variables → Actions.
  • GitLab CI: maskierte CI/CD-Variable — Settings → CI/CD → Variables.
  • Azure Pipelines: geheime Pipeline-Variable (Schloss-Symbol) oder eine Variable Group unter Pipelines → Library.
  • Jenkins: Secret-Text-Credential — Manage Jenkins → Credentials — referenziert über credentials(). Das Agent-Image benötigt außerdem curl, jq und bc; die GitHub- und Azure-gehosteten ubuntu-latest-Runner enthalten diese bereits, das alpine-Image von GitLab nicht (daher der apk add-Schritt).

Der Repo-Scanner-Schritt benötigt vorab ein in den Scanverra-Einstellungen verbundenes GitHub-/Bitbucket-/Azure-Konto — der Scan läuft über das dort gespeicherte Token, nicht über eines, das pro Anfrage übergeben wird.

Hinweis zum Kontingent: Ein API-Schlüssel im Free-Plan ist genauso kontingentbeschränkt wie ein kostenloses Webkonto — CI-Läufe zählen weiterhin auf Ihr monatliches Scan-Limit und können es bei Scans bei jedem PR schnell aufbrauchen. API-Schlüssel in Pro-, Team- und Enterprise-Plänen sind unbegrenzt. Siehe Limits & Verhalten.

Nur der Repo-Scanner liefert ein fertiges qualityGate-Feld. Für die anderen drei Tools legen Sie eigene Schwellenwerte im Voraus fest und halten diese über alle Umgebungen hinweg konsistent (vergleichen Sie z. B. nicht den Sicherheits-Score einer Staging-URL mit einem für die Produktion abgestimmten Schwellenwert).