L'ho fatto funzionare principalmente senza uno script msbuild personalizzato. Ecco le impostazioni di configurazione build TeamCity pertinenti:
Percorsi artefatto:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
Tipo di runner: MSBuild (Runner per file MSBuild)
Percorso del file di build: MyProject \ MyProject.csproj
Directory di lavoro: uguale alla directory di pagamento
Versione MSBuild: Microsoft .NET Framework 4.0
Versione MSBuild Tools: 4.0
Esegui piattaforma: x86
Obiettivi: pacchetto
Parametri della riga di comando su MSBuild.exe: / p: Configuration = Debug
Questo compilerà, impacchetterà (con trasformazione web.config) e salverà l'output come artefatti. L'unica cosa che manca è copiare l'output in una posizione specificata, ma ciò potrebbe essere fatto in un'altra configurazione di build di TeamCity con una dipendenza artefatto o con uno script msbuild.
Aggiornare
Ecco uno script msbuild che compilerà, impacchetterà (con trasformazione web.config) e copierà l'output sul mio server di gestione temporanea
<?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>
Puoi anche rimuovere le proprietà SolutionName e ProjectName dal tag PropertyGroup e passarle a msbuild.
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Aggiornamento 2
Dato che questa domanda riceve ancora molto traffico, ho pensato che valesse la pena aggiornare la mia risposta con il mio script corrente che utilizza Web Deploy (noto anche come 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>
In TeamCity, ho parametri denominati env.Configuration
, env.ProjectName
e env.DeployServiceUrl
. Il runner MSBuild ha il percorso del file di build e i parametri vengono passati automaticamente (non è necessario specificarli nei parametri della riga di comando).
Puoi anche eseguirlo dalla riga di comando:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService