Scanverra
CI/CD Integration

Guides

Intégration CI/CD

Chaque endpoint de scanner accepte une clé API, si bien que chacun peut s'exécuter comme une étape de pipeline. Cette page explique ce que signifie la sortie de chaque outil, comment la transformer en gate réussite/échec, et fournit des exemples fonctionnels pour quatre plateformes CI.

Base de notation par outil

Ce que renvoie chaque endpoint, et sur quoi fixer un seuil.

OutilSortieBaseGate intégré
Audit de site web4 scores 0-100 : performance, seo, accessibility, bestPracticesScores Lighthouse bruts. Convention : ≥90 bon, 50-89 à améliorer, <50 médiocre.Aucun gate intégré — choisissez votre propre seuil par score.
Analyse de sécuritériskScore 0-100 (plus élevé = plus sûr)100 moins des déductions pondérées selon la gravité, plafonnées par catégorie. Tranches de notation : A+ ≥90 … F <30.Aucun gate intégré — choisissez votre propre seuil.
Test navigateurTableaux : jsErrors, brokenLinks, formIssues, imgIssues (chacun avec severity: "error" | "warning")Aucun score global.Conditionnez sur le nombre de problèmes, par exemple toute severity === "error".
Analyseur de dépôtsscore 0-100 + qualityGate: "passed" | "failed"100 moins des déductions pondérées selon la gravité, plafonnées par catégorie.Intégré — échoue automatiquement en cas de résultat critique ou de score < 60.

Arrêter le pipeline

La mécanique CI est la même quelle que soit la plateforme : une étape qui se termine avec un code non nul fait échouer le job. Pour réellement empêcher un PR ou une merge request d'être fusionnée, ajoutez ce job comme vérification de statut obligatoire dans la protection de branche ou les paramètres d'approbation des merge requests de votre hébergeur de dépôt — une étape échouée affiche seulement du rouge, elle n'empêche pas la fusion à elle seule.

Exemples de pipelines

Les quatre mêmes vérifications — Audit, Security Scan, Browser Test, Repo Scan — écrites pour quatre plateformes. Choisissez votre système CI ci-dessous.

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

Où stocker la clé API en tant que secret, selon la plateforme :

  • GitHub Actions : secret du dépôt — Settings → Secrets and variables → Actions.
  • GitLab CI : variable CI/CD masquée — Settings → CI/CD → Variables.
  • Azure Pipelines : variable de pipeline secrète (icône de cadenas) ou un Variable Group sous Pipelines → Library.
  • Jenkins : credential de type texte secret — Manage Jenkins → Credentials — référencé via credentials(). L'image de l'agent a également besoin de curl, jq et bc installés ; les runners ubuntu-latest hébergés par GitHub et Azure les incluent déjà, l'image alpine de GitLab non (d'où l'étape apk add).

L'étape de l'analyseur de dépôts nécessite au préalable la connexion de votre compte GitHub/Bitbucket/Azure dans les paramètres Scanverra — l'analyse s'exécute avec le jeton qui y est stocké, et non avec un jeton transmis à chaque requête.

Remarque sur le quota : une clé API du forfait Free est soumise au même quota qu'un compte web gratuit — les exécutions CI continuent de compter dans votre limite mensuelle d'analyses et peuvent l'épuiser rapidement si vous analysez à chaque PR. Les clés API des forfaits Pro, Team et Enterprise ne sont pas mesurées. Voir Limites et comportement.

Seul l'analyseur de dépôts renvoie un champ qualityGate prêt à l'emploi. Pour les trois autres outils, définissez vos propres seuils à l'avance et gardez-les cohérents entre les environnements (par exemple, ne comparez pas le score de sécurité d'une URL de staging à un seuil calibré pour la production).