Skip to content

Versionnage automatique avec GitVersion

GitVersion enlève la douleur du versionnage manuel (et les débats de couloir) en générant automatiquement des numéros de version à partir de votre historique Git, selon les principes SemVer. Au lieu de « penser à bumper » (et oublier), GitVersion analyse vos commits et branches pour déterminer la prochaine version logique.

Intégré à votre CI/CD, chaque commit - même sur une branche de fonctionnalité - reçoit un numéro de version unique et traçable.

INFO

Chaque commit a une version ! GitVersion génère des pré‑releases uniques pour chaque commit sur les branches de fonctionnalité (ex : 1.1.0-JIRA-1234-user-login-form.1, puis .2, etc.). Vous pouvez ainsi construire et tester depuis n’importe quel point du développement.

GitFlow + SemVer

N’importe quel commit étant potentiellement déployable, GitVersion peut calculer un numéro SemVer pertinent pour n’importe quelle branche et commit. GitVersion est configurable et reste conforme à SemVer.

Installation

Installez localement avec Chocolatey :

bash
choco install gitversion

Ou intégrez‑le dans votre CI/CD via ces templates :

Configuration

Ajoutez un GitVersion.yml à la racine du dépôt pour l’adapter à votre flux. Exemple ci‑dessous, pensé pour notre approche « tronc + squash + support » (à ajuster selon vos contraintes) :

yaml
mode: ContinuousDelivery
assembly-file-versioning-scheme: MajorMinorPatchTag
assembly-versioning-scheme: MajorMinorPatchTag
major-version-bump-message: "^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\\([\\w\\s-]*\\))?(!:|:.*\\n\\n((.+\\n)+\\n)?BREAKING CHANGE:\\s.+)"
minor-version-bump-message: "^(feat)(\\([\\w\\s-]*\\))?:"
patch-version-bump-message: "^(build|chore|ci|docs|fix|perf|refactor|revert|style|test)(\\([\\w\\s-]*\\))?:"
commit-message-incrementing: Enabled
branches:
  main:
    label: beta
  feature:
    regex: ^((task)|(feat(ure)?))[/-](?<BranchName>.{1,25})
    label: '{BranchName}'
    increment: Minor
    source-branches: ["main", "feature"]
    mode: ContinuousDelivery
  support:
    regex: ^support[/-](?<BranchName>.+)
    label: RC
    increment: Patch
    source-branches: ["main"]
    mode: ContinuousDelivery
  fix:
    regex: ^(bug|hot)?fix[/-](?<BranchName>.{1,25})
    label: '{BranchName}'
    increment: Patch
    source-branches: ["main", "support"]
    mode: ContinuousDelivery

Branches de support et incréments mineur/patch

La configuration ci‑dessus fonctionne bien et s’appuie sur les messages de commit (format Conventional Commits) pour incrémenter le bon chiffre. Petit bémol avec les branches de support :

Dans cet exemple, comme le commit sur la branche de support est de type feat:, GitVersion incrémentera le chiffre mineur, ce qui pourrait conduire à une future release 1.1.0… que l’on préférerait voir sur main.

Deux façons d’éviter cela :

  • Éviter les commits feat: et les branches feature sur les branches de support, et utiliser un autre type - après tout, on n’est pas censé ajouter des fonctionnalités sur une branche de support, n’est‑ce pas ?
  • Passer commit-message-incrementing: Disabled et s’appuyer uniquement sur les types de branches. Vous perdrez toutefois l’avantage des Conventional Commits.