Pour intégrer les versions de git en tant que numéros de build ou non?

12

Un collègue et moi avons discuté / discuté à tour de rôle des problèmes / mérites de l'intégration d'une version dérivée du référentiel git actuel dans notre code chaque fois qu'il est construit.

Nous pensons que les mérites comprennent:

  • Pas besoin de s'inquiéter d'une erreur humaine lors de la mise à jour d'un numéro de version
  • Traçabilité entre ce que nous trouvons dans un appareil et le code source dont il est dérivé

Les problèmes qui se sont posés (pour nous) comprennent:

  • Les systèmes de construction dérivés d'IDE (par exemple MPLABX) peuvent rendre difficile la détermination de l'emplacement de ces types de crochets (et cela peut finir par être assez ringard à la fin)
  • Plus de travail pour réellement l'intégrer dans les scripts de construction / makefiles
  • Le couplage à une approche de construction particulière (par exemple, si une personne construit avec XCode et l'autre MPLABX) peut créer des surprises en aval

Nous sommes donc curieux de savoir où d'autres ont atterri dans ce débat. Il est vraiment facile pour la discussion de devenir anecdotique. Il y a beaucoup de gens qui insistent sur l'automatisation de bout en bout, suspendent la quantité de travail initial et le couplage qu'il crée. Et il y en a beaucoup d'autres de l'autre côté du débat, qui font la chose la plus simple qui fonctionne et qui vivent avec les risques.

Y a-t-il une réponse raisonnée de quel côté est le mieux pour atterrir?

Travis Griggs
la source

Réponses:

15

Nous utilisons git describe avec des balises de version. Le flux est essentiellement:

  • créer une balise pour la version sur laquelle nous travaillons (par exemple v1.1.2)
  • chaque exécution git describe
  • lorsque nous expédions, utilisez le nom de la balise

git describefournit le nom de la balise, le nombre de validations depuis la balise et le hachage de la balise. Un exemple de balise ressemble à:

v1.1.2-6-a3b27gae

Cela a l'avantage que les développeurs obtiennent des hachages, donc si quelque chose se casse entre les builds, le développeur peut facilement différencier les changements. C'est aussi stupide et simple à gérer; demandez à votre chef d'équipe de créer et de pousser la balise sur une nouvelle branche de correction de bogues et votre système de construction s'occupe du reste.

Nous supprimons le hachage (et le numéro de version) car cela permet aux utilisateurs de comprendre plus facilement nos numéros de version. Nous constatons que cela nous donne le meilleur des deux mondes, tout en fournissant suffisamment d'informations pertinentes lors de la conception d'une version.

Actuellement, nous en avons une version un peu plus compliquée, mais l'idée demeure.

beatgammit
la source
1
Notez juste: le hachage dans it describe(la dernière partie de la chaîne) n'est pas le cset-id de la balise, mais le hachage du changeset, pour lequel nous obtenons une description . Sous une forme lisible par l'homme v1.1.2-6-a3b27gae, "Six changesets after changeset, tagged as v1.1.2-6, has short changeset-hash a3b27gae"
Lazy Badger
@LazyBadger - Exactement. Le hachage de la balise elle-même est moins utile, car vous pouvez facilement git checkout v1.1.2ou répertorier la validation de la balise avec git rev-list v1.1.2 | head -n 1.
beatgammit
6

Nous avions l'habitude d'être une boutique SVN, donc ce calcul était facile - le numéro de build était la version SVN et c'était tout. Nous avons essayé de continuer ainsi lorsque nous avons commencé à migrer vers DCVSes et nous avons constaté que cela échouait pour plusieurs raisons.

Tout d'abord, qui sait si la rév 69bc333bc8d8 est avant, après ou concurrente avec la rév 25b0f0d1052c? Il y a très peu de contexte par rapport au système SVN lorsque vous saviez au moins que 101 était après 100. Deuxièmement, la nature du contrôle de source DCVS rend les choses non linéaires à bien des égards lorsque les générations suivantes pourraient ne pas faire avancer la même balle.

Nous avons finalement décidé d'utiliser un serveur de build pour distribuer les numéros de build aux choses car il avait la bonne visibilité et la capacité de le gérer.

Wyatt Barnett
la source
2

J'utilise le schéma suivant pour un système de construction Visual Studio d'une DLL C # pour générer automatiquement les numéros de version (Nous avons toujours eu des problèmes avec les déploiements qui ne sont pas effectués correctement, donc nous avions besoin d'un moyen propre de garantir le déploiement de la version correcte).

  • Majeure - Codée en dur 1, généralement déterminée par le côté entreprise
  • Mineur - Codé en dur 0, généralement déterminé par le côté entreprise
  • Révision - Nombre de jours depuis le 1er janvier 2010 (ou toute autre date de début arbitraire)
  • Build - La moitié du nombre de secondes depuis minuit (puisqu'il s'agit d'un nombre non signé de 16 bits)

Notez que cela suppose que vous avez 2 numéros fongibles non signés 16 bits avec lesquels jouer. La création d'un système équivalent qui utilise des nombres plus petits pourrait également se faire.

Notez également que les champs non numériques peuvent être utiles si vous pouvez les joindre en tant que métadonnées. Par exemple, en ajoutant le numéro de version de git en tant que numéro de version d'information.

Guvante
la source
2

Je relie directement la sortie de git status, log et diff dans l'exécutable. Il y a ensuite une option pour l'imprimer. L'avantage est que vous pouvez non seulement déterminer à partir de quelle branche votre binaire a été construit, mais également quelles modifications de code source non validées sont incluses. S'il te plait regarde:

https://github.com/colding/MercuryFIX/tree/master/stdlib/scm_state

Vous devriez pouvoir utiliser ces 3 fichiers pour créer votre propre librairie d'état SCM.

le refroidissement
la source
0

Je recommanderais l'utilisation d' Autorevision .

Vous pouvez obtenir une sortie dans divers formats, par exemple un en- tête de style c .

Il existe également quelques exemples (dans le répertoire contrib) de la façon dont vous pouvez connecter les choses pour que, peu importe qui construit et comment il le fasse, il obtiendra toujours les mêmes informations de version, même s'il construit à partir d'une archive tar.

De plus, puisqu'en plus d' gitAutorevision fonctionne avec svnet hgil permet de passer plus facilement de svn sans avoir à trop changer une fois que vous l'avez configuré.

dak180
la source
Malheureusement, la documentation d'Autorevision ne semble donner aucune recommandation. Quelles informations de l'en-tête généré par Autorevision utilisez-vous / combinez-vous pour créer une chaîne de version logicielle unique et sans ambiguïté?
Silicomancer
Cela dépend de la façon dont vous voulez lisible: <VCS_TAG>-<VCS_SHORT_HASH>, <VCS_TAG>-<VCS_TICK>ou même <VCS_ACTION_STAMP>si des travaux tout. Si vous voulez une liste complète de chacun de ces symboles, je vous suggère de consulter la page de manuel .
dak180