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-dcodans d’autres jobs. - Hook local Git : ajoutez un fichier exécutable
.git/hooks/commit-msgpour 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-depthest défini à0pour 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 -ipour 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.