Contexte et Prérequis
Danger automatisé l'analyse des demandes d'extraction (Pull Requests) pour appliquer des règles de qualité de code. Cependant, son intégration dans des écosystèmes complexes peut générer des erreurs. Ce guide technique détaille les correctifs pour les blocages fréquents liés à l'environnement, l'authentification et l'exécution des scripts.
Résolution des Conflits d'Environnement
Incompatibilité de l'Interpréteur Ruby
Lorsque Danger est exécuté dans des projets non-Ruby, l'image de base du CI possède souvent une version obsolète de l'interpréteur.
# Gestionnaire de versions asdf pour une compatibilité multi-projets
asdf plugin add ruby
asdf install ruby 3.2.2
asdf local ruby 3.2.2
Absence de Fichier de Dépendances (Gemfile)
Les projets Node.js ou Python n'ont pas de Gemfile, ce qui bloque l'initialisation de Bundler.
# Désactivation de la vérification via variable d'environnement
DANGER_SKIP_GEMFILE_CHECK=true bundle exec danger
Intégration et Authentification CI
Échec d'Authentification sur GitHub Actions
Les tokens par défaut peuvent manquer de scopes ou le checkout peut être insuffisant pour calculer les diffs.
name: Analyse de Code Automatisée
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
audit:
runs-on: ubuntu-22.04
steps:
- name: Récupération de l'historique complet
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Exécution de l'analyse
uses: danger/danger@main
env:
GITHUB_TOKEN: ${{ secrets.SERVICE_ACCOUNT_TOKEN }}
Exécution sur les Forks Externes
Les secrets ne sont pas injectés dans les PRs provenant de forks pour des raisons de sécurité, faisant planer le script.
# Vérification conditionnelle robuste en Bash
if [[ -n "$GITHUB_TOKEN" ]]; then
bundle exec danger
else
echo "Analyse différée : token indisponible pour les contributeurs externes."
fi
Permissions et Détection de Spam
Si les commentaires sont validés par l'API mais invisibles, le compte de service a probablement été flaggé par les algorithmes anti-spam de GitHub. Il est impératif d'utiliser un compte d'application GitHub (GitHub App) ou un token PAT (Personal Access Token) avec les scopes public_repo ou repo correctement configurés, et d'éviter les partages de tokens entre multiples organisations.
Débogage Local et Inspection
Simulation de Pull Requests
Tester les règles sans pousser de commits réels.
# Ciblage d'une PR spécifique
bundle exec danger pr "https://github.com/organisation/depot/pull/899"
# Analyse basée sur la branche de base
bundle exec danger local --base=develop
Introspection de l'État Interne
Utilisation de Pry pour inspecter les objets exposés par Danger.
require 'pry'
# Affichage des fichiers modifiés avant l'arrêt
puts "Fichiers impactés : #{git.modified_files.join(', ')}"
binding.pry
# Commandes disponibles dans la session REPL :
# git.added_files
# git.commits.map(&:message)
Gestion des Règles et Optimisation
Validation Statique du Dangerfile
Prévenir les erreurs de syntaxe Ruby avant l'exécution en CI.
# Vérification de la syntaxe
ruby -wc Dangerfile
# Exécution avec traçage détaillé
bundle exec danger local --verbose
Épinglage des Versions de Plugins
Éviter les ruptures de compatibiltié lors des mises à jour mineures des plugins communautaires.
# Importation avec contrainte de version stricte
danger.import_dangerfile(gem: "danger-linter_config", version: "~> 2.1.0")
Optimisation des Performances et Timeouts
Les appels système directs dans le Dangerfile bloquent le thread principal et causent des timeouts. Il faut privilégier les API natives de Danger.
# ❌ Pratique déconseillée : Lente et bloquante
# fail("Trop de lignes") if `find . -name "*.rb" | xargs wc -l`.to_i > 5000
# ✅ Approche optimisée : Utilisation des métadonnées Git natives
warn("Volume de modifications conséquent") if git.insertions > 1500
Spécificités Réseau et Entreprise
Configuration GitHub Enterprise (GHE)
Redirection des requêtes API vers les serveurs internes.
export DANGER_GITHUB_HOST="git.entreprise-locale.corp"
export DANGER_GITHUB_API_BASE="https://git.entreprise-locale.corp/api/v3"
Traversée de Proxy Corporatif
Injection des certificats et routage proxy pour les environnements isolés.
export HTTP_PROXY="http://identifiant:mdp@proxy.reseau.local:8080"
export HTTPS_PROXY="http://identifiant:mdp@proxy.reseau.local:8080"
Tableaux de Référence
Checklist de Déploiement
| Paramètre | Obligatoire | Notes Techniques |
|---|---|---|
| Interpréteur Ruby | Oui | Version 3.x recommandée pour le support natif |
| Token d'Authentification | Oui | GitHub App ou PAT avec droits d'écriture |
| Profondeur de Checkout | Oui | fetch-depth: 0 requis pour les diffs |
Matrice de Compatibilité
| Version Danger | Ruby Minimum | Caractéristiques Principales |
|---|---|---|
| 9.x.x | 3.0.0 | Support natif des GitHub Apps, performances améliorées |
| 8.x.x | 2.6.0 | Stabilité CI, corrections de bugs réseau |
| 7.x.x | 2.4.0 | Version héritée, fin de support progressive |