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.
| Outil | Sortie | Base | Gate intégré |
|---|---|---|---|
| Audit de site web | 4 scores 0-100 : performance, seo, accessibility, bestPractices | Scores 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 navigateur | Tableaux : 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ôts | score 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; }
trueOù 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 decurl,jqetbcinstallés ; les runnersubuntu-latesthébergés par GitHub et Azure les incluent déjà, l'imagealpinede GitLab non (d'où l'étapeapk 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.
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).