Jira to Azure DevOps: Practical Migration for Engineering Teams
Migrating from Atlassian Jira to Azure DevOps is rarely a simple platform swap. Experience shows that mishandled migrations lead to broken links, orphaned workflows, and team confusion—often for months. Here’s a practical approach for technical leads and DevOps engineers aiming to preserve velocity and ensure data integrity when converting project tracking infrastructure.
Core Drivers for Migration
Three scenarios crop up repeatedly:
- Full-stack Microsoft adoption: Azure DevOps offers native integration with Azure Cloud, Git repos, pipelines, and artifacts—notably smoother than gluing Jira to the same.
- Cost reduction: For some orgs (>100 users), Azure DevOps’ licensing structure is leaner than bundled Atlassian Cloud offerings.
- Unified toolchain pressure: IT prefers a consolidated CI/CD and project management flow under one SSO umbrella.
Switching for novelty’s sake is a mistake; business case should be explicit.
Migration Constraints: Issues You Can't Ignore
- Data granularity: Jira’s issue links, sprint history, attachments, and comments. Each field needs clear mapping or acceptance of loss.
- Workflow translation: Azure Boards supports fewer custom states/transitions versus the labyrinthine Jira flows some PMOs love. No perfect one-to-one mapping exists.
- Cutover downtime: Even a "zero downtime" plan translates to, at best, an hour where updates are frozen or risk non-sync.
- End-user retraining: Expect resistance and friction, particularly for QA and PMs reliant on Jira plugins not found in Azure DevOps.
Stepwise Technical Migration Workflow
Step 1: Inventory and Map Jira Assets
Export a full schema:
# Atlassian CLI
acli --action getProjectList
acli --action getIssueList --project "FOO" --outputFormat csv > issues.csv
Document:
- Each project’s workflows—status, transitions, rules.
- Custom fields, labels, resolutions.
- List of all active plugins (e.g. ScriptRunner, Zephyr).
Tip: Archive obsolete Jira projects first; migrated dead configs waste time.
Step 2: Choose an Import Method
No universal tool fits all. Common options:
- Manual CSV export/import:
Jira → CSV → Azure DevOps import UI
Suitable for simple projects. Loses watchership, history granularity, and some attachments. - MigrationTools (e.g. nkdAgility/azure-devops-migration-tools):
Handles more field mapping, but requires .NET Core >=3.1 and fine-tuned JSON mapping files. - OpsHub Integration Manager:
Commercial tool—handles high-volume projects, supports incremental sync, but hefty learning curve and cost. - Custom Python scripts via REST API:
For edge cases (e.g., Jira sub-tasks to Azure parent/child, or re-parenting bugs).
Known issue: CSV import sometimes mangles date fields; always spot-check date parsing post-import.
Step 3: Azure DevOps Pre-Configuration
- Provision projects and boards.
- Reproduce mapped workflows. For example:
Jira Status | Azure Boards State |
---|---|
To Do | New |
In Progress | Active |
Blocked | Custom (Add) |
Code Review | Review |
Done | Closed |
- Script creation of custom fields:
# Azure DevOps CLI
az boards work-item-type field create \
--organization "https://dev.azure.com/YOURORG" \
--project "MyProject" \
--work-item-type "User Story" \
--name "Customer Impact" \
--field-type "string"
- Permissions: Set up project-scoped security groups (avoid granting Project Collection Administrator unless truly required).
Step 4: Incremental Dry Runs
- Select a low-value legacy project; attempt full migration.
- Validate:
- Issue count parity (
Jira = 476 / Azure DevOps = 476
) - Attachments visible (esp. on epics, not just tasks)
- Comments, timestamps
- Parent-child, duplicate, and relates-to links
- Issue count parity (
Quick SQL for cross-verification if using on-prem Jira:
SELECT COUNT(*) FROM jiraissue WHERE project='FOO';
Compare to Azure Boards query results.
Step 5: User Training & Change Management
-
Build concise, side-by-side cheat sheets:
Jira (Cloud 9.4) Azure DevOps (2022 Q1) Create Issue (c) New Work Item (n) Transition via Drag & Drop State Dropdown Only Bulk Edit (Excel Export) Bulk Edit via Query + Multi-edit -
Record short demos showing workflow, filters, notifications.
-
Roll out in waves (pilot group first, e.g., QA leads).
Step 6: Final Cutover
- Freeze Jira changes. For cloud: set "browse-only" permissions.
- Migrate delta issues updated in last X days (known lag source).
- Notify teams of expected downtime (~60 min typical for <1000 issues).
- Execute:
- Automated batch migration scripts
- Spot-check high-profile issues in both systems
Rollback Plan: Have Jira backup snapshot (<12h old), and a tested revert process (can be manual CSV restore if all else fails).
Example: SaaS Project Migration – Practical Results
Migrated a 300-issue SaaS repo (Jira v8.19.1 to Azure DevOps 2022 Q4). Used MigrationTools with the following pitfalls:
- Attachment errors:
.png
files failed on API upload due to size limits.- Workaround: batch-resize attachments before migration.
- State mapping:
- "Ready for Deploy" state ignored; required manual mapping in a post-import script.
Downtime: 67 minutes. One critical bug found post-migration—a time zone offset meant comments showed out of order for one week (fixed with a batch API patch).
Migration Checklist
Step | Detail | Done (✓) |
---|---|---|
Audit Jira workflows | .xml/.csv exports complete | |
Select + test migration tool | Full dry run | |
Prepare Azure Boards | Custom fields mapped | |
Migrate incrementally | Validate attachments/links | |
User comms + documentation | Cheat sheets, demos | |
Final freeze + delta migration | Downtime scheduled | |
Post-migration review | Weekly feedback |
Final notes:
- Attachments >10MB: Expect failures—pre-filter or automate upload scripts.
- Automation rules: Jira Automation and Azure DevOps Rules differ; reimplement automations after migration.
- Audit permissions post-migration: Default Azure DevOps groups can expose more than IT expects.
Alternatives exist—some teams elect to run Jira/Azure DevOps in parallel (painful, but possible) for a limited time. But a hard cut is usually less error-prone in the long run.
For in-depth scripts or assistance with edge-case Jira plug-in data (e.g., Zephyr test cases), get in touch—have reusable Python snippets and .NET configs on hand from past work.
Migration is never perfect, but with careful planning and attention to detail, most failures become minor annoyances rather than career-defining headaches.