Eu consegui trabalhar principalmente sem um script msbuild personalizado. Aqui estão as definições de configuração relevantes do TeamCity:
Caminhos de artefato:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
Tipo de corredor: MSBuild (arquivos Runner for MSBuild)
Caminho do arquivo de construção: MyProject \ MyProject.csproj
Diretório de trabalho: o mesmo que o diretório de checkout
Versão MSBuild: Microsoft .NET Framework 4.0
Ferramentas do MSBuild
Executar plataforma: x86
Metas: Pacote
Parâmetros de linha de comando para MSBuild.exe: / p: Configuration = Debug
Isso irá compilar, empacotar (com a transformação web.config) e salvar a saída como artefatos. A única coisa que falta é copiar a saída para um local especificado, mas isso pode ser feito em outra configuração de compilação do TeamCity com uma dependência de artefato ou com um script msbuild.
Atualizar
Aqui está um script msbuild que irá compilar, empacotar (com a transformação web.config) e copiar a saída no meu servidor intermediário
<?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>
Você também pode remover as propriedades SolutionName e ProjectName da marca PropertyGroup e passá-las para o msbuild.
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Atualização 2
Como essa pergunta ainda recebe bastante tráfego, achei que valia a pena atualizar minha resposta com meu script atual que usa o Web Deploy (também conhecido como 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>
No TeamCity, tenho parâmetros nomeados env.Configuration
, env.ProjectName
e env.DeployServiceUrl
. O MSBuild runner possui o caminho do arquivo de compilação e os parâmetros são transmitidos automaticamente (você não precisa especificá-los nos parâmetros de linha de comando).
Você também pode executá-lo na linha de comando:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService