Build and Deploy Microsoft Dynamics 365 projects using VSTS – part III

This is the third and last article telling the tale of our own DevOps for Microsoft Dynamics 365, and the technology behind it.

Part I – Background and how our DevOps tools evolved before we knew about it
Part II – Automation of the build and deploy process using custom VSTS Build Tasks
Part III – Demo of complete build and release definitions taking you from A to Z
After the first two articles we have now got a handful custom VSTS Build Tasks to help us take the build and deployment automation all the way. This final article demonstrates how we do that with VSTS builds and releases. Finally raising the questions of why we did all this and where to go from here.

A complete VSTS Build for Microsoft Dynamics 365

image_thumb113Below is a sample of a full build process that not only builds and packs a new CRM solution, but updates the individual assemblies and webresources in DEV environment, exports solutions and data, and then publishes the files exported from DEV together with Shuffle Definitions and Package Definition, which is the resulting build artifact.

Apply version

The task Apply Build Version to assemblies is actually the classic sample build task that is published by Microsoft in a tutorial on how to create build tasks. We have just added one thing; the semantic version number extracted from the build number is also saved to a file in the root working folder on the build machine. This file is picked up by the Shuffle Export task, if option “Set version” has been checked on the step. This way, the same version that VSTS Build is composing will be set on all solutions before export. image_thumb121


The artifacts published includes files matching the following patterns:ResourcesSolution*.xml
ResourcesDeploy*.cdpkg The results is that Shuffle Definitions, solution files exported, Shuffle data files, and Package Definition for the CRM Deployer are included as artifacts. No binaries are included, except for the ones zipped within the solution files. The artifacts we are interested in are the files we can use to deploy the project to new or existing environments.

Combining builds to composite VSTS Releases

A Release is typically composed of the result of several builds. In this demo case we want to create a release to be deployed to test environments for a project called “MMS MUA”. This project has two of our products as prerequisites: Cinteros Utils and CEM. I will create three Environments as targets for this release; one to create the cdzip package that is the distributable for deployment, and automated deployment to two other dev environments, where managed MMS MUA is a prerequisite.


So the Release Definition consumes three artifacts according to the picture below. All these are results of builds set up similar to the example above. image_thumb106

CDZIP Environment

The cdzip packages are simply zipped files containing the Package Definition (cdpkg), the Shuffle Definitions (xml) and the data (xml) and solution (zip) files. So composing these packages can easily be done using existing utility tasks in VSTS. First, the files to pack are copied to a “pack folder”. image_thumb101 This is done in the same way for all three artifacts. After that, the files are packed using the built in Archive Files task. image_thumb96 Finally, the cdzip file is uploaded to a FTP site that has been defined under the Services in VSTS. From this FTP folder the distributable can be picked up and distributed for deploy using the CRM Deployer. image_thumb89

CRM Environments

When performing an automated deploy from VSTS to a CRM environment, we simply run the same Shuffles as we did during Build, but reversed. And for all artifacts included. image_thumb84 To simplify setting up several environments, a Task Group has been created for each source artifact/product. The Task Groups accept one parameter only, the connection string to CRM. This connection string is defined as an Environment specific variable, and the password is marked as Secret, so that it will not be visible in any logs or other outputs from the deploy. image_thumb79

Task Groups

Using Task Groups is an easy way to combine several Tasks to be executed in the same way for several different Environments in the Release Definition. Task Groups can have a set of variables defined, that can be filled with different information for each environment. In our case, we have the CrmConnection parameter for these Task Groups, to specify how to connect to each CRM environment. The tasks for the task groups are very simple, just two instances of the Shuffle Import task. The first one imports solutions in the artifact, and the second one the data. image_thumb66

Why go our own way?

This is of course a question we have asked ourselves more than once, and a question we should continue to ask regularly. Using the functionality released by Microsoft is always the first option, as it keeps us focusing on what we really do (delivering awesome enterprise scale systems empowering our customers’ users and improving their processes and quality, etc yada yada sales talk) instead of spending time on our own support systems. But most of our tools have been created when there was no alternative from Microsoft, and when we still thought that creating our own tools and having full control over them is better than jumping on either open sourced toolkits or paid solutions. Having worked out our processes, implementing our flavors of solution management, configurability, products and toolkits for CRM, we have been able to tailor our support systems to do what we need, in the way we need it. Given all the benefits of the “not our responsibility” attitude you can assume when using official tools from Microsoft, and the “sharing is caring” possibilities of open source, you really have to be confident that the time you spend on internal tools is worthwhile. So far, the time has been well spent.

Where do we go from here?

image205Having said that our time has been well spent, going further and offering our version of ALM and CI for Microsoft Dynamics 365 on VS Marketplace is definitely an option today.

image204Another option is going completely open source on GitHub, which I currently feel is more probable.

That of course depends on if there is any interest from other parties out there. I am fully aware that our methods might just raise an eyebrow or two, and then fade into oblivion. If you are interested in more details about our methods and tools, don’t hesitate to contact me on Twitter @rappen, in the comments below, or send me an e-mail.

EDIT: These DevOps tools have now been published as “Public Preview”! Read the article here:

7 thoughts on “Build and Deploy Microsoft Dynamics 365 projects using VSTS – part III

  1. Hi Jonas,
    Second time in a day. i am really interested in understanding details of your solution and how all bit and pieces of puzzle come together. not only that how you can source control the data because at the end of the day most configurations in CRM are data or metadata.
    your series of articles are awesome but in some areas your flying really high for people who wanna implement your masterpiece in their world, example the build tasks are they already in VSTS marketplace. where is your solution deployer and what happened to your solution in last article of your series as it’s never been used. hope you will answer some of those areas.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.