Where is my version 1.23 deployed? or How to manage multiple versions across multiple environments?

Introduction

In this article we describe the complexity of managing release cycles of complex IT solutions that comprise of a number of Apps, Service and/or Microservices. In particular, we will touch base on release management of such solutions across multiple development, integration and Geo-distributed production environments. Among the possible solutions for this challenge we will consider Jira standard tools as well as the Jira add-on built for it.

Challenge

It’s not new to any R&D organization or IT department that every version/release before it reaches the production environment should go through a certain software development lifecycle. Some stages of this lifecycle directly linked to specific environments where necessary actions are taken. It could be even vice-versa - the environment itself dictates the state of the lifecycle. The picture below depicts a possible example:

1.png

Multi-version releases

Things become slightly more complicated when the solutions we are trying to deliver are comprised of multiple Apps, Services and/or Microservices. We will not discuss the task of how we can manage multiple version releases as it is well covered in the following article - Efficient Release Management of Microservices Based Solution. We will take this as read. Instead, we will focus on Environments.

Most  complex solutions are technically decoupled so that individual components can, theoretically, be delivered independently, as shown in the example below.

2.png

But reality is that usually some of these components are tied to each other when it comes to delivering features that go through multiple layers, e.g.

  • ITSec requirements to upgrade Login API requiring changes in iOS App and PWA,
  • PCI DSS requirements require changes in all four components.

So, there are integration points that need to be followed and multiple components should “meet” within integration environments for end to end testing. Therefore, as Release Manager, you should watch out for them and ensure they arrive in the appropriate environment, in-time for end-to-end tests.

Multiple environments

The real complexity for any Release Manager happens when the company decides to deploy their multi-component solutions across different Geo-locations. Why would you go there? Fortunately or unfortunately, there are numerous of reasons for you to get there regardless of whether or not  your business is B2B or B2C, namely:

  • There might be regulatory requirements like “Legal data should stay within the  EU“ or “Customer data should not leave the USA“.
  • You might decide to have a proper DR site with active/passive or active/active mode. “Proper“ means something further than the next room in the same data centre.
  • You might decide to have your point of presence closer to your partners (B2B) or end users (B2C) as the speed of services is playing a more and more important role and you don’t want to waste time due to latency between the partner/user location and your services hub.
  • As a B2B company, you might not control the destination environment yourself and instead, you simply deliver your solutions to a partner-hosted infrastructure.

So, probably the previous workflow needs to be extended and will possibly look like the following:

3.png

Getting it meshed

For the Development, Testing and Integration Environments it's common practice to have multiple versions of software running on it simultaneously. At the very least, you want to have “Current“ and “Next“ deployed there. When it comes to production, having multiple versions of the same software components is a reality.  Here are few reasons for that:

  • When delivering a new release of a multi-component solution, it is too bold to create it across all of your environments at once. You probably want to switch new features on, move a percentage of your traffic to a new functionality, justify it works as expected, cross check the non-functional metrics and give the green light for further rollout. This just takes time.
  • you might also wait days/weeks for your version to be approved by regulatory bodies (B2G) or your partners (B2B)
  • as a B2B provider you might get dozens and hundreds of partners. Rolling out to all of them takes time.
  • you may have included a particular extension to suit a specific client/regulation and there is no need to disrupt other clients in different parts of the world as they can easily wait for the next version containing something more relevant for them.

So, all the above takes time. Your developers are not sitting idle. And by the time you are halfway through with rolling out the previous version, a new version needs to be delivered “today“ because some client is waiting and “we are committed”.

To make a long story short, like it or not, we are very quickly getting into a situation involving different environments running different versions of different components of our solution.

We can't change that. But at any single point of time we need to know:

  • Where is a specific version of a specific component deployed, and where is it not?
  • What is the current version of a particular component (e.g. Login API) now deployed within a  specific environment (e.g. Production Hub in Pennsylvania).

Solution

We are looking for a solution that will help us track how our version jumps between different environments throughout the development lifecycle and understand when it reaches “first“ productions and “others” during the rollout routine. Thus, we can answer the question of “what’s deployed and where”?

Suggested approach

Since a  version goes through a  lifecycle and jumps from one environment to another, why not create a custom workflow for it? Jira standard functionality is limited to 2 version statuses - Released/Unreleased. So, we need to extend it:

“Version” deserves a workflow.

We also need to reference all environments and/or any particular one. Therefore,

“Environment” needs an entity to identify and refer.

As a result, the two should be connected in a many-to-many relationship, to empower Release Managers with

“Dashboards” and/or “Confluence” pages to answer the question of “what’s deployed where”?

Let’s put our words into action

Test Project: Mobile Apps relying on some Core APIs and Services

As an example we took the above Mobile App project.

Mobile App has an iOS version that we deliver through App Store. We also have Progressive Web App (PWA) that we target on Android devices and deploy per DataCenter (DC) in Pennsylvania, Indiana and Texas.

4.png

Let’s add some context …

iOS app version 1.26 was just submitted to the App Store after a successful Apple review, while with version 1.27 we started grooming to kick off Development Sprints.

5.png

PWA for Android version 1.34 was just deployed on our servers residing in Pennsylvania, Indiana and Texas while version 1.35 is half way through Development Sprints.

“Login Api” v1.23 is deployed on Production in Pennsylvania and Texas. For Indiana we had to do some extensions and create additional Jira version to accommodate a set of stories and technical tasks. The version is currently on UAT. Next version - “Login Api” v2 is on the way, and  going through performance testing in our NFR Lab

For “Payments Hub“ we have longer versions and v2.34 just came to hardening sprint. But for our Apps release we required some of the stories completed in Sprint 1 out of 4. So we created a service pack ”v2.33.SP1” on top of the previous version and deployed on Production in Pennsylvania and Texas. For Indiana, we yet again had to do some extensions so “Indiana“ specific version of service pack was deployed.

6.png

Option A: Jira Standard Tools

Inspired by 6 steps to better release management in Jira Software article, we created a new “Process Management“ project in Jira with 2 issue types - Task and Sub-task. These two represent our Versions and Sub-versions respectively where Sub-versions are mainly used  “minor” versions, representing customization carried out per each production environment and/or service release.

The workflow looks like the following

7.png

We intentionally did not complicate it with multiple transitions and restrictions on those transitions that “probably“ will be a task for any real-use case.

The obvious next step for us, was to add a Kanban board to visualize the flow of our versions jumping from status to status. Here’s what we have got:

8.png

We created versions from the above examples as Tasks and Sub-tasks specifying Release date as Due date. We also added “Overdue” filter and appropriate color coding to attract attention.

The Drawback of this solution is that we have to create versions manually, sync the names and release/due dates on a regular basis so our board depicts an up-to-date view.

To make this job easier we added a link to a standard Jira version details page so we can always navigate to any specific version & check what’s changed.

9.png

Job half  done. Let’s see how we can specify Environments. We considered few options for this:

  • use “Labels”
  • multi-select / check-boxes “Custom Field”
  • new IssueType with own workflow and option to use standard links to map Versions and Environments 

For the sake of this example, we decided to proceed with “Custom Field”. The only compromise we had to make was to put abbreviations instead of human readable names as we wanted to outline it on the cards. See below

10.png

Let’s try to configure some Dashboards now to show how different versions are deployed across different environments.

11.png

This could be extended with much more sophisticated gadgets in a real-use case, but for our needs, it is good enough to answer the question we have put to ourselves.

Option B: Release Management Add-On

For organizations that operate hundreds and thousands of versions, the time required to create version tickets manually as well as sync names/due dates upon each and every change is essential. Therefore, we added this functionality into our add-on - Release Management for Jira. Let’s see how we can do the same use case with it.

Following the Quick tour we created Release board and extended Jira standard version statuses with custom workflow as outlined below

12.png

As a result, our test example on Release board looks like the following:

13.png

The cards on the board represent Jira standard versions mapped to Released/Unreleased statuses. Therefore,  moving versions through our workflow, we automatically adjust the status in Jira. Color coding indicates the progress of the version. Thus we eliminate the manual work required for synchronization, which we had to do in the previous section.

By clicking on the card, we get a  proprietary Version Details screen that compared  to the standard Jira view, has much more sophisticated capabilities to

  • track & act on version
  • manage scope
  • check code changes
  • specify environments

14.png

We can also check out a timeline view that gets us a very nice visualization of our versions in timeline.

15.png

Release Management for Jira has a notion of Environment that we used to list all our Development and Production Environments & “color“ them accordingly. You can also specify some of the environment details like Environment spec, URL, access credentials and additional comments, which we found very useful.

17.png

Following that, we noticed that our version cards have colored pin points indicating the environments it was/is deployed to. By clicking on a version card and choosing the Environments tab we can see it in all detail.

18.png

We also created a test Dashboard to see what we could get out of the Gadgets provided by the Release Management Add-on. Thus, we decided to check what’s deployed in Pennsylvania and when “Login Api“ v1.23 is deployed:

19.png

This can now be extracted into some Confluence pages, but we decided not to go that far.

Wrap-up

In this article we outlined that managing multiple versions across multiple environments is a challenge we can’t avoid. But there is a solution to it. All we need is to:

  • Define version workflow
  • Find the way to define Environments in Jira and make the link between versions and environments
  • Create Dashboard/Confluence to visualize “multiple versions across multiple Environments“

We tried to implement the above steps with Jira standard tools, as well as our add-on (Release Management for Jira). I hope this has given you a few insights useful for your own real--use case.

Also, we would love to hear about your experiences,  if you have tried something similar or have better suggestions. Just leave comments for this article.

Thank you for reading. Stay tuned!

BTW, is it available for Jira Cloud?

Following Atlassian visionary movement to the cloud we released our Cloud App in early 2020. In the latest version we added support for deployment “Environments”. So, now also in cloud you can manage multiple versions across multiple Environments.

3 comments

Comment

Log in or Sign up to comment
Neil Hunt April 9, 2020

Thank you for providing this detailed article. My question is, in either of the two cases you mentioned, how do represent a version that is a dependency of multiple releases? For example, I have releases for two products coming up and I have an upgrade to some library that is required by both of those products' new releases. It seems to me that component version workflows should live separately from the releases; whereas in Release Management for Jira, while a version can be associated with multiple Releases, its status needs to be tracked in each one of them individually. Am I thinking about this correctly?

Like Yuri Kudin likes this
Yuri Lapin _Release Management_
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
April 9, 2020

Hi Neil,

Thanks for reaching out!

I am one of co-authors of the article. Let me try to answer.

Our general recommendation is to keep 2 products you mentioned in 2 separate Jira projects. Apparently, the common trend right now is to go even further and to give couple of teams responsible for a single domain a standalone project so they can configure own workflows and setting they like. This is how Atlassian envisage Next Gen project for Jira Cloud. 

This is awesome for teams but it's a challenge for Program/Delivery and Release Managers to aggregate and present end-to-end picture and track progress of it.

With regards to your question ...

  1. if you use standard Jira tools and create your custom "Change Management" project we suggest to use parent/child issue types (like Epic/Story or Tast/sub-task) to emulate Cross-Project Release / Jira Version relationship. Thus you can link "child" to versions from different versions and "parent" will represent your Release. You will be able as well to track "child's" within the "parent" either using Jira standard tools.
  2. if you use Release Management App you get it our of the box. Release (Package in Cloud version) is a container for multiple project versions that you can track as one deliverable. You can use swimlane view or timeline view to check the project of your 2 products upgrades in scope of one deliverable.

Hope this help.

If not give us a shout.

Cheers,

Yuri.

Neil Hunt April 11, 2020

Thanks for the reply. My question was around what if my version is part of multiple Release/Packages? However, internally we are essentially agreeing to track a particular version only with one Release/Package and assuming we are able to do that (which presumably was your intention) then this should be fine.

TAGS
AUG Leaders

Atlassian Community Events