Étude de cas
Go Release Manager
Un outil en ligne de commande en Go qui décide la prochaine version d'un logiciel à partir des messages de commit et crée le tag. Il est en production : c'est lui qui versionne sdd-kit.
- v1.3.0 en production, il versionne sdd-kit
- 97 % de couverture de tests
- 3 systèmes dans la CI : Linux, macOS et Windows
Chiffres de la release v1.3.0, mesurés le 15/10/2026 (couverture de 96,9 %). Tout peut être vérifié dans le dépôt public.
Voir le dépôt →Lire la documentation →Télécharger les releases →
$ git log --oneline
fa4ed96 docs: usage examples
1be5e0c feat(cli)!: drop --legacy
57bc93a fix(parser): handle empty input
43d79e8 (tag: v1.3.0) feat: first command
$ go-release-manager create --dry-run --explain
No .go-releaserc.yml found. Using the default rules (feat/fix).
Latest stable version: v1.3.0
Analyzing 3 commit(s) since tag v1.3.0...
Analysis done. Highest increment: Major
Increment: Major. Next version: v2.0.0
--- DRY RUN ---
Latest tag: v1.3.0
Commits analyzed: 3
Increment: Major
Decided by:
Major feat(cli)!: drop --legacy ("!" in the header)
Tag that would be created: v2.0.0
--- END OF DRY RUN ---
$ go-release-manager check-pr --title "feat: drop --legacy" \
--body "BREAKING CHANGE: --legacy was removed"
Pull request: feat: drop --legacy
Breaking change announced in: PR description
✗ [breaking-not-in-title] the pull request announces a breaking change (PR description), but the title has no "!", and the title is what a squash merge keeps: use "feat!: drop --legacy"
1 error, 0 warningsLe problème
Décider la prochaine version se fait souvent à la main : quelqu'un lit les commits, choisit entre patch, minor et major et crée le tag. C'est lent, cela dépend de la mémoire et l'erreur est facile, surtout avec les pré-releases et les changements incompatibles.
Des outils comme semantic-release résolvent le problème, mais apportent Node.js, des plugins et de la configuration à des projets qui n'en utilisent pas.
La solution
Un binaire unique, sans dépendances, qui lit les commits depuis la dernière version stable, applique les Conventional Commits et calcule le prochain tag SemVer. L'outil fait une seule chose : le build, les notes et la publication de la release restent du ressort de GoReleaser.
- La commande next n'affiche que la version, pour les scripts ; la sortie JSON donne le résultat complet.
- La simulation (--dry-run) montre tout sans rien écrire ni demander d'identifiants.
- Des pré-releases par canal (beta, rc) avec un compteur continu, une version imposée quand le plan l'exige et un tag sur un commit précis.
- Une GitHub Action prête à l'emploi, qui télécharge le binaire de la release et vérifie sa somme de contrôle avant de s'exécuter.
- --explain liste les commits qui ont décidé l'incrément et la règle de chacun, pour que personne n'ait à deviner pourquoi la version est passée en major.
Changements incompatibles et squash merges
Après la publication, un lecteur a demandé ce qui se passe dans un squash merge, où seul le message final du commit décide la version. Si l'avis BREAKING CHANGE n'est que dans la description de la PR ou dans un commit intermédiaire, et que le titre n'a pas de "!", la release sort en minor alors qu'elle devrait être major, et les utilisateurs mettent à jour sans savoir que quelque chose a cassé.
La v1.3.0 comble cette faille par couches, toutes avec la même règle de détection que le calcul de version :
- La commande check-pr refuse la PR quand une rupture annoncée quelque part manque dans le titre, et propose le bon titre ; elle signale aussi un pied de page mal placé et un "BREAKING CHANGES" mal écrit.
- Une Action check-pr pour la CI, qui lit le titre et la description dans le fichier de l'événement, et non dans le script, pour qu'un titre malveillant ne puisse pas injecter de code.
- Un filet de sécurité après le merge, qui compare le commit arrivé sur main avec sa PR et ouvre une issue si la rupture s'est perdue.
- Un guide de bonnes pratiques, en portugais et en anglais, sur ce que GitHub garde selon le réglage du squash et sur la façon d'écrire la PR.
Comment la qualité est garantie
Le projet suit le même processus que j'utilise au travail :
- Développement guidé par les spécifications : chaque règle de version a des critères d'acceptation, et chaque critère renvoie au test qui le prouve.
- Tests unitaires et de bout en bout, avec 97 % de couverture du code ; la CI exige au moins 80 %.
- CI sur chaque pull request : lint, tests avec détection des accès concurrents, build, commandes du README, l'Action exécutée sous Linux, macOS et Windows et check-pr lui-même qui vérifie le titre.
- Releases automatisées : l'outil calcule sa propre version, et GoReleaser publie des binaires pour cinq plateformes avec des sommes SHA-256.
- Une branche et une pull request par tâche, avec Conventional Commits et un CHANGELOG.
Choix techniques
- La base est toujours le plus haut tag stable atteignable : une pré-release ne devient jamais la base par erreur.
- En version 0.x, un changement incompatible augmente la minor, comme le prévoit SemVer.
- Les diagnostics vont sur stderr et le résultat sur stdout : les scripts lisent la sortie sans rien filtrer.
- L'outil parle anglais, et la documentation est un guide complet en portugais et en anglais.
Résultat
L'outil calcule les versions de sdd-kit, mon kit de développement guidé par les spécifications, à chaque clôture de phase. Lors de la revue avant la mise en production, de nouveaux tests ont fait passer la couverture de tout le code de 7,9 % à 97,1 %, et un défaut du --version du binaire publié a été trouvé et corrigé avant la diffusion.
Limites
L'usage réel se limite encore à sdd-kit et à mes projets ; il manque la validation par d'autres équipes. check-pr ne détecte que les ruptures déclarées (avec "!" ou BREAKING CHANGE) : une rupture que personne n'a annoncée demanderait de comparer l'API publique entre versions. Aucune image Docker n'est publiée, et volontairement l'outil ne rédige pas le changelog et ne publie pas la release lui-même.
Besoin de quelqu'un qui livre ainsi ?
Je travaille en QA et en développement : spécifications, tests automatisés, CI et livraison jusqu'à la production, avec la documentation pour ceux qui l'utiliseront.
Me contacter →