Ich habe es meistens ohne ein benutzerdefiniertes msbuild-Skript zum Laufen gebracht. Hier sind die relevanten Konfigurationseinstellungen für TeamCity-Builds:
Artefaktpfade:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
Runner-Typ: MSBuild (Runner für MSBuild-Dateien)
Dateipfad erstellen: MyProject \ MyProject.csproj
Arbeitsverzeichnis: wie Checkout-Verzeichnis
MSBuild-Version: Microsoft .NET Framework 4.0
MSBuild ToolsVersion: 4.0
Plattform ausführen: x86
Ziele: Paket
Befehlszeilenparameter für MSBuild.exe: / p: Configuration = Debug
Dadurch wird kompiliert, verpackt (mit web.config-Transformation) und die Ausgabe als Artefakt gespeichert. Das einzige, was fehlt, ist das Kopieren der Ausgabe an einen angegebenen Speicherort. Dies kann jedoch entweder in einer anderen TeamCity-Buildkonfiguration mit einer Artefaktabhängigkeit oder mit einem msbuild-Skript erfolgen.
Aktualisieren
Hier ist ein msbuild-Skript, das die Ausgabe kompiliert, verpackt (mit web.config-Transformation) und auf meinen Staging-Server kopiert
<?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>
Sie können auch die Eigenschaften SolutionName und ProjectName aus dem PropertyGroup-Tag entfernen und an msbuild übergeben.
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Update 2
Da diese Frage immer noch viel Verkehr hat, hielt ich es für sinnvoll, meine Antwort mit meinem aktuellen Skript zu aktualisieren, das Web Deploy (auch als MSDeploy bezeichnet) verwendet.
<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, habe ich Parameter genannt env.Configuration
, env.ProjectName
und env.DeployServiceUrl
. Der MSBuild-Runner verfügt über den Build-Dateipfad und die Parameter werden automatisch übergeben (Sie müssen sie nicht in den Befehlszeilenparametern angeben).
Sie können es auch über die Befehlszeile ausführen:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService