Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TeamCity MSBuild Web Site publishproj

I have a Web Site project which I am trying to deploy via TeamCity and WebDeploy.

Because this is a Web Site and NOT a Web Application I do not have a .vbproj or .csproj file.

I have come to the conclusion from this post here that I need to create a .publishproj file as MSbuild uses this as it's build file.

However when TeamCity invokes MSBuild it bails with the following error:-

Failed to start MSBuild.exe. Failed to detect default target(s) in the project file C:\TeamCity\buildAgent\work\d9dda73c7948f14a\MainSite\website.publishproj. Please define targets explicitly in the build configuration options on TeamCity Web UI. Project does not define DefaultTargets or InitialTargets.

I have looked inside the .publishproj file and there is no Target defined.

I have also followed Troy Hunt's You're deploying it wrong articles for a Web Application and this works fine.

Can anybody suggest how I Web Deploy a Web Site (NOT Web Application) from Team City ?

like image 638
general exception Avatar asked Dec 26 '22 08:12

general exception


2 Answers

I never worked with web-site-not-a-web-project so take it with a grain of salt.

website.publishproj seems to be create the moment you touch Build > Publish Web Site menu in Visual Studio and imports Microsoft.WebSite.Publishing.targets which is good cause it's the same similar targets file imported by your normal web projects (Microsoft.WebApplication.targets) and both of which import Microsoft.Web.Publishing.targets.

Unlike any project created by Visual Studio it doesn't have a DefaultTargets = Build nor OutputPath property, so you need to explicitly specify Targets in MSBuild build step with any targets defined in Microsoft.WebSite.Publishing.targets or Microsoft.Web.Publishing.targets.

You can call your standard msbuild website.publishproj /t:Package /p:OutputPath=.\ to generate the .cmd and corresponding .zip in obj\Debug\Package. Then just call the .cmd or pass the .zip to the msdeploy.exe -source:package=.zip or try to do /t:Build /p:DeployOnBuild=true but I suspect you'd be missing a crap ton of properties predefined by your normal web project.

Edit:

There seems to be a circular reference somewhere and you end up with a package containing 2/3 copies of itself in PackageTmp\_PublishedWebsites, so play around with OutDir, OutputPath, PackageDestinationRoot and so on to get rid of the duplicates. Create a sample web project and read through the .csproj and .targets to get the idea.

Edit:

If you go through the publishing wizard you will also get App_Data\PublishProfiles\Foo.pubxml as well that's being read via PublishProfileName/WebPublishProfileFile, importing it would save time on some typing. This might be relevant.

Edit:

The import of proper web targets seems to be a new feature in 2012/2013, with 2010 you would need to use aspnet_compiler.

aspnet_compiler -v Foo -p . -f obj
msdeploy -verb:sync -source:iisApp=%CD%\obj -dest:iisApp="Default Web Site/foo"
like image 79
Ilya Kozhevnikov Avatar answered Dec 31 '22 14:12

Ilya Kozhevnikov


I found out in the end that for some reason I had to explicitly set the target to Rebuild in Team City for Web Site projects.

like image 34
general exception Avatar answered Dec 31 '22 12:12

general exception