Automated publishing using Teamcity - msbuild

I'm a newbie to configuration management and I'm required to implement a solution wherein I need to publish a new version of my Windows application on shared Network drive using Teamcity's Trigger.
We already have a continuous integration Teamcity server which is used for continuos build integration. Is it possible to publish a new version everytime along with the build using MSBUILD or something?
Thank you so much for reading.

Absolutely. I believe you already have a Build/Compile MSBuild target.
So now you can create Deploy.targets which simply executes a <Copy> MSBuild Task.
InputFiles attribute specifies files which are produced by Build/Compile target and OutputFiles would be the destination network folder path.
After that you have to make Deploy target to be dependent on Build target by specifying DependsOn="Build"

Related

What TFS 2017 build task applies web.config transforms during TFS builds?

Some original info was changed to make the post more focused on the real issue after it was found.
These are some of the details of the current environment. I listed these only because questions were raised in other posts to determine what was and was not working in the current environment:
Upon check-in TFS 2017 successfully builds a web project on the build agent.
A VS 2017 publish profile can manually transform the project properly
The build machine artifact location includes both the transform and profile files
The artifact location is shown below:
I have researched this in depth on Microsoft's VS site, SO and other forums, but there are so many different answers, many of them for older versions, I have been unable to piece this together. As a result I have several sub-questions.
1) Can transforms be engaged in both Builds and Releases?. I read that transforms are applied during the publish process, not the build process, and that made me wonder if it is even possible to do this during a Build. But then when I was exploring releases, I saw all the same tasks usable in a Build, which suggests I can publish with a transform in either Build or Release. Is that correct?
2) Does TFS 2017 require a lot of special handling to engage a transform file? Some of the posts instructed the editing of the .proj file. I wanted to get a confirmation before doing that kind of detailed manipulation, especially given the improvements in TFS 2017.
The following information is the state of the current build definition named "confPanner-CI". The shaded PS script was successfully used to upload to the hosting location to test the whole process, but that is not adequate for the task at hand which requires transforms to be applied:
The full MSBuild Arguments which also created a temp location for the powershell script are:
/p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=c:\ConfPlnrWeb
If I were to add a task for publishing I saw the Publish Build Artifacts task:
But none of the settings as shown below seem to relate to transforms:
The bottom line question is: How do I configure the build so the web project upload has the proper web transform applied?
Update: The following added after the answer below led to at least one place where VS transforms can be applied during a build, and presumably also a release.
Inside the MSBuild Build solution task set the Configuration as shown below:
Publish Build Artifacts task is used to publish the related artifacts ( The “a” working directory contains the artifacts (also known as the “drop”) that are uploaded at the end of the build) to Visual Studio Team Services/TFS or a file share.
Usually it should be a package and be used in a deploy task such as Deploy: WinRM - IIS Web App Deployment or Azure App Service Deployment to achieved the deployment.
1) Can transforms be engaged in both Builds and Releases?
Yes, you could also do this in a build pipeline with the useage of build deploy task. You need to add the task after the publish build artifacts task.
2) Does TFS 2017 require a lot of special handling to engage a transform file?
update
The BuildConfiguration variable is different in TFS 2017, it's inside
the MSBuild task! Transforms are now applied according
to the MSBuild task Configuration setting.
Edit the .proj file is a method to do the transform. If you don't need to change the transform, it will auto do it during the build.You could also use some 3-rd party task/extension for extra transform such as: XDT Transform
Usually we separate the build and release for the deployment, cause it's easy to configure multiple environments and easy to debug issue. You definitely could do this only in build but with a bloated process. You could refer this tutorial: Build and Deploy Azure Web Apps using Team Foundation Server/Services vNext Builds.
For a separate build and release solution, you could take a look at this blog: Using web.config transforms and Release Manager – TFS 2017/Team Services edition

What is the difference between a Publish and a WebPublish target?

We have a build configuration runner type of Visual Studio.sln setup to read from a csproj with a Publish Profile (/P:PublishProfile=%env.Configuration%.pubxml) to create a Web Deploy Package that we then use in another build step to deploy using MSDeploy.
On TeamCity the Targets options states that
Enter targets separated by space or semicolon. Build, Rebuild, Clean, Publish targets are supported by default
Looking at some other StackOverflow threads, it mentions that using WebPublish as a target works but doesn't say why it works.
TeamCity: How tell MSBuild to take into account publish profile parameters?
I am not sure what the difference between a "Publish" and a "WebPublish" is.
The "Publish" Visual Studio target uses WebDeploy/WebPublish under the hood to do its publishing.

Is there a built in way of executing an MSBuild target on the remote server using MSDeploy

Is there a built in way of executing an MSBuild target on the remote server using MSDeploy?
If I include a targets file in my project so that it is deployed is there a built in way or executing msbuild.exe? I know I could use runCommand but then the path to msbuild.exe could be wrong.
I've never heard of a built-in way to execute MsBuild from webdeploy. I don't even think it's necessarily a valid idea to have such a built-in way as target machine can have several versions of msbuild co-existing (v2.0\3.5\4.5\etc) - how do you tell msDeploy which to use?
I suggest, that you use runCommand and refer to msBuild using system variables: %WinDir%\Microsoft.Net\Framework\v4.0.30319\
Keeping in mind that framework versions move rather slowly you're safe (as you generally know, which version of the framework you target)
UPD: if you want a better way to find msbuild location - check out this answer (read from registry)
Referring to the answer on
Exec Task in MSBuild for execution of command on remote machine
MSBuild has no built in support for remote machine installation and only executes commands you tell it too and carries on from there.
In our place we have service installed on the remote machine which keeps monitoring our release folder. As soon as a new item (A zipped item containing all the files) becomes available it will perform our release operation. This might be similar in your scenario too.

Can MSBuild package and deploy via MSDeploy to IIS 6 in the one command?

Here's what I want to do:
Build an existing .csproj that targets "Package"
Publish the package with MSDeploy to an IIS 6 server
This is for a TeamCity build and release that I'm trying to configure in a single step. I could create a custom build file but I'm trying to tackle this without adding any additional configurations to the app.
There are a lot of examples around of MSBuild parameters which can do this publishing via WMSVC - here's a great one - but that's not going to play ball with IIS 6. Are there equivalent params which can be used when there is a dependency on MsDepSvc? Is this even possible or am I left with either a custom build script or a package build followed by a publish build?
You can modify an existing .csproj file to add any additional target needed (it's just an MSBuild file) and publishing to an IIS6 server can be done via different MSDeploy providers (webServer60, metaKey, or contentPath via a share).
While this would be possible to do by adding a Target in the MSBuild of your project, I'd recommend that you split these two activities out into two separate targets. By splitting them into two separate targets you can still call them together msbuild /t:Package;Deploy but you can also call them independently.
This would allow you to create a deployment package and have TeamCity include it as an artifact of the build. You could then download this package from TeamCity and deploy it to any server independently, even if you deployed it automatically. If TeamCity also creates your release builds, you know have your production deployment

building a windows service using msbuild

Can someone point out any tutorials that help build windows services using msbuild.
Requirements :
- Should not use the csproj file
- Output should be the same as the publish option in Visual Studio
Updated question:
We have a project of type windows service in our solution. In this windows service, we are referencing a couple of libraries that reside on a different system (one of them is not strongly named). This solution also contains other class libraries and websites/web-apps.
I am trying to write a custom build that outputs a xcopy deployable version of the website, and a deployable version of the windows service. When I say windows service, it shows up on the Control Panel -> Services MMC.
The website build was easy via msbuild...however I am struggling with the windows service build. Until now, my fellow developers were using the right-click on the project file ,and click publish to publish the windows service. This generates a setup.exe file that helps the admins to deploy the service.
So, now here is my question:
I want to use msbuild to build my windows service.
I do not want to directly use the .csproj file in conjunction with msbuild to build the service.
The output my build file generates should match the output from the "publish" option (*the publish option generates a setup.exe file*)
In general, "the publish option" under the covers just runs a build with /t:Publish, i.e., it triggers a different target to the normal default 'Build' one.
Can you tell us more of what you are looking for, as opposed to not looking for?
Are you looking to generate an MSI? (If so, you definitely won't be using MSBuild if you're using the built-in .vdproj system - but be careful - this means having to put VS on a build server)