More and more teams are using work management platforms like Jira and Azure DevOps to organize their work and manage data. Getting the most out of these tools is key to improving business performance and nudging your productivity up. That’s where the right solution for an integration, like a Jira Azure DevOps integration, comes into the picture.
Integrating the software you use to store business information can make your life much easier and your collaborations way more efficient. If your teams are well connected, then they can take advantage of everyone’s expertise and complement each other more effectively.
So in this guide, you’ll learn how to set up a Jira Azure DevOps integration following 6 straightforward steps.
Here’s an overview of what’s covered in this blog post:
- What are the Benefits of Integrating Jira and Azure DevOps
- How to Set up a Jira Azure DevOps Integration in 6 Steps
- Common Use Cases
What are the Benefits of Integrating Jira and Azure DevOps?
What is Jira?
Jira is a project management and issue tracking platform that lets you assign tasks to team members and track your progress.
It is highly customizable and suitable for teams working with a range of different software. It is particularly suited to teams using agile methodologies. You can create sprints, for example. It is a versatile tool though, and can handle many different use cases.
What is Azure DevOps?
Azure DevOps has a range of functions, including project management, version control, and build automation. It has features for teams using agile and waterfall methodologies.
Azure DevOps works well with Visual Studio and Eclipse, though can be used with other software as well. Its work item system can be used to represent bugs, issues or anything else you need.
Both Jira and Azure DevOps have a range of expansions that you can use to give them extra functionality that can be used to integrate them.
The Benefits of a Jira and Azure DevOps Integration
To make sure you get the most out of your integration, it is important to understand what your goals are. If you keep the potential benefits in mind when setting things up, you’ll be able to make sure the integration delivers everything it can.
Essentially, the integration is going to automatically sync data between your two platforms. This will help reduce work for both teams using the integration.
It prevents you duplicating information and potentially working on the same problems. It also allows you to take advantage of knowledge and research carried out by each other and helps you all work towards the same goals.
Sharing issues, but tailoring them to the needs of each team allows each team to work more efficiently. So you wouldn’t be distracted by unnecessary information, and you can add fields for your own exclusive use case.
There are three particular features to be taken into consideration when setting up a Jira Azure DevOps integration, or any other integrations:
Though you are connecting your teams together, you need them to be able to act separately and retain control over their own data and what and how they share it. They may also have security or legal concerns, especially if they’re handling customers’ critical data.
An integration should give both sides of the connection the ability to see what is being sent out and passed into their systems and to adjust what they need without consulting the other team. Decisions on what is shared should be theirs and they should be able to change how incoming data is used as required.
Even in well-designed systems, things sometimes go wrong so your solution needs to handle these problems gracefully. Any errors or changes should be detected and the integration should be able to recover without manual intervention.
Downtime is another unfortunate fact of life that we need to account for when integrating platforms. The solution needs to be able to recover when one or both sides of the integration become unreachable.
Your teams’ needs will change over time. Different projects often bring different ways of working. The data we collect from customers may broaden or lessen in scope.
Sometimes this means we’ll need to tune our fields. At other times we may need to share different things entirely. When you make these changes, our solution needs to handle them without fuss on either side.
The tool I’ve chosen here is called Exalate. Exalate was designed with these issues in mind and can deliver the smoothest integration possible. It gives your teams autonomy, enables them to work flexibly, and is reliable enough to handle errors.
Now that we’ve chosen our solution, let’s get down to setting up the sync.
How to Set up a Jira Azure DevOps Integration in 6 Steps
The first two steps are to install Exalate on both platforms. After that, you’ll connect the instances, and then you’ll see how information flowing between the instances can be controlled.
We’ll get to the step-by-step process of the Jira Azure DevOps integration, but if you don’t like reading, you can go ahead and watch this tutorial instead.
Step 1 – Install Exalate on Jira
The first step is to install Exalate on Jira. You need to know what version of Jira you’re using. This guide assumes you’re using Jira cloud, though you can also read a Jira Cloud installation guide in Exalate’s documentation. Otherwise, please take a look at this guide for Jira Server and Data Center users.
Sign in to your Jira account and then look for the cog at the upper right of the screen. Click it, and then click “Add-ons” in the menu. You may have to re-enter your login credentials as you’ve selected an admin function.
On the next screen, look at the left hand menu. If it isn’t already selected, click “Find new apps” under the “Atlassian Marketplace” heading. In the field that says “Search the Marketplace”, type “Exalate” and press return.
You should see the “Exalate Jira Issue Sync & more” app appear at the top. You may also see Exalate apps for other platforms, such as Azure DevOps, ServiceNow, and GitHub. Be sure to pick the correct one.
Click the blue “Free trial” button and you’ll be taken to “My Atlassian”. Enter your login credentials again if asked, then click “Apply license” when the popup appears. That will start your trial and take you back to Jira, where you’ll see a confirmation message.
Click “Get Started” to complete the installation on Jira.
Step 2 – Install Exalate on Azure DevOps
This guide focuses on marketplace installation, but you can also install it via Docker if you’re running your own server.
To install it via the marketplace, log in to Azure DevOps, then click the shopping bag icon at the top right of the screen. Select “Browse Marketplace”. Type “Exalate” into the search field and press return.
Click the “Exalate for Azure DevOps” app and then on the next screen, click the green “Get” button to activate the free trial.
You’ll be taken through an installation wizard. Select your organization from the dropdown box and click the “Install” button. Click “Proceed to organization” on the next screen and Exalate is installed.
Now you’ll need to get an evaluation license. To do this, look at Exalate’s left hand menu. Click “License details”, then click on “30-day-trial”.
A popup will appear. Enter your email address. Wait a few minutes, then check your email for a message with your evaluation key.
On the Exalate license details screen, click the green “License Key” button. Paste in the code you were sent in the email. Click “Update” and you’re done.
Step 3 – Connect Your Jira and Azure DevOps Instances
Now that you’ve installed Exalate on each platform, it’s time to connect them and set up the Jira Azure DevOps integration. You can initiate the connection from either platform. For this guide, I’ll start from the Azure DevOps side.
Log in, and then if you’re not there already, navigate to Exalate by clicking the marketplace icon, then “Manage extensions”, then clicking “Exalate” from the left hand menu under the “Extensions” heading.
In the Exalate menu, click “Connections”. You’ll see a list of any previously created connections, though if this is your first time here, there won’t be any. Click the green “Initiate connection” button at the top right to get started.
On the first page of the initiate connection wizard, you need to pick a connection type. If you’re not sure which is right for you, read this guide. Select the option appropriate for you, and then click “Next”.
Next, choose your destination URL. In this case, that’s the address of your Jira instance. If you were doing this step in Jira, you would use your Azure DevOps instance address instead.
Exalate does a quick check to detect if Exalate is installed on the node you entered. If so, more fields will appear. These let you name your connection and enter a description.
You can name each side of the connection, and the names are combined to generate a connection name. You can easily adjust this if you like.
There’s also a description field, which is optional. It is very useful to fill this in, however. Later you may have many connections, so the more information you can see about what each one does the better.
Fill the form in and try and make it as descriptive as possible. Then click “Next” to continue.
On the next screen, you need to pick a sync rules template. In later steps, you’ll see how to configure the connection in more detail, so for now you can just choose the simplest option, which is the default “Single project”. Click “Next” to continue.
Next you need to pick a project that will be synchronized with the other platform. Choose one from the drop down list, and then click the green “Initiate” button.
Exalate now generates an invitation code that you need to copy and paste from one platform into the other. Click “Copy invitation code” to copy it to your clipboard. It is best to paste it somewhere safe at this point, such as a text file.
Click “Done”. You’ll see the connection listed as pending on the connections screen.
Go back to Jira now, and navigate to the connections option by clicking the settings cog icon, then selecting “add-ons”, then clicking “Connections” from the left hand Exalate menu.
Jira’s connection screen looks pretty much the same as in Azure DevOps. One advantage of Exalate is it gives you a common UI across multiple platforms, so once it’s installed and you know how to use it, you can connect other platforms easily.
Click the “Accept invitation” button in the top right.
The “Accept invitation” screen has a large field for you to paste in the code you just generated in Azure DevOps. Do that, and click “Next”.
You’ll see a few options screens that look similar to the ones you saw when creating the connection. Select “Single project” again on the first screen, then pick a project from the drop down list to use for the synchronization.
You also have to name the connection. The names of the local and remote ends of the connection will be reversed from before, and a new name automatically generated, but again, you can change these and add a description to help you remember what the connection does later.
Click the “Confirm” button to finish setting up the connection. Now you can move on to the next steps, where you’ll learn how to control exactly what your integration does.
Step 4 – Configure Your Connection to Determine What Gets Shared
Exalate lets you modify each connection to decide exactly what gets copied to and from each side. It does that using scripting. If you are used to working with scripting or programming languages, you should find it very straightforward, but anyone can make changes with a little practice.
The Sync rules use the ‘Groovy’ scripting language. So if you’re familiar with that, this shouldn’t be too difficult. Otherwise, remember that you need to get everything right when working with a scripting language, but the rules aren’t too hard to follow when you get used to them.
Exalate is robust enough to handle mistakes, so don’t be afraid to experiment. If you get it wrong, you can always go back again and fix it.
To start making changes, have a look for your connection in the list, move the mouse over it, and click the edit icon which appears. This guide uses AzureDevOps, but the process is similar in Jira.
You can also click the remote button to go to the other side of the connection, or click the three dots to either delete or deactivate the connection.
On the edit connection screen, there are four tabs: “Triggers”, “Rules”, “Statistics” and “Info”. We’ll look at the rules in a second and the triggers in the next step.
The statistics tab gives you info on what items are being synced, and also tells you when synchronization last took place. The info tab gives you a few details about the connection, including the URL of the other side. These tabs are useful if you want to confirm your connection is working as intended.
For now, click on the “Rules” tab. You’ll see something like this.
At the top are a list of outgoing sync rules. These show how items in Azure DevOps are mapped to Jira. The incoming sync rules show how information from Jira is mapped to Azure DevOps items.
If you want to change what AzureDevOps sends over the connection, you edit the outgoing rules. The incoming rules let you change how the data from the connection is mapped onto the synchronized items.
Of course, if you are looking at this screen in Jira, those relationships will be reversed.
Looking at the rules, you may be wondering how to edit them. All you do is click in either box, edit the text, and then click the green “Publish” button in the top right when you’ve finished. Read this article on sync rules to learn more.
Looking at the outgoing rules, you can see that there are many fields like replica.key = workItem.key. That means the key field can be retrieved by the other side of the connection using the same name. If you don’t want to share any particular field, you can remove it, or replace it with something else.
To remove it, simply delete the line. If you want to share a specific value you could, for example, replace replica.status = workItem.status with replica.status = “from Azure DevOps”.
The Jira side will see incoming items with the status field set to “from Azure DevOps”. In a similar way, you could give a specific value to items in the incoming sync that you get from Jira. Perhaps you could change workItem.description = replica.description to workItem.description = “from Jira”.
If you want to assign items from Jira to a specific person, you can add a line to the incoming rules that says workItem.assignee = “Peter”.
You can also see commented code. Lines that begin with “//” and sections bound by “/*” and “*/” are comments. Comments are there as information and don’t affect the synchronization. You can copy and paste from a commented section to an uncommented section to activate particular lines, as well as remove the “//” from the start of commented lines.
You can also add “//” to the start of lines you don’t want to deactivate them. That’s a useful alternative to deleting them, as it means you can easily reactivate them by removing the comment slashes.
There are all sorts of ways you can edit the sync rules to make them more useful to you. After you’ve been working with your integration a while, you might have new ideas for how to refine it, so it can be worth coming back to make further edits and improve your workflow.
Step 5 – Set Up Automated Synchronization Triggers
Next, click on the “Triggers” tab. This screen lets you create triggers that decide which items are shared by the connection. The triggers are written in work item query language or WIQL. Here’s a guide to it.
As well as using the edit connections page to reach the synchronization triggers, there’s also a dedicated entry for them in the left hand menu. The interface in that case is almost the same, with the exception that you can see the connection as a separate entry in that list.
Click the white “Create trigger” button to create your new trigger. There are several fields on the screen. At the top, you can select the type of entity the trigger will deal with. In the large field with “If” at the top, you enter a WIQL query that selects the items you want.
For example, [Work Item Type] = ‘Task’, will select items with the type “Task”. You can base the query on any of your item’s fields. You can also create multiple conditions for a trigger using logical operators.
If you write [Work Item Type] = ‘Task’ AND
[System.AssignedTo] = ‘Kirsty’, you’ll sync items that meet both of those conditions.
Have a look at the documentation to get an idea of what you can do, and try modifying the rules to work with the fields you want.
Below that, there’s a notes field. Here you can write a description explaining what the trigger does, and why it is there. As with the connection description, adding detail here can potentially make life easier for you later.
There’s also an “Active” switch, which you’ll need to activate if you want the trigger to work. This switch makes it easy to turn the trigger on and off without having to delete, or redo it.
When you’re ready, click the “Add” button, and your new trigger will be created, and added to the list.
You can add as many triggers as you like, giving you fine control over what kinds of items are shared. They can be activated or deactivated easily, and modified whenever you need.
Step 6 – Start Synchronizing Tasks
Now your connection is ready and items will be shared between the platforms according to the rules you have defined. If you create new items that match your rules, they will be synced, as will existing rules that meet the same criteria.
Exalate will show you how many items have been synced on the connections screen. Synchronization doesn’t happen immediately, so please wait a few minutes if you don’t see the exchange take place.
Common Use Cases for a Jira Azure DevOps Integration
Jira and Azure DevOps are both versatile platforms adaptable to a wide range of business needs. Let’s take a look at a few situations where a Jira Azure DevOps integration could be useful. These examples will give you ideas, but your situation may be different. Hopefully, you will have your own ideas for how an integration can work.
Backend and frontend developers
In medium to large-sized software projects, different teams usually focus on different parts of the product. You may have a team of backend developers handling your database and business logic, while frontend developers focus on the website, apps, and user experience.
These teams will sometimes have to handle common issues, and will both collect information on them. Sometimes a bug or issue might need to be diagnosed and it may not be clear where it originates. Perhaps a new feature needs work done on the backend and frontend. In these cases, information on relevant issues can be synchronized.
You can copy the whole issues from one system to another, or copy particular fields. You can use labels, or any other field to define which issues you need to share, so that both teams are able to make information available to each other as needed. Each team can decide what they send, and decide how incoming information is entered into their own system.
Customer service and engineering teams
Your customer service team handles customer feedback. A lot of that will include problems and bugs that need to be solved by your engineers. The customers will want to know about any solutions or fixes that can be applied, so will need some feedback.
You don’t necessarily want the engineers talking to customers directly, so here the customer service team acts as a filter, handling most issues themselves, and passing on problems they can’t solve. They may modify feedback to make it more customer friendly, and store it so they can handle the same problems again without needing to contact engineering.
An integration can help make sure that each team gets the data presented in the way it needs and enables them to take advantage of the other team’s data when they need it. You can send the fields they need to be aware of, and keep the information they don’t need out of their way.
Marketing and design teams
Your marketing team conducts research to find out what your customers want. Your design team will assess what they ask for and try to deliver it in your product. As with the previous situation, you are collecting data from customers and passing it on to a team that needs to use the information.
Here, the designers don’t need to provide customers with feedback on any issues they raise, but the marketing team might need to know what ideas the design team has to solve problems and conduct further research on how customers react to them.
There may also be things customers want that aren’t possible for budget or technical reasons, and it is useful for marketing to know this, so they can focus their research on more useful areas.
Your integration can help handle the flow of information between the teams. The marketing team’s results get sent to the designers and the designers can pass their findings back to the marketers. They can do this in the form of new issues, or comments on the existing feedback.
With a Jira Azure DevOps integration, your teams can share information effortlessly. With an effective integration tool, you can let teams get on with things without having to worry about downtime or problems. Your teams can both make changes and control what the integration does, making it evolve along with their needs.
As well as Jira and Azure DevOps, you can use Exalate to integrate other platforms, such as ServiceNow, GitHub, Zendesk, and more. The more connected your teams are, the easier it is to get them all pushing in the same direction.
You may also want to read this ebook on cross-company integration to learn more about sharing information between companies.