Eh bien, pour une journée de réunions, on peut dire que le résultat est plus productif que d’habitude ! Entre deux réunions de gestion de projet, j’ai en effet pu mettre en place une chose qui manquait depuis plusieurs mois à l’un de mes partenaires : une automatisation complète de son processus de Build, allant jusqu’à l’élaboration de la release ClickOnce.
Voici donc un petit guide, basé sur les “découvertes” de cette journées pour obtenir un déploiement ClickOnce au cours d’un Build automatisé. Ces informations sont plus qu’inspirées par Tim Hibbard, en fait on pourrait presque dire qu’il s’agit d’une version traduite et mise à jour de ses instructions.
Premier point important, récupérez le MSBuild Extension pack à partir de Codeplex et installez les sur chacun des serveurs/postes que vous utiliserez pour compiler vos projets.
Une fois ce composant indispensable récupéré, il va falloir modifier le fichier tfsbuild.proj correspondant à votre build :
- pour ajouter des références aux extensions. Ici deux solutions : soit se conformer aux instructions de Tim Hibbard, et créer un PropertyGroup spécifique à ClickOnce, soit – et c’est cette solution qui sera détaillé ci-après – utiliser la tâche AssemblyInfo et ses dérivés pour gérer à la fois ClickOnce et les versions des assemblies. Il vous faudra donc ajouter deux lignes, dans la partie “imports”
1: <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.
ExtensionPack.tasks"/>
2: <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.
ExtensionPack.VersionNumber.targets"/>
- Puis définir le property group nécessaire à mettre à jours les versions des assemblies (et de click once)
1: <!-- Properties for controlling the Assembly Version -->
2: <PropertyGroup>
3: <AssemblyMajorVersion>9</AssemblyMajorVersion>
4: <AssemblyMinorVersion>0</AssemblyMinorVersion>
5: <AssemblyBuildNumber>0</AssemblyBuildNumber>
6: <AssemblyRevision>1</AssemblyRevision>
7: </PropertyGroup>
8:
9: <!-- Properties for controlling the Assembly File Version -->
10: <PropertyGroup>
11: <AssemblyFileMajorVersion>9</AssemblyFileMajorVersion>
12: <AssemblyFileMinorVersion>0</AssemblyFileMinorVersion>
13: <AssemblyFileBuildNumber>0</AssemblyFileBuildNumber>
14: <AssemblyFileRevision>1</AssemblyFileRevision>
15: </PropertyGroup>
- Nous allons ensuite un peu ruser pour mettre à jour le FileRevision, en effet, le partenaire en question utilise un schéma de numéros du type “année”.”release”.”itération interne”.”version de compilation” depuis un certain temps (par exemple 9.0.3.228 signifie “version 2009, release 1, itération N°3 du 28/02). Il a donc fallu contourner les limitations de la tâche AssemblyInfo :
1: <Target Name="VersionPublish">
2: <MSBuild.ExtensionPack.Framework.DateAndTime TaskAction="Get"
3: Format="MMdd">
4: <Output TaskParameter="Result"
5: PropertyName="AssemblyFileRevision" />
6: </MSBuild.ExtensionPack.Framework.DateAndTime>
7: </Target>
8:
9: <Target Name="BeforeCompile" DependsOnTargets="VersionPublish">
10: <Message Text="FileVersion générée par le VersionNumber.Targets
11: $(AssemblyFileMajorVersion).$(AssemblyFileMinorVersion).
12: $(AssemblyFileBuildNumber).$(AssemblyFileRevision)" />
13: </Target>
Comme vous devez vous en douter, le deuxième noeud ne sert qu’à tracer dans le fichier de génération le numéro généré… c’est assez pratique pour débugger, donc autant le mettre :)
- reste ensuite à dire à TeamBuild de publier une version de l’application :
1: <Target Name="AfterCompile">
2: <MSBuild Projects="$(SolutionRoot)\project.csproj"
3: Properties="PublishDir=$(OutDir)publish\;InstallFrom=Web;
4: UpdateRequired=true;InstallUrl=...;
5: MinimumRequiredVersion=$(AssemblyFileMajorVersion)
6: .$(AssemblyFileMinorVersion)
7: .$(AssemblyFileBuildNumber).$(AssemblyFileRevision);
8: ApplicationVersion=$(AssemblyFileMajorVersion)
9: .$(AssemblyFileMinorVersion).
10: $(AssemblyFileBuildNumber).$(AssemblyFileRevision)"
11: Targets="Publish" />
12: </Target>
Si vous avez besoin de modifier des options de publication, le plus simple est probablement d’ouvrir votre fichier .csproj dans un notepad et de regarder le nom des différents paramètres, en tout cas, c’est comme cela que j’ai trouvé les “MinimumRequiredVersion” ou autre “InstallUrl”.
Voila, avec ces quelques lignes en plus, vous aurez un très joli dossier publish/ dans le dossier de sortie de votre définition de build. Il existe peut-être une solution plus pratique que le “<MSBuild… Targets=’publish’ />”, mais c’est ce que j’ai trouvé de plus pratique et de plus facile à mettre en place pour le moment…