Automatisation de la vérification DCO avec GitHub Actions

Dans les projets open source, il est essentiel de garantir que chaque contribution respecte les conditions légales d'utilisation et de redistribution. Le Developer Certificate of Origin (DCO) permet d’assurer cette conformité en demandant aux contributeurs d’ajouter une ligne Signed-off-by dans leurs messages de commit. Cet article explique comment automatiser cette vérification à l’aide de workflows GitHub Actions basés sur des modèles communautaires.

Fonctionnement du DCO

Chaque commit doit inclure une ligne au format suivant :

Signed-off-by: Prénom Nom <email@domaine.com>

Cette mention atteste que le contributeur a le droit de soumettre le code sous la licence du projet. Une vérification automatique permet d’éviter les oublis humains et d’accélérer les revues de code.

Mise en place du workflow GitHub Actions

Pour activer la vérification DCO, créez un fichier .github/workflows/dco-check.yml à la racine du dépôt :

name: Vérification DCO

on:
  pull_request:
    branches: [ main ]
  push:
    branches: [ main ]

jobs:
  validate-dco:
    runs-on: ubuntu-latest
    steps:
      - name: Récupérer le code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Vérifier les signatures DCO
        run: |
          BASE=$(git merge-base origin/main HEAD)
          for sha in $(git log --format='%H' $BASE..HEAD); do
            if ! git log -1 --format='%B' $sha | grep -q 'Signed-off-by'; then
              echo "::error::Commit $sha n'a pas de signature DCO"
              exit 1
            fi
          done
          echo "✅ Tous les commits sont signés selon le DCO"

      - name: Commenter en cas d'échec
        if: failure()
        uses: actions/github-script@v6
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `❌ Échec de la vérification DCO.\n\nVeuillez signer tous vos commits avec :\n\`\`\`\nSigned-off-by: Votre Nom <votre@email.com>\n\`\`\`\nUtilisez \`git commit -s\` pour le faire automatiquement.`
            })

Personnalisation avancée

Il est posisble d’adapter ce workflow selon les besoins spécifiques de l’équipe :

  • Restriction par domaine email : via des expressions régulières dans le script de vérification.
  • Intégration avec d’autres workflows : en ajoutant une dépendance via needs: validate-dco dans d’autres jobs.
  • Hook local Git : ajoutez un fichier exécutable .git/hooks/commit-msg pour bloquer les commits non signés en local.

Tests et dépannage

Pour tester localement :

git commit -s -m "feat: exemple de commit conforme"

En cas d’échec dans le workflow, vérifiez :

  • Que tous les commits de la PR incluent bien la signature.
  • Que le fetch-depth est défini à 0 pour accéder à tout l’historique.
  • Que l’adresse email utilisée correspond à celle associée à votre compte GitHub.

Bonnes pratiques

  • Documentez la procédure DCO dans le fichier CONTRIBUTING.md.
  • Utilisez git rebase -i pour corriger les commits existants si nécessaire.
  • Évitez de désactiver la vérification sauf en cas d’urgence, et privilégiez une correction rapide.

Exemple de hook Git local

#!/bin/sh
if ! grep -q "Signed-off-by" "$1"; then
  echo "Erreur : Votre commit doit inclure 'Signed-off-by'"
  exit 1
fi

Placez ce script dans .git/hooks/commit-msg et rendez-le exécutable avec chmod +x.

Étiquettes: GitHub Actions DCO Git workflow automation open source compliance

Publié le 9 septembre à 00h18