Generarea Automată a Versiunilor de Build cu git describe în Git

Ghid complet pentru comanda git describe: generarea numelor umane de versiuni în CI/CD bazate pe cel mai apropiat tag, numărul de commit-uri și hash-ul curent.

Sintaxă comandă
git describe --tags --always | git describe --long

În pipeline-urile moderne de CI/CD (GitHub Actions, GitLab CI, Jenkins), este esențial să etichetezi imaginile Docker, binarele compilate sau pachetele npm cu un număr de versiune unic și ușor de citit. Folosirea exclusivă a hash-ului de commit (ex: a1b2c3d) este opacă și nu oferă informații despre ordinea temporală. Comanda git describe găsește cel mai apropiat tag adnotat și compune un nume de versiune structurat.

Anatomia rezultatului produs de git describe
# Rulăm comanda pe ramura curentă:
git describe --tags

# Exemplu de output generat:
# v1.4.2-18-g5b9d3ef

# Cum se decodifică acest șir:
# - 'v1.4.2'  : Cel mai apropiat tag găsit în istoricul de commit-uri din spate.
# - '18'      : Numărul exact de commit-uri adăugate de la tag-ul 'v1.4.2' până în prezent!
# - 'g5b9d3ef': Litera 'g' (înseamnă Git) urmată de hash-ul scurt al commit-ului curent.

Comportamente Specifice

  • Dacă commit-ul curent este exact pe un tag (fără commit-uri noi), git describe afișează simplu numele tag-ului: v1.4.2.
  • Dacă depozitul nu conține niciun tag, comanda aruncă eroare. Pentru a preveni eșecul în scripturi, adăugați parametrul --always (care va returna hash-ul de commit ca fallback): git describe --tags --always.
Utilizare în Dockerfile și Scripturi de CI/CD
# Generăm automat versiunea aplicației la compilare:
VERSIUNE=$(git describe --tags --always --dirty)

# Parametrul '--dirty' adaugă sufixul '-dirty' dacă există fișiere modificate
# și necomise în directorul de lucru (ex: v1.4.2-18-g5b9d3ef-dirty)!

docker build -t firma/api:${VERSIUNE} .