Intégration CI/CD

Intégration CI/CD pour l'accessibilité RGAA

Détectez les régressions d'accessibilité à chaque déploiement. Intégrez les audits RGAA directement dans votre pipeline CI/CD.

GitHub ActionsGitLab CIJenkins

Vous cherchez à récupérer vos résultats par programmation ? Voir le guide API REST RGAA Checker (GET).

Le problème

Les régressions d'accessibilité passent souvent inaperçues jusqu'à ce qu'un utilisateur ou un audit externe les détecte. À ce moment-là, les corriger coûte plus cher et prend plus de temps.

  • Régressions non détectées en production
  • Corrections coûteuses après déploiement
  • Risque de non-conformité RGAA/EAA

La solution

Intégrez les audits RGAA dans votre pipeline CI/CD. Détectez automatiquement les problèmes d'accessibilité avant qu'ils n'arrivent en production.

  • Audit automatique à chaque PR
  • Bloquer les déploiements non conformes
  • Rapports JUnit pour vos outils CI

Comment ça marche ?

Trois étapes simples pour automatiser vos audits d'accessibilité.

Créez une clé API

Depuis votre dashboard, générez une clé API sécurisée. Stockez-la dans les secrets de votre CI (RGAA_CHECKER_API_KEY).

Configurez votre pipeline

Ajoutez notre GitHub Action, CLI npm ou appel API REST dans votre workflow CI/CD.

Recevez les résultats

À chaque PR, obtenez le score RGAA et la liste des erreurs. Bloquez les déploiements si le seuil n'est pas atteint.

Pourquoi intégrer RGAA Checker dans votre CI ?

RGAA Checker scanne vos pages après déploiement sur un environnement de preview ou staging. Il teste le rendu final avec tout le JavaScript exécuté et le contenu réel.

Preview Deployments

Chaque Pull Request crée une preview (Vercel, Netlify, etc.). RGAA Checker scanne automatiquement cette URL et bloque le merge si le score baisse.

PR #42 → preview-pr-42.vercel.app → Scan → Score 85% ✓

Contenu dynamique / CMS

Votre code peut être parfait, mais le contenu injecté par un CMS peut créer des problèmes : images sans alt, liens vides, contrastes insuffisants.

Strapi / Contentful / WordPress → Contenu réel testé

Détection de régressions

Un développeur modifie un composant et casse l'accessibilité sans le savoir. Le build échoue avant que ça arrive en production.

Score 85% → Commit → Score 72% → Build FAILED ✗

Workflow typique avec RGAA Checker

Push / PR
Build
Deploy Preview
RGAA Checker
Merge

RGAA Checker intervient après le déploiement de votre preview pour tester la page réelle.

Exemple : Scanner automatiquement les previews Vercel

.github/workflows/accessibility.yml
name: Accessibility Check

on:
  deployment_status:
    types: [success]

jobs:
  rgaa-audit:
    # Se déclenche uniquement quand le déploiement réussit
    if: github.event.deployment_status.state == 'success'
    runs-on: ubuntu-latest
    steps:
      - name: Audit RGAA
        uses: rgaa-checker/action@v1
        with:
          api-key: ${{ secrets.RGAA_CHECKER_API_KEY }}
          # Utilise l'URL de preview générée par Vercel/Netlify
          url: ${{ github.event.deployment_status.target_url }}
          threshold: 80

Exemples d'intégration

Choisissez votre méthode d'intégration préférée.

.github/workflows/accessibility.yml
name: Accessibility Check

on:
  pull_request:
  push:
    branches: [main]

jobs:
  rgaa-audit:
    runs-on: ubuntu-latest
    steps:
      - uses: rgaa-checker/action@v1
        with:
          api-key: ${{ secrets.RGAA_CHECKER_API_KEY }}
          url: https://staging.example.com
          threshold: 80

Format de réponse

JSON Response
{
  "success": true,
  "url": "https://example.com",
  "score": 85,
  "rgaaScore": 72,
  "passed": true,
  "threshold": 80,
  "stats": {
    "total": 106,
    "pass": 45,
    "fail": 8,
    "manual": 18,
    "na": 35
  },
  "issues": [
    {
      "criterion": "1.1",
      "title": "Images",
      "status": "fail",
      "count": 3,
      "samples": ["<img src='logo.png'>"]
    }
  ],
  "duration": 12500,
  "timestamp": "2024-01-15T10:30:00Z"
}

Documentation détaillée

Tout savoir sur l'installation, la configuration et les options disponibles.

Installation

Installez le CLI RGAA Checker via npm pour l'utiliser dans vos pipelines CI/CD ou en local.

Installation globale

Recommandé pour une utilisation en local
npm install -g @rgaa-checker/cli

Utilisation avec npx

Sans installation permanente
npx @rgaa-checker/cli scan https://example.com
Installation en dépendance de projet
# Ajouter comme dépendance de développement
npm install --save-dev @rgaa-checker/cli

# Puis utiliser via npm scripts dans package.json
{
  "scripts": {
    "test:a11y": "rgaa-checker scan https://localhost:3000 --threshold 80"
  }
}

Pré-requis

  • • Node.js version 18 ou supérieure
  • • Une clé API RGAA Checker (plan Découverte ou Pro)

Fichier de configuration .rgaachecker.json

Créez un fichier .rgaachecker.json à la racine de votre projet pour configurer les options par défaut du CLI.

.rgaachecker.json
{
  "url": "https://staging.example.com",
  "threshold": 80,
  "timeout": 60000,
  "auth": {
    "type": "basic",
    "username": "$BASIC_USER",
    "password": "$BASIC_PASS"
  }
}
OptionTypeDéfautDescription
urlstring-URL à scanner par défaut
thresholdnumber80Score minimum requis (0-100)
timeoutnumber60000Timeout en millisecondes
authobject-Configuration Basic Auth

Note : Les arguments CLI (ex: --threshold 90) ont priorite sur le fichier de configuration.

Authentification Basic Auth

Scannez vos environnements de staging proteges par authentification HTTP Basic. Utilisez des variables d'environnement pour ne pas exposer vos identifiants.

Via le CLI

rgaa-checker scan https://staging.example.com \
  --basic-user admin \
  --basic-pass secret123

Via l'API

{
  "url": "https://staging.example.com",
  "auth": {
    "type": "basic",
    "username": "admin",
    "password": "secret123"
  }
}

Variables d'environnement

Dans le fichier .rgaachecker.json, prefixez les valeurs avec $ pour utiliser des variables d'environnement :

"auth": {
  "type": "basic",
  "username": "$STAGING_USER",
  "password": "$STAGING_PASS"
}

Rapports JUnit XML

Exportez les resultats au format JUnit XML pour les integrer a vos outils de CI (Jenkins, GitLab, Azure DevOps, etc.). Chaque critere RGAA echoue devient un test case.

Generer un rapport JUnit
# CLI - Exporter au format JUnit
rgaa-checker scan https://example.com --format junit > report.xml

# Ou avec un fichier de sortie
rgaa-checker scan https://example.com --format junit --output accessibility.xml
Exemple de sortie JUnit XML
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="RGAA Checker" tests="106" failures="8" time="12.500">
  <testsuite name="RGAA Audit - https://example.com" tests="106" failures="8">
    <testcase name="Overall Score" classname="RGAA">
      <failure message="Score 75% is below threshold 80%">
        The accessibility score does not meet the required threshold.
      </failure>
    </testcase>
    <testcase name="[1.1] Images" classname="RGAA.1.1">
      <failure message="3 issues found">
        &lt;img src="logo.png"&gt;
        &lt;img src="banner.jpg"&gt;
      </failure>
    </testcase>
  </testsuite>
</testsuites>

Rate Limiting et Quotas

L'API CI est soumise a des limites pour garantir la disponibilite du service pour tous les utilisateurs.

Rate Limit

Requetes par minute30
Timeout maximum5 min

Quotas mensuels

Plan Decouverte100 scans
Plan Pro500 scans

Important : Les scans CI et les scans web partagent le meme quota mensuel. Planifiez vos audits en consequence pour optimiser votre utilisation.

Déclencher un crawl multi-pages

Pour auditer plusieurs pages en une seule requête (site complet, parcours utilisateur), utilisez POST /api/ci/crawl plutôt que d'enchaîner des appels à /api/ci/scan. Le crawl est déclenché de façon asynchrone : la requête répond immédiatement (202), et le résultat est disponible par sondage ou par webhook.

Pré-requis

  • • Plan Pro ou Entreprise (le crawl par API n'est pas disponible sur les plans Gratuit et Découverte)
  • • Une clé API RGAA Checker rgaa_ci_* (la même que pour /api/ci/scan)

Requête

cURL
curl -X POST https://rgaa-checker.com/api/ci/crawl \
  -H "Authorization: Bearer rgaa_ci_votre_cle" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": ["https://site.fr", "https://site.fr/contact"],
    "webhook_url": "https://hooks.example.com/rgaa"
  }'
ParamètreTypeDescription
urlsstring[]Requis, au moins 2 URL. Pour une seule page, utilisez /api/ci/scan.
webhook_urlstringOptionnel. URL publique en https:// qui reçoit une notification à la fin du crawl.
withAIbooleanOptionnel (défaut : false). Active l'analyse IA des images, réservée aux plans avec analyse IA.

Réponse (202 Accepted)

JSON Response
{
  "success": true,
  "crawl_id": "8f1e2c3a-4b5d-4e6f-9a1b-2c3d4e5f6a7b",
  "pages": 2,
  "status": "running",
  "status_url": "/api/crawl/8f1e2c3a-4b5d-4e6f-9a1b-2c3d4e5f6a7b",
  "page_scan_ids": ["…", "…"],
  "job_ids": ["…", "…"],
  "webhook": {
    "url": "https://hooks.example.com/rgaa",
    "secret": "whsec_xxxxxxxxxxxxxxxxxxxxxxxx",
    "signature_header": "X-RGAA-Signature",
    "algorithm": "HMAC-SHA256 hex, format sha256=<hex>",
    "note": "Store this secret now: it is only returned once."
  }
}

Important : le champ webhook.secret n'est renvoyé qu'une seule fois, dans cette réponse. Stockez-le immédiatement côté CI (variable secrète) : il est ensuite purgé côté serveur et ne peut plus être récupéré.

Quota : N pages = N scans

Chaque URL du tableau urls consomme une unité de votre quota mensuel de scans (le même quota que vos scans web et vos appels /api/ci/scan). Le quota est vérifié et décompté avantle lancement du crawl (fail-closed) : si le quota restant est insuffisant, la requête est rejetée et aucune page n'est scannée.

Suivi de l'avancement

Interrogez l'URL retournée dans status_url (équivalente à GET /api/crawl/:id, détaillée dans le guide API REST) pour suivre la progression :

GET /api/crawl/:id (extrait)
{
  "status": "running",
  "pagesProgress": {
    "completed": 1,
    "failed": 0,
    "pending": 1
  }
}

status passe de running à completed dès que toutes les pages sont sorties de l'état pending. Le sondage reste la source de vérité, que le webhook soit livré ou non.

Webhook de complétion

Si webhook_url est fourni, RGAA Checker envoie un POST à cette URL une fois le crawl terminé (évènement crawl.completed), signé avec le secret reçu à la création. Vérifiez systématiquement la signature avant de traiter le corps de la requête :

Node.js — vérification HMAC-SHA256
const crypto = require('node:crypto');

const expected = 'sha256=' + crypto.createHmac('sha256', secret)
  .update(rawBody).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(receivedSignature));
// receivedSignature = en-tête X-RGAA-Signature ; rawBody = corps brut, non parsé
  • • En-tête X-RGAA-Signature, format sha256=<hex>
  • • 3 tentatives de livraison (immédiate, puis +5 s, puis +25 s) ; au-delà, seul le sondage de status_url fait foi
  • • Le secret est purgé côté serveur juste après la dernière tentative de livraison, qu'elle ait réussi ou non

Limites du crawl

LimiteValeur
Pages par crawl (plan Pro)20
Pages par crawl (plan Entreprise)50
Crawls par jour et par clé API10
Requêtes par minute et par clé API10

Honnêteté du score : le score renvoyé (par page comme agrégé sur le crawl) reste un score automatisé. Environ 60 % des critères RGAA applicables à une page donnée exigent une vérification humaine que l'outil ne peut pas remplacer. Ne présentez jamais ce résultat comme une preuve de conformité RGAA : c'est un indicateur de suivi, pas une déclaration de conformité.

Reference des commandes CLI

rgaa-checker scan <url>

Lance un audit d'accessibilite sur l'URL specifiee.

--threshold <n>Score minimum requis (defaut: 80)
--timeout <ms>Timeout en ms (defaut: 60000)
--format <type>Format de sortie: text, json, junit
--output <file>Fichier de sortie pour le rapport
--basic-user <user>Nom d'utilisateur Basic Auth
--basic-pass <pass>Mot de passe Basic Auth

rgaa-checker auth set-key <key>

Configure votre cle API. Elle sera stockee dans ~/.rgaa-checker/config.json.

rgaa-checker init

Cree un fichier .rgaachecker.json avec une configuration par defaut.

Fonctionnalites

Tout ce dont vous avez besoin pour automatiser vos audits.

Score RGAA automatique

Obtenez un score de 0 a 100 base sur les 106 criteres RGAA testables automatiquement.

Seuil d'echec configurable

Definissez le score minimum acceptable. Bloquez les deploiements non conformes.

Commentaires PR configurables

Configurez des commentaires avec le score et les erreurs directement sur vos Pull Requests.

Rapports JUnit XML

Exportez les resultats au format JUnit pour une integration avec vos outils de reporting.

Support Basic Auth

Scannez vos environnements de staging proteges par authentification.

Rate limit genereux

30 requetes par minute pour supporter vos pipelines les plus actifs.

Questions frequentes

Comment creer une cle API ?

Connectez-vous a votre dashboard RGAA Checker, accedez a la section "Cles API" et cliquez sur "Nouvelle cle". Copiez la cle generee - elle ne sera affichee qu'une seule fois.

Combien coute l'integration CI/CD ?

L'integration CI/CD est incluse dans les plans Decouverte (69€/mois) et Pro (249€/mois). Les scans CI utilisent le meme quota que vos scans web.

Puis-je scanner des environnements de staging proteges ?

Oui, l'API CI supporte l'authentification Basic Auth. Vous pouvez configurer un nom d'utilisateur et mot de passe pour acceder a vos environnements proteges.

Comment configurer le seuil d'echec ?

Utilisez le parametre 'threshold' (0-100) pour definir le score minimum acceptable. Si le score est inferieur, le scan retourne passed: false, que votre CI peut utiliser pour faire echouer le build.

Le CLI supporte-t-il les monorepos ?

Oui, vous pouvez creer un fichier .rgaachecker.json a la racine de chaque sous-projet avec des configurations differentes (URL, seuils, options).

Inclus dans vos plans Decouverte et Pro

L'integration CI/CD utilise le meme quota que vos scans web. Pas de surcout, pas de plan separe.

Automatisez vos audits d'accessibilite

Detectez les regressions avant qu'elles n'arrivent en production.

Commencer l'integration