Lo tengo principalmente trabajando sin un script personalizado de msbuild. Estas son las configuraciones de configuración relevantes de TeamCity:
Rutas de artefactos:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
Tipo de corredor: MSBuild (Runner para archivos MSBuild)
Ruta del archivo de compilación: MyProject \ MyProject.csproj
Directorio de trabajo: igual que el directorio de pago
Versión de MSBuild: Microsoft .NET Framework 4.0
MSBuild ToolsVersion: 4.0
Ejecutar plataforma: x86
Objetivos: paquete
Parámetros de línea de comando para MSBuild.exe: / p: Configuración = Depuración
Esto compilará, empaquetará (con la transformación web.config) y guardará la salida como artefactos. Lo único que falta es copiar el resultado en una ubicación específica, pero eso podría hacerse en otra configuración de compilación de TeamCity con una dependencia de artefactos o con un script msbuild.
Actualizar
Aquí hay un script de msbuild que compilará, empaquetará (con la transformación web.config) y copiará la salida a mi servidor provisional
<?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>
También puede eliminar las propiedades SolutionName y ProjectName de la etiqueta PropertyGroup y pasarlas a msbuild.
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Actualización 2
Dado que esta pregunta todavía recibe una gran cantidad de tráfico, pensé que valía la pena actualizar mi respuesta con mi script actual que usa Web Deploy (también conocido 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>
En TeamCity, tengo parámetros con nombre env.Configuration
, env.ProjectName
y env.DeployServiceUrl
. El corredor MSBuild tiene la ruta del archivo de compilación y los parámetros se pasan automáticamente (no es necesario que los especifique en los parámetros de la línea de comandos).
También puede ejecutarlo desde la línea de comando:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService