Saya mendapatkannya sebagian besar bekerja tanpa skrip msbuild kustom. Berikut adalah pengaturan konfigurasi build TeamCity yang relevan:
Jalur artefak:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
Jenis pelari: MSBuild (Pelari untuk file MSBuild)
Buat jalur file: MyProject \ MyProject.csproj
Direktori kerja: sama dengan direktori checkout
Versi MSBuild: Microsoft .NET Framework 4.0
MSBuild ToolsVersion: 4.0
Jalankan platform: x86
Target: Paket
Parameter baris perintah ke MSBuild.exe: / p: Configuration = Debug
Ini akan mengkompilasi, mengemas (dengan transformasi web.config), dan menyimpan output sebagai artefak. Satu-satunya hal yang hilang adalah menyalin output ke lokasi yang ditentukan, tetapi itu bisa dilakukan baik dalam konfigurasi membangun TeamCity lain dengan ketergantungan artefak atau dengan skrip msbuild.
Memperbarui
Berikut ini adalah skrip msbuild yang akan dikompilasi, paket (dengan transformasi web.config), dan salin hasilnya ke server staging saya
<?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>
Anda juga bisa menghapus properti SolutionName dan ProjectName dari tag PropertyGroup dan meneruskannya ke msbuild.
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Perbarui 2
Karena pertanyaan ini masih mendapatkan banyak traffic, saya pikir layak untuk memperbarui jawaban saya dengan skrip saya saat ini yang menggunakan Web Deploy (juga dikenal sebagai 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>
Di TeamCity, saya memiliki parameter bernama env.Configuration
, env.ProjectName
dan env.DeployServiceUrl
. Pelari MSBuild memiliki path file build dan parameter dilewatkan secara otomatis (Anda tidak harus menentukannya dalam parameter baris perintah).
Anda juga dapat menjalankannya dari baris perintah:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService