How to integrate CI/CD with Visual Studio Team Services?
Microsoft provides free Visual Studio Team Services for a small team. It has free unlimited Git repositories and 4 hours per month to run builds, which should be more than enough for my projects.
I already integrated karpach.com front end and admin site. In this post, I’ll document how I integrated redboxnewreleases.com.
Step 1 Created build definition
My favorite browser is Google Chrome, but for the below process I used Microsoft Edge, since some things didn’t work in Google Chrome (e.g. reordering of build tasks).
I didn’t use any templates and started with an empty process. First of all, let’s try to build my solution. I used the following tasks as-is:
- Get sources (point to git repository)
- NuGet Restore **/*.sln (default settings)
- Build solution **/*.sln (default setting)
In my case the build failed with the following error:
Error MSB4226: The imported project "C:\Program Files (x86)\Microsoft Visual Studio\2017\ Enterprise\MSBuild\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks" was not found.
In my previous CI system I used ExtensionPack for assembly version modification. This is an old approach, so I just removed that task reference and used a different approach to specify the version later in the post.
I pushed a change, but it didn’t trigger any build. I added a trigger then:
- Opened a Triggers tab.
- Enabled continuous integration trigger.
- Set repository setting to build on any master branch change.
- Went to the options tab and set “Default agent queue”: Hosted VS2017.
- Pressed Save & queue
This time the build succeeded. Then I added assembly versioning back:
- Downloaded ApplyVersionToAssemblies.ps1 from https://github.com/tfsbuildextensions/CustomActivities.
- Deleted “$Env:TF_BUILD -and -not” from that PowerShell script.
- Replaced TF_BUILD with just BUILD in ApplyVersionToAssemblies.ps1.
- Added ApplyVersionToAssemblies.ps1 to Git repository.
- Went back to the build definition web editor and switched to the variables tab. Added MajorVersion and MinorVersion variables there.
- Switched to the Options tab and filled “Build number format” field with $(BuildDefinitionName)_$(MajorVersion).$(MinorVersion).$(Year:yy)$(DayOfYear)$(Rev:.rr)).
- Made sure that AssemblyVersion and AssemblyFileVersion lines are present in AssemblyInfo files (PowerShell script does a replacement in those files).
- Added PowerShell task to run ApplyVersionToAssemblies.ps1.
- Moved up PowerShell task to run after a Get Sources task.
After that I modified MsBuild task to produce a package for web deployment:
- Change the build to build web csproj file instead of solution file
- Specified configuration: Release
- Used following MSBuild Arguments: /T:Package /P:PackageLocation=..\Artifacts\package.zip
- Added Publish Build Artifacts task: Path to Publish = Artifacts\package.zip, Artifact Name = Redbox
Step 2 Created release definition
- Started from an empty template.
- Picked my build from a previous step.
- Added a deployment group phase task.
- Added “IIS Web App Deploy (Preview)” task.
- Created deployment group.
- Ran generated PowerShell script on my VPS hosting server.
- Specified website name: redboxnewrleases.com.
- Specified package folder using a browse button to point to package.zip: $(System.DefaultWorkingDirectory)/Redbox-CI/Redbox/package.zip).
- Set trigger for continuous deployment.
- Optionally modified release name format in General tab: Release-$(Build.BuildNumber))