Forum Discussion

tejabhutada's avatar
tejabhutada
Copper Contributor
May 26, 2025

How to sync sprints between Atlassian Jira and Microsoft Azure DevOps?

Teams involved in a sprint need to be able to exchange information in real time. This will keep all stakeholders and team members in perfect sync. 

Let’s say the connection is between a team of developers handling work items in Azure DevOps and the IT team using Jira Cloud for service management.

To make all updates on one system reflect on the other one, both Jira Cloud and Azure DevOps need to be connected.

In the absence of native integration solutions, tools like Exalate can bridge the gap between both platforms.

Let me show you how teams can sync sprints between Jira and Azure DevOps.

What to consider when syncing sprints between Jira and Azure DevOps? 

The first thing to bear in mind when syncing Azure DevOps and Jira is security. Considering that both sensitive data will be flowing between the systems, there should be measures to keep the information safe at rest and in transit.

Protocols like tokenization, pseudonymization, and firewalls will keep data secure from unauthorized users. Other features like authentication, endpoint detection, and role-based access controls can bolster your security.

With security nailed down, pay attention to the flexibility of the integration solution. As the number of tickets increases, the integration should be able to handle the network demands.

Due to the dynamic nature of sprints, the tool connecting Jira Cloud and Azure DevOps should also have the scalability to handle an increase in ticket volumes. 

Another thing to check for is customization. The more sync options and custom connectors available, the broader the application of use cases.

How to sync sprints between Jira and Azure DevOps? 

Assuming you want to sync a Jira sprint with Azure DevOps. Let’s break down what this entails from a technical standpoint.

 

The connection should support data synchronization between standard fields (comments, attachments, etc.) and custom fields.

 

If a sprint gets created in Azure DevOps, it should be automatically replicated on the Jira side with the same information.

 

Issues created in Jira should be channeled to the correct sprint with the iteration path value from Azure DevOps. 

 

A custom field named “Team” (Azure DevOps side) should sync to a custom select field called “ADO Team” (Jira side).

 

If any new values are added to the custom field on the Azure DevOps side, these should also be dynamically created on the Jira side.

Exalate also supports AI-powered Groovy scripting for setting up syncs between Jira and Azure DevOps. You can use it to set up a two-way integration as well as event triggers for real-time sync and bulk operations. 

 

First, install it on both Jira and Azure DevOps. Follow this step-by-step Getting Started guide to connect both of them. 

 

This use case can only work with the Exalate Script Mode, which allows you to configure the sync however you want. 

 

Open Exalate in your Azure DevOps dashboard, go to the connection you want to edit, and click on the “Edit connection” icon. 

 

You have two options: 

Outgoing sync (on the Azure DevOps side) refers to the data being sent over to Jira. 

Incoming sync (on the Jira side) refers to the data to be received from Azure DevOps.

 

Here is the code to control what fields and entities go out from Azure DevOps as part of the sprint [Azure DevOps Outgoing sync]:

 

def res = httpClient.get("/<<project_name>>/<<team_name_in_ADO>>/_apis/work/teamsettings/iterations",true)
def flag = 0
int i = 0
for (;i<res.value.size(); i++){
  if (res.value[i].path == replica.iterationPath){
      flag =1
      break
  }
}
if (flag == 1){
  replica.customKeys."sprint_name" = res.value[i].name
  replica.customKeys."sprint_start" = res.value[i].attributes.startDate
  replica.customKeys."sprint_end" = res.value[i].attributes.finishDate
}

 

The code snippet uses httpClient to fetch the iteration path and uses the flag to assign the name of the sprint (sprint_name), the start date (sprint_start), and the end date (sprint_end).

 

Let’s check out the code to control what’s coming into the Jira Cloud project in the sprint [Jira Cloud Incoming Sync].

 

def list = httpClient.get("/rest/agile/1.0/board/3/sprint")
int flag = 0
for (int i=0; i<list.values.size(); i++){
  if (list.values[i].name == replica.customKeys.'sprint_name')
      flag = 1
}
String startDate, endDate;
if (flag == 0){
  if (replica.customKeys."sprint_start"){
      startDate = replica.customKeys."sprint_start".trim()
      startDate = startDate.replaceAll("Z",".000+05:00").trim();
  }
  if (replica.customKeys."sprint_end"){

      endDate = replica.customKeys."sprint_end".trim()
      endDate = endDate.replaceAll("Z",".000+05:00").trim();
  }
  def res = httpClient.post("/rest/agile/1.0/sprint", "{\"name\": \"${replica.customKeys.'sprint_name'}\", \"startDate\": \"${startDate}\", \"endDate\": \"${endDate}\", \"originBoardId\": boardId}")
}
def res = httpClient.get("/rest/agile/1.0/board/"Board id"/sprint")
for (int i=0; i<res.values.size(); i++){
  if (res.values[i].name == replica.customKeys.'sprint_name')
      issue.customFields.Sprint.value = res.values[i].id
}

 

Similar to the Azure DevOps incoming sync snippet, this code fragment fetches the sprint startDate and endDate as customKeys. The httpClient uses POST and GET methods to point to the path or the board containing the sprint name.

 

Congratulations! You have successfully synced your Jira sprint with Azure DevOps.

Triggers for the Sync

Azure DevOps users can use the Work Item Query Language to configure triggers in Exalate.

 

[Work Item Type] = 'Task' AND System.TeamProject = 'SprintMarch'

 

This triggers the synchronization of any work item (task) in the project named “SprintMarch”. 

 

On Jira Cloud, triggers are available via Jira Query Language.

 

project = SprintMarch AND labels = sprint

 

This trigger starts the synchronization if any issue in the project “SprintMarch” has been updated with the label “sprint”.

 

If you still have questions or want to see how Exalate is tailored to your specific use case, discuss your use case with us. 

No RepliesBe the first to reply

Resources