Migrating from Jira to Azure DevOps

As far as I’m concerned, a team can use any tool they want to track their work items and planning. But, my personal favourite is Azure DevOps. Currently I’m helping some teams moving their Jira projects to DevOps and this blog explains how you can do this, too!

Uniformity and standards

For several reasons it can be frustrating if teams use multiple tools for the same purpose. For sake of uniformity, I believe it is best to have standards within your company. In the case of my current customer, that standard is Azure DevOps.

Obviously you want to migrate your work from the old to the new platform. Azure DevOps has the ability to use APIs to ingest data, and you can export Jira as well. To do this manually and figure out all the moving parts, you will have quite a challenge.

Enter Solidify

I was pointed to a really great tool by the team of Solidify, the Jira to Azure DevOps work item migration tool.

The Jira to Azure DevOps work item migration tool lets you export data from Jira and import it as work items in Azure DevOps or Microsoft Team Foundation Server

This sounds exactly like what we need! Because every project is different, it can be tricky setting up all the mapping of statuses, and figuring out how to connect to the correct instances.

The documentation of the tool is great, but this blog will give a step-by-step approach on how to do a migration.

Getting the tool

The Github link in the beginning of this post is the starting point for all documentation of the tool. To download the release directly, point your browser to solidify/jira-azuredevops-migrator/releases.

Preparing for your Jira export

The Github repo contains samples at this location. Worth noting is that the setup of the configuration file is essential. See the first few lines of the file below:

"source-project": "MyJiraProject",
"target-project": "DevOps Project Name",
"query": "project = 'MyJiraProject'",
"workspace": "C:\\Temp\\JiraExport\\",
"epic-link-field": "Epic Link",
"sprint-field": "Sprint",
"download-options": 7,
"batch-size": 20,
"log-level": "Info",
"attachment-folder": "Attachments",
"user-mapping-file": "",
"base-area-path": "",
"base-iteration-path": "",
"ignore-failed-links": true,
"process-template": "Agile",

As you can see, the source and target fields correspond with your data in Jira and DevOps respectively. The process-template field corresponds to what you have setup in DevOps, like CMMI, Scrum or Agile (or Basic).

Next to setup, are the mappings. As you might know, some tasks, statuses or other properties differ in Jira and DevOps. Let’s say you have a Task in Jira with status Review. You might not have the same status in DevOps, so you want to map that to another status type. The same goes for types like ‘User Story’ or ‘Epic’:

"type": [
{
   "source": "Feature",
   "target": "Feature"
},
{
   "source": "Epic",
   "target": "Epic"
},
{
   "source": "Story",
   "target": "User Story"
},
{
    "source": "Bug",
    "target": "Bug"
},
{
    "source": "Task",
    "target": "User Story"
},
{
    "source": "Sub-task",
    "target": "Task"
}
]

Within the configuration file, you should specify all these mappings. If you fail to add one, the export tool will generate an error, so you can add the missing mapping and re-export Jira.

Running the Jira Export tool

If the config file is setup, you can run the tool using the following command:

jira-export.exe -u p.rombouts@yourdomain.com -p api-token-here --url https://yourinstance.atlassian.net --config config.json

As you can see I’ve setup the command using the API token. Please refer to this page on how to get an API token for Jira. In theory a password should work, but it did not work in my case.

Inspecting the export results

When the tool runs, you will see results directly in your CLI interface:

$ jira-export.exe -u username -p apitoken --url https://something.atlassian.net --config config.json
Jira Exporter v2.2.25
Copyright (c) Solidify
Wow, there's a newer release out (v2.2.31)! We recommend downloading it for latest features and fixes.
[I][10:12:11] Connecting to Jira...
[I][10:12:11] Retrieving Jira fields...
[I][10:12:12] Retrieving Jira link types...
[I][10:12:12] Export started. Exporting 705 items.
[I][10:12:13] Initializing Jira field mapping...
[I][10:12:14] Processing 1/705 - 'Item-790'.
[W][10:12:14] Could not find user 'someuser1@yourdomain.com' identity in user map. Using original identity 'someuser1@yourdomain.com'.
[W][10:12:15] Could not find user 'someuser2@yourdomain.com' identity in user map. Using original identity 'someuser2@yourdomain.com'.
[I][10:12:15] Processing 2/705 - 'Item-789'.

As seen in the above start of the export, some users could not be found in the mapping. This is done on purpose by me; I want the exact same users from Jira to be used in Azure DevOps. Optionally you could create a users.txt file, and map users in Jira to different users in Azure DevOps. If any fields or mappings are missing, you will also see this in your console.

Bonus: In the export directory specified in the config tool, the output is also saved to a file called something like jira-export-log-190809-101211.txt. So you do not need to save the output yourself and just let it roll!. The export can take quite some time, so sit back and grab a coffee.

Running the Azure DevOps Import tool

If the previous step completed without any mishaps, and all looks OK in the log file, you can import your Jira exported data into Azure DevOps.

Again using the same config file, you can run the following command:

wi-import --token personal-access-token-here --url https://yourorganisation.visualstudio.com --config config.json --force

As you can see I’ve setup the command using the Personal Access Token. Please refer to this page on how to get one for Azure DevOps.

Again this tool will provide you with verbose information, and will also dump a logfile to the same folder as where the Jira export resided.

If everything went OK; you are now good to go in Azure DevOps!

Finalizing and cleaning up

Process wise it is smart to plan this ahead, with your team. You should have a cut-over date, and make sure that access to the old Jira project is read-only, or turned off, after you’re done exporting/importing. You do not want to maintain two boards for a team!

Conclusion

Hope you find this manual useful, the tool helped me out a great deal. The documentation is excellent and it is actively maintained by the fabulous team of Solidify. Can’t thank you guys enough!

16 thoughts on “Migrating from Jira to Azure DevOps”

  1. Hi Peter,
    I am trying to migrate WI from Jira to ADO but status is not getting updated in the files which got exported.
    It is showing only New & Active other status is showing as null.
    Can you please help me out with the issue.

    Like

    1. When the export is done, carefully look at the files that have been created. You can examine those, and check whether the statuses and other attributes are what you expect them to be. You have to create the mapping for statuses that are not in the default settings.

      Like

    2. {
      “source”: “Status”,
      “target”: “State”,
      “for”: “Bug”,
      “mapping”: {
      “values”: [
      {
      “source”: “OPEN”,
      “target”: “New”
      },
      {
      “source”: “IN PROGRESS”,
      “target”: “Committed”
      },
      {
      “source”: “CLOSED”,
      “target”: “Done”
      }
      ]
      }
      },

      This is how i have mapped.
      In jira the status is closed but in ADO it is showing as NEW or TO DO

      Like

    3. You should check the output files before you import them. Those files will show how you import into devops. You can check if the mapping was correct, and if that is so, check your devops settings and make sure it is OK. Also during import the warnings should be looked at. Or look at the output log for errors and warnings.

      Like

  2. Hie Peter,
    I have started migrating the WI from Jira to ADO but the status is going work. It is taking only 2 values New & Active it is showing Null value. Can you please help me to resolve the issue.

    Like

  3. Hey! I am using scrum process. How to create requirement based test suites in hierarchy. I want a product backlog test suite & then all related child links as child suites. Is this possible!!?

    Like

  4. I have migrated work items successfully from jira to azure. At azure items are reflecting at work item menu but not at boards. I have used scrum process. Epics, product backlog items are there but not listing at boards. What should I do?

    Like

    1. Yes Peter! Thanks. Area path & Iteration path need to be configured at both project & team configuration. I was missing it from team configuration and so facing issue.

      Liked by 1 person

  5. Can we use the steps outlined here to migrate from Jira core to Azure DevOps Server

    Like

    1. Hi Gaurav,

      The documentation states ‘Export Jira issues from Jira queries, Map users from Jira to users in Azure DevOps/TFS, Migrate work item field data, Migrate links and attachments, Migrate history’.
      I think Core is something that is not exported, only work-items/issues.

      Kind regards,
      Peter

      Like

  6. Do you know of any straightforward way to migrate the wiki from Confluence to Azure DevOps?

    Like

    1. Hi Jeremy, thank you for your reply. I did not find any quick way of migrating Confluence. Basically the Wiki is alot more simple. One way is to export Confluence to Word or PDF and then convert it to MarkDown. This is not a trivial task, but I haven’t seen any automated ready-to-use tools unfortunately.

      Like

  7. peter, even we are in the process of migrating Jira projects to Azure DevOps so that we end up using one ALM tool at the end of the day and your article is definitely helpful. Btw, what tool did you guys use to migrate ‘Releases’ history from Jira to ‘Azure DevOps’?? Azure DevOps don’t have releases similar to ‘Jira’ (the ‘Releases’ service that is in Azure DevOps is more for code deployment)

    Liked by 1 person

Comments are closed.