Je l'ai fait fonctionner principalement sans script msbuild personnalisé. Voici les paramètres de configuration de build TeamCity pertinents:
Chemins d'artefact:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
Type de coureur: MSBuild (coureur pour fichiers MSBuild)
Chemin du fichier de génération: MyProject \ MyProject.csproj
Répertoire de travail: identique au répertoire d'extraction
Version MSBuild: Microsoft .NET Framework 4.0
MSBuild ToolsVersion: 4.0
Exécuter la plate-forme: x86
Cibles: Package
Paramètres de ligne de commande pour MSBuild.exe: / p: Configuration = Debug
Cela compilera, conditionnera (avec la transformation web.config) et enregistrera la sortie sous forme d'artefacts. La seule chose qui manque est de copier la sortie vers un emplacement spécifié, mais cela pourrait être fait dans une autre configuration de build TeamCity avec une dépendance d'artefact ou avec un script msbuild.
Mettre à jour
Voici un script msbuild qui va compiler, empaqueter (avec la transformation web.config) et copier la sortie sur mon serveur intermédiaire
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<SolutionName>MySolution</SolutionName>
<SolutionFile>$(SolutionName).sln</SolutionFile>
<ProjectName>MyProject</ProjectName>
<ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
</PropertyGroup>
<Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />
<Target Name="BuildPackage">
<MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
</Target>
<Target Name="CopyOutput">
<ItemGroup>
<PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
</Project>
Vous pouvez également supprimer les propriétés SolutionName et ProjectName de la balise PropertyGroup et les transmettre à msbuild.
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Update 2
Étant donné que cette question reçoit toujours beaucoup de trafic, j'ai pensé qu'il valait la peine de mettre à jour ma réponse avec mon script actuel qui utilise Web Deploy (également connu sous le nom de MSDeploy).
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
<DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
</PropertyGroup>
<Target Name="VerifyProperties">
<!-- Verify that we have values for all required properties -->
<Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
</Target>
<Target Name="Build" DependsOnTargets="VerifyProperties">
<!-- Deploy using windows authentication -->
<MSBuild Projects="$(ProjectFile)"
Properties="Configuration=$(Configuration);
MvcBuildViews=False;
DeployOnBuild=true;
DeployTarget=MSDeployPublish;
CreatePackageOnPublish=True;
AllowUntrustedCertificate=True;
MSDeployPublishMethod=RemoteAgent;
MsDeployServiceUrl=$(DeployServiceUrl);
SkipExtraFilesOnServer=True;
UserName=;
Password=;"
ContinueOnError="false" />
</Target>
</Project>
Dans TeamCity, j'ai des paramètres nommés env.Configuration
, env.ProjectName
et env.DeployServiceUrl
. Le runner MSBuild a le chemin du fichier de construction et les paramètres sont passés automatiquement (vous n'avez pas besoin de les spécifier dans les paramètres de ligne de commande).
Vous pouvez également l'exécuter à partir de la ligne de commande:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService