CI-Integration
Vorlagen zum direkten Einfügen, die die CLI (npx @surea11y/cli scan ...) in GitHub Actions, Bitbucket Pipelines, GitLab CI und Azure DevOps einbinden. Wenn Sie die Bibliothek statt über die CLI direkt aus Ihrem eigenen Node-Skript aufrufen, lesen Sie stattdessen INTEGRATION.md — diese Seite behandelt speziell die CLI als Pipeline-Schritt.
Die CLI scannt statisches HTML: Sie führt das JavaScript der Seite nicht aus. Das passt zu gebauten oder serverseitig gerenderten Seiten; für eine clientseitig gerenderte App oder Regeln, die ein Layout brauchen, scannen Sie stattdessen im Browser mit einem der Browser-Bindings.
Alle Vorlagen nutzen die Exit-Codes der CLI (0 bestanden, 1 mindestens ein — bzw. mit --baseline mindestens ein neues — fail-Ergebnis, 2 ein Aufruf- oder Scan-Fehler), um die Pipeline zu steuern; für ein einfaches Bestanden/Nicht-bestanden-Gating ist kein zusätzliches Skript nötig. Eine grüne Pipeline bedeutet, dass keine Prüfung fehlgeschlagen ist, bzw. keine neue. Sie ist keine Konformitätsaussage, und cantTell-Befunde lassen sie nicht scheitern.
GitHub Actions
Einfach: Gating über den Exit-Code
name: Accessibility scanon: [pull_request]jobs:a11y-scan:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: 22- run: npm ci && npm run build # produce whatever static HTML you're scanning- run: npx @surea11y/cli scan ./dist/index.html
Damit schlägt der Job fehl, sobald irgendein fail-Ergebnis gefunden wird. Für eine bestehende Website mit bereits vorhandenen Verstößen verwenden Sie die Baseline-Variante unten, statt den Schritt zu deaktivieren.
Mit Baseline (bestehende Website, Gating nur bei neuen Verstößen)
# Once, locally: record every current fail occurrence, commit the file.$ surea11y scan ./dist/index.html --write-baseline a11y-baseline.json$ git add a11y-baseline.json
- run: npm ci && npm run build- run: npx @surea11y/cli scan ./dist/index.html --baseline a11y-baseline.json
Eine Baseline verhindert, dass bekannte Verstöße den Build scheitern lassen; sie macht sie nicht akzeptabel. Beheben Sie sie und verkleinern Sie die Datei mit der Zeit. Unter Baseline / Allowlist erfahren Sie, was als „bekannt“ und was als „neu“ gilt und wie Sie die Datei neu erzeugen, während Verstöße behoben werden.
SARIF zu GitHub Code Scanning hochladen
upload-sarif benötigt die Berechtigung security-events: write und lässt den Job selbst nicht fehlschlagen — kombinieren Sie es mit einem separaten Gating-Schritt (oder continue-on-error plus eigener Prüfung), wenn der Build bei neuen Verstößen auch fehlschlagen soll.
Befunde, die zu fail tendieren, sind standardmäßig warning-Alerts. Mit renderSarifReport(result, { leanFailAs: 'error' }) aus @surea11y/core/sarif erzeugt, sind sie errors, sodass ein Gating auf Fehler auch bei wahrscheinlichen Fehlschlägen stoppt (SARIF-Optionen); eine mit buildBaselineEntries(result, { leanFail: true }) geschriebene Baseline akzeptiert die, die eine Seite schon hat (Befunde mit Tendenz zu fail).
name: Accessibility scanon: [pull_request]permissions:contents: readsecurity-events: writejobs:a11y-scan:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: 22- run: npm ci && npm run build- name: Scan (report, don't fail the job here)run: npx @surea11y/cli scan ./dist/index.html --baseline a11y-baseline.json --sarif results.sarifcontinue-on-error: trueid: scan- name: Upload SARIF to Code Scanninguses: github/codeql-action/upload-sarif@v3with:sarif_file: results.sarif- name: Fail the job on new violationsif: steps.scan.outcome == 'failure'run: exit 1
Siehe das SARIF-Berichtsformat und eine bekannte Einschränkung: Der Scan einer lokalen Datei in Ihrem Checkout erhält Inline-Annotationen in der Code-Scanning-Oberfläche; der Scan einer Live-URL nicht (SARIF/Code Scanning kann einen Befund nur einer tatsächlichen Datei im Repository zuordnen).
Bitbucket Pipelines
Bitbucket Pipelines hat kein eingebautes Dashboard für SARIF, das mit GitHub Code Scanning vergleichbar wäre. Der praktische Integrationspunkt ist daher der Exit-Code der CLI (optional ergänzt um --html als herunterladbares Pipeline-Artefakt), nicht --sarif.
pipelines:pull-requests:'**':- step:name: Accessibility scanimage: node:22script:- npm ci- npm run build- npx @surea11y/cli scan ./dist/index.html --baseline a11y-baseline.json --html a11y-report.htmlartifacts:- a11y-report.html
Der Schritt lässt die Pipeline über den Exit-Code der CLI fehlschlagen, genau wie jeder andere script-Eintrag; a11y-report.html (siehe den HTML-Bericht) wird als herunterladbares Build-Artefakt angehängt, sodass jemand im Review ihn öffnen kann, ohne den Scan lokal erneut auszuführen.
JUnit-Testberichte
GitLab, Azure DevOps, Jenkins und CircleCI zeigen JUnit-XML in ihren eigenen Testansichten: Jedes WCAG-Kriterium wird zu einer Suite und jede Regel zu einem Test (siehe JUnit-Bericht). Die CLI schreibt ihn mit --junit <path> (@surea11y/cli 1.1.0 oder neuer) aus demselben Scan wie ihre anderen Ausgaben, und der Bericht ändert nie ihren Exit-Code, sodass der Schritt den Build weiterhin steuert.
GitLab CI
a11y:image: node:22script:- npm ci- npm run build- npx @surea11y/cli scan ./dist/index.html --junit a11y.junit.xmlartifacts:when: alwaysreports:junit: a11y.junit.xml
when: always lädt den Bericht auch dann hoch, wenn der Exit-Code des Scans den Job fehlschlagen lässt — also genau dann, wenn sich ein Blick in das Merge-Request-Widget lohnt.
Azure DevOps
steps:- script: |npm cinpm run buildnpx @surea11y/cli scan ./dist/index.html --junit a11y.junit.xmldisplayName: Accessibility scan- task: PublishTestResults@2condition: succeededOrFailed()inputs:testResultsFormat: JUnittestResultsFiles: a11y.junit.xml
cantTell-Regeln erscheinen als übersprungene Tests, nie als Fehlschläge. Mit --baseline sind auch Fehlschläge, die schon in der Baseline stehen, übersprungene Tests. Für cantTell-Regeln als Fehlschläge hat die CLI kein Flag: Speichern Sie den Scan mit --json und erzeugen Sie den Bericht mit renderJunitReport(result, { cantTellAs: 'failure' }) aus @surea11y/core/junit (siehe JUnit-Bericht); dafür braucht das Projekt @surea11y/core in seinen eigenen devDependencies. { leanFailAs: 'failure' } ist die engere Wahl: Nur die cantTell-Befunde, die zu fail tendieren, werden zu Fehlschlägen, jeweils mit Begründung und den Schritten, um sie zu bestätigen. Beides ändert den Bericht, nicht den Exit-Code der CLI.
Minutenlimits bei Free-Tier und privaten Repositories
Wenn das Free-Tier Ihres Pipeline-Anbieters minutenbegrenzt ist (das Free-Tier von Bitbucket Pipelines umfasst zum Beispiel 50 Build-Minuten pro Monat für private Workspaces), ist ein jsdom-basierter Scan von statischem oder serverseitig gerendertem HTML (das, was die CLI macht) deutlich günstiger, als einen echten Browser zu steuern — in der CLI-Dokumentation steht, worauf Sie dabei verzichten (kein clientseitig gerenderter Inhalt, kein echtes CSS-Layout).