Mon groupe et moi-même sommes horribles pour incrémenter les numéros de version d'assembly et nous expédions fréquemment des assemblys avec les versions 1.0.0.0. Évidemment, cela cause beaucoup de maux de tête.
Nous nous améliorons beaucoup avec nos pratiques via notre plate-forme CI et j'aimerais vraiment la configurer pour incrémenter automatiquement les valeurs dans le assemblyinfo.cs
fichier afin que les versions de nos assemblys soient automatiquement mises à jour avec les changements de code dans cet assemblage.
J'avais précédemment configuré (avant que nous ayons trouvé Hudson ) un moyen d'incrémenter la valeur via msbuild
la ligne de commande ou la ligne de commande ( je ne me souviens pas), mais avec Hudson, cela mettra à jour le référentiel SVN et déclenchera UNE AUTRE build. Cela entraînerait une boucle infinie lente car Hudson interroge SVN toutes les heures.
Avoir Hudson incrémenter le numéro de version est-il une mauvaise idée? Quelle serait une autre façon de le faire?
Idéalement, mes critères pour une solution seraient ceux qui:
- Incrémente le numéro de build
assemblyinfo.cs
avant une build - Incrémente uniquement le numéro de build dans les assemblys qui ont changé. Cela peut ne pas être possible car Hudson efface le dossier du projet à chaque fois qu'il fait une compilation
- Valide l'assemblyinfo.cs modifié dans le référentiel de code (actuellement VisualSVN )
- Ne provoque pas Hudson pour déclencher une nouvelle version la prochaine fois qu'il recherche les modifications
En travaillant cela dans ma tête, je pourrais facilement trouver une solution à la plupart de cela via des fichiers de commandes / commandes, mais toutes mes idées amèneraient Hudson à déclencher une nouvelle construction la prochaine fois qu'il analyse. Je ne cherche pas quelqu'un pour tout faire à ma place, juste me diriger dans la bonne direction, peut-être une technique pour amener Hudson à ignorer certains commits SVN, etc.
Tout ce que j'ai trouvé jusqu'à présent n'est qu'un article expliquant comment obtenir le numéro de version incrémenté automatiquement, rien ne prend en compte une plate-forme CI qui pourrait être transformée en une boucle infinie.
la source
Voici ce que j'ai fait, pour tamponner l'attribut AssemblyFileVersion.
Suppression de AssemblyFileVersion de AssemblyInfo.cs
Ajoutez un nouveau fichier vide appelé AssemblyFileInfo.cs au projet.
Installez l' ensemble d' outils des tâches de communauté MSBuild sur la machine de génération hudson ou en tant que dépendance NuGet dans votre projet.
Modifiez le fichier de projet (csproj), c'est juste un fichier msbuild, et ajoutez ce qui suit.
Quelque part, il y aura une
<PropertyGroup>
indication de la version. Changer cela pour qu'il se lit par exempleHudson fournit les variables d'environnement que vous voyez là lorsque le projet est construit sur hudson (en supposant qu'il soit extrait de subversion).
Au bas du fichier de projet, ajoutez
Cela utilise MSBuildCommunityTasks pour générer AssemblyFileVersion.cs afin d'inclure un attribut AssemblyFileVersion avant la génération du projet. Vous pouvez le faire pour n'importe lequel / tous les attributs de version si vous le souhaitez.
Le résultat est que, chaque fois que vous émettez une build hudson, l'assembly résultant obtient une AssemblyFileVersion de 1.0.HUDSON_BUILD_NR.SVN_REVISION, par exemple 1.0.6.2632, ce qui signifie le 6ème numéro de build dans hudson, issu de la révision subversion 2632.
la source
Voici une solution élégante qui nécessite un peu de travail en amont lors de l'ajout d'un nouveau projet mais qui gère le processus très facilement.
L'idée est que chaque projet est lié à un fichier Solution qui contient uniquement les informations de version d'assembly. Ainsi, votre processus de construction n'a qu'à mettre à jour un seul fichier et toutes les versions d'assembly sont extraites d'un fichier lors de la compilation.
Pas:
Lorsque vous ajoutez le fichier en tant que lien, il stocke les données dans le fichier projet et, lors de la compilation, extrait les informations de version d'assembly de ce fichier.
Dans votre contrôle de code source, vous ajoutez un fichier bat ou un fichier script qui incrémente simplement le fichier SharedAssemblyProperties.cs et tous vos projets mettront à jour leurs informations d'assemblage à partir de ce fichier.
la source
Hudson peut être configuré pour ignorer les modifications apportées à certains chemins et fichiers afin de ne pas demander une nouvelle construction.
Sur la page de configuration du travail, sous Gestion du code source , cliquez sur le bouton Avancé . Dans la zone Régions exclues , vous entrez une ou plusieurs expressions régulières pour correspondre aux exclusions.
Par exemple, pour ignorer les modifications apportées au fichier version.properties , vous pouvez utiliser:
Cela fonctionnera pour les langages autres que C # et vous permet de stocker vos informations de version dans subversion.
la source
.NET fait cela pour vous. Dans votre fichier AssemblyInfo.cs, définissez votre version d'assembly sur major.minor. * (Par exemple: 1.0. *).
Lorsque vous créez votre projet, la version est générée automatiquement.
Les numéros de version et de révision sont générés en fonction de la date, en utilisant l'époque Unix, je crois. La construction est basée sur le jour en cours et la révision est basée sur le nombre de secondes depuis minuit.
la source
Je n'ai jamais vu cette fonctionnalité 1.0. * Fonctionner dans VS2005 ou VS2008. Y a-t-il quelque chose à faire pour que VS incrémente les valeurs?
Si AssemblyInfo.cs est codé en dur avec 1.0. *, Alors où sont stockées la vraie version / révision?
Après avoir mis 1.0. * Dans AssemblyInfo, nous ne pouvons pas utiliser l'instruction suivante car ProductVersion a maintenant une valeur non valide - il utilise 1.0. * Et non la valeur attribuée par VS:
Soupir - cela semble être l'une de ces choses sur lesquelles tout le monde s'interroge, mais il n'y a jamais de réponse solide. Il y a des années, j'ai vu des solutions pour générer un numéro de révision et l'enregistrer dans AssemblyInfo dans le cadre d'un processus de post-construction. J'espérais que ce genre de danse ne serait pas nécessaire pour VS2008. Peut-être VS2010?
la source
Je suppose que l'on peut également le faire avec un modèle de texte dans lequel vous créez les attributs d'assemblage en question à la volée à partir de l'environnement comme le fait AssemblyVersion.tt ci-dessous.
la source
Dans le prolongement de la réponse de MikeS, je voulais ajouter que VS + Visual Studio Visualization and Modeling SDK doit être installé pour que cela fonctionne, et que vous devez également modifier le fichier de projet. Doit également être mentionné, j'utilise Jenkins comme serveur de construction fonctionnant sur une boîte de serveur Windows 2008 R2 avec module de version, où j'obtiens le BUILD_NUMBER.
Mon fichier de modèle de texte version.tt ressemble à ceci
J'ai ce qui suit dans les groupes de propriétés
après l'importation de Microsoft.CSharp.targets, j'ai ceci (en fonction de l'endroit où vous installez VS
Sur mon serveur de construction, j'ai ensuite le script suivant pour exécuter la transformation de texte avant la construction réelle, pour obtenir le dernier numéro de jeu de modifications sur TFS
De cette façon, je peux garder une trace des builds ET des ensembles de modifications, donc si je n'ai rien vérifié depuis la dernière version, le dernier chiffre ne devrait pas changer, mais j'aurais peut-être apporté des modifications au processus de construction, d'où la nécessité de l'avant-dernier numéro . Bien sûr, si vous effectuez plusieurs vérifications avant une compilation, vous n'obtiendrez que le dernier changement reflété dans la version. Je suppose que vous pourriez concaténer cela est nécessaire.
Je suis sûr que vous pouvez faire quelque chose de plus sophistiqué et appeler TFS directement à partir du modèle tt, mais cela fonctionne pour moi.
Je peux ensuite obtenir ma version au moment de l'exécution comme ceci
la source
Ma solution ne nécessite pas l'ajout d'outils externes ou de langages de script - elle est à peu près garantie de fonctionner sur votre machine de construction. Je résous ce problème en plusieurs parties. Tout d'abord, j'ai créé un fichier BUILD.BAT qui convertit le paramètre Jenkins BUILD_NUMBER en une variable d'environnement. J'utilise la fonction "Execute Windows batch command" de Jenkins pour exécuter le fichier batch de construction en entrant les informations suivantes pour la construction Jenkins:
Dans l'environnement de construction, j'ai un fichier build.bat qui commence comme suit:
Une fois que j'ai fait cela, j'ai cliqué avec le bouton droit sur le projet à créer dans le volet Explorateur de solutions de Visual Studio et sélectionné Propriétés, sélectionnez Événements de génération et entré les informations suivantes en tant que ligne de commande d'événement de pré-construction, qui crée automatiquement un fichier .cs contenant des informations sur le numéro de build basées sur les paramètres actuels de la variable d'environnement:
Vous devrez peut-être vous adapter à votre goût de construction. Je construis le projet manuellement une fois pour générer un fichier Version.cs initial dans le répertoire Properties du projet principal. Enfin, j'inclus manuellement le fichier Version.cs dans la solution Visual Studio en le faisant glisser dans le volet Explorateur de solutions, sous l'onglet Propriétés de ce projet. Dans les futures générations, Visual Studio lit ensuite ce fichier .cs au moment de la génération Jenkins et en obtient les informations de numéro de build correctes.
la source
Nous avons donc un projet avec une solution qui contient plusieurs projets qui ont des assemblys avec des numéros de version différents.
Après avoir étudié plusieurs des méthodes ci-dessus, je viens de mettre en œuvre une étape de construction pour exécuter un script Powershell qui effectue une recherche et un remplacement sur le fichier AssemblyInfo.cs. J'utilise toujours le numéro de version 1.0. * Dans le contrôle de code source, et Jenkins met simplement à jour manuellement le numéro de version avant que msbuild ne s'exécute.
J'ai ajouté l'option -Encoding "UTF8" car git a commencé à traiter le fichier .cs comme des fichiers binaires si je ne le faisais pas. Certes, cela n'avait pas d'importance, puisque je n'ai jamais réellement validé le résultat; il est venu juste pendant que je testais.
Notre environnement CI a déjà une fonctionnalité pour associer la construction Jenkins au commit git particulier (merci le plugin Stash!), Donc je ne crains pas qu'il n'y ait pas de commit git avec le numéro de version qui lui est attaché.
la source
C'est un mécanisme plus simple. Cela implique simplement l'ajout d'une étape de génération de tâche de commande Windows Batch avant l'étape MSBuild et l'utilisation d'un simple programme de recherche et de remplacement (FART).
L'étape du lot
Si vous utilisez un contrôle de code source autre que svn, modifiez l'option --svn pour celle qui convient à votre environnement scm.
Télécharger Fart
la source
J'ai décidé d'utiliser quelques méthodes en utilisant un script Powershell pré-build ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) pour incrémenter chaque build réussie, puis dans Global.asax, je vais quelque chose comme ceci:
Je pense toujours que l'ensemble du processus est trop compliqué et je vais examiner une méthode plus efficace pour obtenir le même résultat. Je le voulais principalement pour passer la version dans SVN, puis dans Jenkin sans trop d'outils supplémentaires.
la source