---
title: "VSTS Release Management: Deployment Orchestration vs Deployment Mechanism"
description: "Learn more about VSTS release management: deployment orchestration vs deployment mechanism."
image: https://blogs.incyclesoftware.com/hubfs/Visual-Studio-Team-Services.png
---

# VSTS Release Management: Deployment Orchestration vs Deployment Mechanism

Posted by Daniel Mann - February 14, 2018

- [**](https://www.facebook.com/sharer/sharer.php?u=https://blogs.incyclesoftware.com/vsts-release-management-deployment-orchestration-vs-deployment-mechanism)
- [**](https://www.linkedin.com/shareArticle?mini=true&url=https://blogs.incyclesoftware.com/vsts-release-management-deployment-orchestration-vs-deployment-mechanism&title=&summary=&source=)
- [**](https://twitter.com/home?status=)
- [**](mailto:?&subject=https://blogs.incyclesoftware.com/vsts-release-management-deployment-orchestration-vs-deployment-mechanism&body=https://blogs.incyclesoftware.com/vsts-release-management-deployment-orchestration-vs-deployment-mechanism)

**

![header-picture](https://blogs.incyclesoftware.com/hubfs/Incycle%202017%20website%20resources/Visual-Studio-Team-Services.png "header-picture")

Since Microsoft released the re-write of Release Management in the form of the Release hub in VSTS, I've been dealing with a lot of legacy migrations and implementations of new release definitions. Based on what I've been seeing, I've arrived at a conclusion:

Release definitions should serve as* deployment orchestrators*, not as the deployment mechanism itself.

What do I mean by this? Simple, really. When creating a release definition, you have the option to build out your deployment any way you want from the in-the-box tasks, from tasks available on the marketplace, and from tasks you write and manage yourself. You also have the ability to write and run any script your heart desires, as long as you can figure out a way to get it into your release artifacts. Using a release definition as a deployment orchestrator means minimizing the number of deployment-activity related tasks you use, instead preferring to run scripts you write and manage yourself in order to perform your environment configuration and application deployment.

To put it as a very high level, the guideline is that the only tasks you should be using within a release definition are ones that either get binaries and deployment scripts pushed to a target machine (such as '*Windows Machine File Copy*') and tasks that actually kick off a deployment script or take a direct deployment action ('*PowerShell on Target Machines*', or one of the tasks for DACPAC deployment or WebDeploy).

Environment-specific configuration values should be stored in source control and applied to your configuration files via your deployment scripts, at the time of deployment, instead of coming out of release or environment-level variables.

I'll give you 5 good reasons why.

- Versioning
- Transparency
- Testability
- Maintainability
- Auditability

## Versioning

Simply put, we want to have one place to find everything about our application. Not just the code, but also anything responsible for provisioning environments (infrastructure as code), configuring environments (configuration as code), and deployment of the application.

Release definitions are versioned... separately from your application code. That is exactly the opposite of what we want! If the question is, "How was this version of the application deployed?", the way you answer that question should be "look at the build output, it's all in there." It shouldn't be, "Look at the build output, then figure out what releases were done from that build, then find the release that made it to the stage you're troubleshooting, then click around through a bunch of tabs to look at different values". Even if you see something that looks weird, you're not going to be able to test it, since you can't test a deployment without creating a release. More on that in a bit.

As your applications grow and evolve, your release definitions will, as well. By using an excessive number of release tasks to perform your deployment, you risk losing out on the ability to understand and replicate how older versions of your software were deployed, and you lose the ability to deploy an older version of your application using the exact same method and configuration parameters that it was originally deployed with.

## Transparency

Tasks are a black box. You use them, but you don't know exactly what they do. The code for the Microsoft-provided tasks is on GitHub, but you have to know that in the first place. The exact usage of the tasks is locked up in the release definition itself, far away from the application code that is being deployed.

I always try to think of on-boarding a new developer. If they have to be told to look in a bunch of different places to understand how the application builds and deploys, we have a transparency problem. We want to minimize the number of different systems that contain critical application information, and maximize the transparency of those systems. Everything else a developer is doing is in source control... why would we keep critical information about our deployment process separate?

## Testability

If a task fails, you can't easily hook a debugger up to it and step through the code. You can't even necessarily easily replicate the inputs or state. The only way to troubleshoot a failing task, really, is to rerun the release and hope for the best. The answer to the question, "Is this change going to break my deployment process?" should never be, "I don't know, let's see what happens when we run it."

## Maintainability

The old RM server had a similar problem: Big, complex release definitions are hard to maintain. The more tasks you have, the more copy-and-paste you'll be going through, the harder it gets to reorganize, and the harder it becomes to have a mental model of exactly what your deployments are doing. The configuration variable management is limited enough to be problematic. It's impossible to reorganize configuration variables, you can't copy and paste the key/value pairs easily, you can't search and replace them easily, etc. Task groups and variable groups start to help mitigate this problem, but it's still not great, especially since variable groups can't (at the time of this writing) be applied at an environment level. A release definition with more than 5 or 6 tasks in a given environment pretty quickly becomes a big pain to maintain, and the more granular your tasks are, the worse it gets.

## Auditability

Who changed the deployment process this weekend? Why are these configuration values incorrect, and how long have they been incorrect for? What values did we release this to production with last summer? All of these questions are trivially answered if the source for your deployment is source control. All of these are much more difficult to answer if you have to rely on the limited auditing/diffing capabilities built into the release definition editor.

## Final words

Now, with all of that said, there are exceptions.

If you have a really simple application that doesn't need the additional complexity of following this approach, then don't do it! Do whatever is fastest and easiest!

If you're deploying to non-infrastructure hosting (such as containers or Azure Web Apps), different practices may apply. I'm hoping to coalesce my thoughts around those types of scenarios a bit and write a more in-depth blog.

 Topics: [Principles and Practices of DevOps](https://blogs.incyclesoftware.com/topic/principles-and-practices-of-devops), [DevOps](https://blogs.incyclesoftware.com/topic/devops)

---

### Recent Posts

By InCycle - 14 February, 2018

#### InCycle Wins Prestigious Microsoft Global Partner of the Year Award

[![read more](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/arrow-recent-blog-post.png "read more")](https://blogs.incyclesoftware.com/incycle-wins-prestigious-microsoft-global-partner-of-the-year-award)

By InCycle - 14 February, 2018

#### Top 5 Questions On Elevate for App Modernization

[![read more](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/arrow-recent-blog-post.png "read more")](https://blogs.incyclesoftware.com/top-five-questions-on-elevate-for-app-modernization)

By InCycle - 14 February, 2018

#### GitHub Universe 2025 Top Announcements

[![read more](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/arrow-recent-blog-post.png "read more")](https://blogs.incyclesoftware.com/github-universe-2025-top-announcements)

---

### Subscribe to Blog

### ![2025 Microsoft Partner of the Year Winner: InCycle Software](https://blogs.incyclesoftware.com/hs-fs/hubfs/InCycle%202025%20Microsoft%20PoY%20Badge.png?width=377&height=223&name=InCycle%202025%20Microsoft%20PoY%20Badge.png)

### About this blog

Since 2002, InCycle has been providing challenging thought leadership to help customers successfully combine modern application designs, IT platforms and DevOps practices to achieve new levels of success. As a leader in app modernization, these blogs are written by our expert consultants and provide useful information to help on your journey to the cloud and better software. Happy reading!

### Platform Engineering Webinar on Demand

PE deep dive and demo!

[![Learn More!](https://no-cache.hubspot.com/cta/default/707613/aae0556f-2d26-4ce4-9b32-e7bebd443c9a.png)](https://cta-redirect.hubspot.com/cta/redirect/707613/aae0556f-2d26-4ce4-9b32-e7bebd443c9a)

### Recent Posts

### Migrating to GitHub?

Start with a GitHub Migration Strategy and Roadmap (at no cost!)

[![Learn More!](https://no-cache.hubspot.com/cta/default/707613/312dc03f-1f78-4907-aaaf-3c0aa3cccd8f.png)](https://cta-redirect.hubspot.com/cta/redirect/707613/312dc03f-1f78-4907-aaaf-3c0aa3cccd8f)

### Posts by Topic

- [Blog (194)](https://blogs.incyclesoftware.com/topic/blog)
- [Video (32)](https://blogs.incyclesoftware.com/topic/video)
- [Azure (25)](https://blogs.incyclesoftware.com/topic/azure)
- [DevOps (20)](https://blogs.incyclesoftware.com/topic/devops)
- [GitHub (13)](https://blogs.incyclesoftware.com/topic/github)
- [InRelease (12)](https://blogs.incyclesoftware.com/topic/inrelease)
- [Containers (11)](https://blogs.incyclesoftware.com/topic/containers)
- [release management (11)](https://blogs.incyclesoftware.com/topic/release-management)
- [AKS (10)](https://blogs.incyclesoftware.com/topic/aks)
- [CI/CD (10)](https://blogs.incyclesoftware.com/topic/ci-cd)
- [Kubernetes (10)](https://blogs.incyclesoftware.com/topic/kubernetes)
- [Azure DevOps (9)](https://blogs.incyclesoftware.com/topic/azure-devops)
- [Migration (9)](https://blogs.incyclesoftware.com/topic/migration)
- [Platform Engineering (PE) (9)](https://blogs.incyclesoftware.com/topic/platform-engineering-pe)
- [GenAI (8)](https://blogs.incyclesoftware.com/topic/genai)
- [Microsoft Azure (8)](https://blogs.incyclesoftware.com/topic/microsoft-azure)
- [Visual Studio (8)](https://blogs.incyclesoftware.com/topic/visual-studio)
- [tfs (8)](https://blogs.incyclesoftware.com/topic/tfs)
- [Awards (7)](https://blogs.incyclesoftware.com/topic/awards)
- [Big Data (6)](https://blogs.incyclesoftware.com/topic/big-data)
- [Innovation (6)](https://blogs.incyclesoftware.com/topic/innovation)
- [Microsoft (6)](https://blogs.incyclesoftware.com/topic/microsoft)
- [agile (6)](https://blogs.incyclesoftware.com/topic/agile)
- [vsts (6)](https://blogs.incyclesoftware.com/topic/vsts)
- [Data (5)](https://blogs.incyclesoftware.com/topic/data)
- [Modernization (5)](https://blogs.incyclesoftware.com/topic/modernization)
- [App Modernization (4)](https://blogs.incyclesoftware.com/topic/app-modernization)
- [Automated Testing (4)](https://blogs.incyclesoftware.com/topic/automated-testing)
- [Data & AI (4)](https://blogs.incyclesoftware.com/topic/data-ai)
- [Event (4)](https://blogs.incyclesoftware.com/topic/event)
- [MLOps (4)](https://blogs.incyclesoftware.com/topic/mlops)
- [Modern Apps (4)](https://blogs.incyclesoftware.com/topic/modern-apps)
- [Visual Studio 2017 (4)](https://blogs.incyclesoftware.com/topic/visual-studio-2017)
- [DevTest (3)](https://blogs.incyclesoftware.com/topic/devtest)
- [Events (3)](https://blogs.incyclesoftware.com/topic/events)
- [Governance (3)](https://blogs.incyclesoftware.com/topic/governance)
- [VSO (3)](https://blogs.incyclesoftware.com/topic/vso)
- [Data Analytics (2)](https://blogs.incyclesoftware.com/topic/data-analytics)
- [Docker (2)](https://blogs.incyclesoftware.com/topic/docker)
- [Integration (2)](https://blogs.incyclesoftware.com/topic/integration)
- [Microsoft Connect (2)](https://blogs.incyclesoftware.com/topic/microsoft-connect)
- [Mobile Development (2)](https://blogs.incyclesoftware.com/topic/mobile-development)
- [RM (2)](https://blogs.incyclesoftware.com/topic/rm)
- [SQL (2)](https://blogs.incyclesoftware.com/topic/sql)
- [SaaS (2)](https://blogs.incyclesoftware.com/topic/saas)
- [TFS 15 Preview (2)](https://blogs.incyclesoftware.com/topic/tfs-15-preview)
- [TFS 2017 (2)](https://blogs.incyclesoftware.com/topic/tfs-2017)
- [Uncategorized (2)](https://blogs.incyclesoftware.com/topic/uncategorized)
- [Visual Studio 2015 (2)](https://blogs.incyclesoftware.com/topic/visual-studio-2015)
- [Xamarin (2)](https://blogs.incyclesoftware.com/topic/xamarin)
- [ADX (1)](https://blogs.incyclesoftware.com/topic/adx)
- [AI (1)](https://blogs.incyclesoftware.com/topic/ai)
- [Android (1)](https://blogs.incyclesoftware.com/topic/android)
- [Application Monitoring (1)](https://blogs.incyclesoftware.com/topic/application-monitoring)
- [Apps (1)](https://blogs.incyclesoftware.com/topic/apps)
- [BI (1)](https://blogs.incyclesoftware.com/topic/bi)
- [Brian Harry (1)](https://blogs.incyclesoftware.com/topic/brian-harry)
- [Cloud Azure (1)](https://blogs.incyclesoftware.com/topic/cloud-azure)
- [Cloud Services (1)](https://blogs.incyclesoftware.com/topic/cloud-services)
- [Connect (1)](https://blogs.incyclesoftware.com/topic/connect)
- [Connect 2016 (1)](https://blogs.incyclesoftware.com/topic/connect-2016)
- [Consultants (1)](https://blogs.incyclesoftware.com/topic/consultants)
- [Cosmos DB (1)](https://blogs.incyclesoftware.com/topic/cosmos-db)
- [Data Center (1)](https://blogs.incyclesoftware.com/topic/data-center)
- [Development (1)](https://blogs.incyclesoftware.com/topic/development)
- [EA (1)](https://blogs.incyclesoftware.com/topic/ea)
- [Git (1)](https://blogs.incyclesoftware.com/topic/git)
- [Hybrid (1)](https://blogs.incyclesoftware.com/topic/hybrid)
- [IntelliTes (1)](https://blogs.incyclesoftware.com/topic/intellites)
- [IntelliTest (1)](https://blogs.incyclesoftware.com/topic/intellitest)
- [Lab Management (1)](https://blogs.incyclesoftware.com/topic/lab-management)
- [Live Unit Testing (1)](https://blogs.incyclesoftware.com/topic/live-unit-testing)
- [Load Testing (1)](https://blogs.incyclesoftware.com/topic/load-testing)
- [MSDN (1)](https://blogs.incyclesoftware.com/topic/msdn)
- [MSTest (1)](https://blogs.incyclesoftware.com/topic/mstest)
- [MTM (1)](https://blogs.incyclesoftware.com/topic/mtm)
- [Machine Learning (1)](https://blogs.incyclesoftware.com/topic/machine-learning)
- [Media & Entertainment (1)](https://blogs.incyclesoftware.com/topic/media-entertainment)
- [Microsoft Visual Studio (1)](https://blogs.incyclesoftware.com/topic/microsoft-visual-studio)
- [Microsoft nationally managed partner (1)](https://blogs.incyclesoftware.com/topic/microsoft-nationally-managed-partner)
- [NUnit (1)](https://blogs.incyclesoftware.com/topic/nunit)
- [OpsHub (1)](https://blogs.incyclesoftware.com/topic/opshub)
- [PaaS (1)](https://blogs.incyclesoftware.com/topic/paas)
- [Pipelines (1)](https://blogs.incyclesoftware.com/topic/pipelines)
- [PowerShell (1)](https://blogs.incyclesoftware.com/topic/powershell)
- [Principles and Practices of DevOps (1)](https://blogs.incyclesoftware.com/topic/principles-and-practices-of-devops)
- [Programs (1)](https://blogs.incyclesoftware.com/topic/programs)
- [RC (1)](https://blogs.incyclesoftware.com/topic/rc)
- [Release Candidate (1)](https://blogs.incyclesoftware.com/topic/release-candidate)
- [SQL Databases (1)](https://blogs.incyclesoftware.com/topic/sql-databases)
- [SQL server (1)](https://blogs.incyclesoftware.com/topic/sql-server)
- [SSDT (1)](https://blogs.incyclesoftware.com/topic/ssdt)
- [Software (1)](https://blogs.incyclesoftware.com/topic/software)
- [Subscription & Billing Management (1)](https://blogs.incyclesoftware.com/topic/subscription-billing-management)
- [TFS 15 (1)](https://blogs.incyclesoftware.com/topic/tfs-15)
- [TFS 2015 update (1)](https://blogs.incyclesoftware.com/topic/tfs-2015-update)
- [TFS 2016 (1)](https://blogs.incyclesoftware.com/topic/tfs-2016)
- [TFS ALM (1)](https://blogs.incyclesoftware.com/topic/tfs-alm)
- [TestMethods (1)](https://blogs.incyclesoftware.com/topic/testmethods)
- [UI (1)](https://blogs.incyclesoftware.com/topic/ui)
- [UX (1)](https://blogs.incyclesoftware.com/topic/ux)
- [VS2017 (1)](https://blogs.incyclesoftware.com/topic/vs2017)
- [Validation (1)](https://blogs.incyclesoftware.com/topic/validation)
- [Virtual Machines (1)](https://blogs.incyclesoftware.com/topic/virtual-machines)
- [WPC 2016 (1)](https://blogs.incyclesoftware.com/topic/wpc-2016)
- [Web (1)](https://blogs.incyclesoftware.com/topic/web)
- [Windows (1)](https://blogs.incyclesoftware.com/topic/windows)
- [World Partner Conference (1)](https://blogs.incyclesoftware.com/topic/world-partner-conference)
- [XUnit (1)](https://blogs.incyclesoftware.com/topic/xunit)
- [alm (1)](https://blogs.incyclesoftware.com/topic/alm)
- [automation (1)](https://blogs.incyclesoftware.com/topic/automation)
- [build (1)](https://blogs.incyclesoftware.com/topic/build)
- [code (1)](https://blogs.incyclesoftware.com/topic/code)
- [nationally managed partner (1)](https://blogs.incyclesoftware.com/topic/nationally-managed-partner)
- [sql server 2008 (1)](https://blogs.incyclesoftware.com/topic/sql-server-2008)
- [unit testing (1)](https://blogs.incyclesoftware.com/topic/unit-testing)
- [vm (1)](https://blogs.incyclesoftware.com/topic/vm)

[see all](https://blogs.incyclesoftware.com/vsts-release-management-deployment-orchestration-vs-deployment-mechanism#)

### Blog Archive

- [November 2012 (17)](https://blogs.incyclesoftware.com/archive/2012/11)
- [September 2025 (14)](https://blogs.incyclesoftware.com/archive/2025/09)
- [October 2014 (12)](https://blogs.incyclesoftware.com/archive/2014/10)
- [July 2012 (10)](https://blogs.incyclesoftware.com/archive/2012/07)
- [October 2012 (9)](https://blogs.incyclesoftware.com/archive/2012/10)

- [**](https://twitter.com/incyclesoftware?lang=en)
- [**](https://ca.linkedin.com/company/incycle-software)
- [**](https://www.facebook.com/InCycleSoftware/)

### About us

At InCycle, we believe there is always a better way and today, that includes the cloud.

[![InCycle Microsoft Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/Incycle%202017%20website%20resources/logo-InCycle-New-white.png?width=200&name=logo-InCycle-New-white.png "InCycle Microsoft Partner")](https://www.incyclesoftware.com/)

### Learn more

- [Why Incycle?](https://www.incyclesoftware.com/why-incycle)
- [Success Stories](https://www.incyclesoftware.com/customer-success-stories)
- [Events](https://www.incyclesoftware.com/events)
- [Careers](https://www.incyclesoftware.com/careers)
- [About](https://www.incyclesoftware.com/about-incycle-software)

 

### 1-800-565-0510 [info@incyclesoftware.com](mailto:info@incyclesoftware.com) 

### ![Microsoft GitHub Verified Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/GitHub%20Verified%20Partner%20-%20white-SQUARE.png?width=256&height=57&name=GitHub%20Verified%20Partner%20-%20white-SQUARE.png) ![Data & AI Solutions Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/Data%20%26%20AI%20Solutions%20Partner.png?width=125&height=144&name=Data%20%26%20AI%20Solutions%20Partner.png) ![Digital & App Innovation Solutions Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/Digital%20%26%20App%20Innovation%20Solutions%20Partner.png?width=125&height=144&name=Digital%20%26%20App%20Innovation%20Solutions%20Partner.png)

 

© 2025 InCycle Software

[Privacy policy](https://www.incyclesoftware.com/privacy)

**

![](https://px.ads.linkedin.com/collect/?pid=302756&fmt=gif) ![](https://px.ads.linkedin.com/collect/?pid=302756&fmt=gif)

```json
{
  "@context" : "https://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Daniel Mann",
    "url" : "https://blogs.incyclesoftware.com/author/daniel-mann"
  },
  "datePublished" : "2018-02-14T19:07:42.000Z",
  "headline" : "VSTS Release Management: Deployment Orchestration vs Deployment Mechanism",
  "image" : [ "https://blogs.incyclesoftware.com/hubfs/Visual-Studio-Team-Services.png" ],
  "mainEntityOfPage" : {
    "@id" : "https://blogs.incyclesoftware.com/vsts-release-management-deployment-orchestration-vs-deployment-mechanism",
    "@type" : "WebPage"
  },
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "url" : "https://blogs.incyclesoftware.com/hubfs/logo-InCycle-New-Blue---transparent.png"
    },
    "name" : "InCycle Software Inc."
  }
}
```