A robust and efficient Python script to migrate issues from Jira to Azure DevOps, ensuring data integrity, formatting consistency, and seamless integration. This script automates the migration process, saving time and effort for teams transitioning between platforms.
- Formats Jira descriptions to be more structured and readable.
- Converts Jira markdown syntax to a format compatible with Azure DevOps.
- Ensures all rows are processed without loss of information.
- Translates Jira priorities (
Lowest
,Low
,Medium
,High
,Highest
) to Azure DevOps priority levels (4
,3
,2
,1
).
- Dynamically detects all attachment columns in the source CSV file.
- Extracts valid attachment URLs while filtering out timestamps, IDs, and filenames.
- Consolidates multiple attachments for each issue and embeds them into the refined description.
- Automatically embeds the original Jira issue link in the Azure DevOps description for reference.
- Converts Jira timestamps to ISO 8601 format, ensuring compatibility with Azure DevOps.
- Supports 300+ issues while maintaining high performance.
- Utilizes efficient CSV parsing and streaming to prevent memory issues.
- Python 3.8 or higher.
- Required Python libraries:
chardet
.
-
Clone the repository:
git clone https://github.com/MohamedSci/Jira-to-Azure-DevOps-Migration-Script.git cd Jira-to-Azure-DevOps-Migration-Script
-
Install dependencies:
pip install -r requirements.txt
-
Place your input files (
default_fields.csv
andall_fields.csv
) in theinput
directory.
jira-to-azure-devops-migration/
├── src/
│ ├── __init__.py
│ ├── data_processor.py # Processes and transforms data
│ ├── file_handler.py # Handles file I/O operations
│ ├── logger.py # Configures logging
│ ├── migration.py # Orchestrates the migration process
│ └── utils.py # Utility functions (e.g., cleaning descriptions)
├── input/
│ ├── default_fields.csv # CSV with default fields
│ └── all_fields.csv # CSV with all fields (including attachments)
├── output/
│ └── azure_output.csv # Generated output file
├── index.py # Entry point for the script
├── requirements.txt # List of dependencies
├── README.md # Project documentation
└── .gitignore # Specifies files to ignore in Git
-
Ensure your input files (
default_fields.csv
andall_fields.csv
) are placed in theinput
folder. -
Run the script:
python index.py
-
Check the output file (
azure_output.csv
) in theoutput
folder.
Issue key | Summary | Assignee | Reporter | Priority | Status | Created | Updated |
---|---|---|---|---|---|---|---|
PROJ-123 | Test issue | John Doe | Jane Doe | High | Open | 11/Mar/25 1:31 PM | 11/Mar/25 1:31 PM |
Issue key | Description | Environment | Attachment |
---|---|---|---|
PROJ-123 | Test issue | Production | 11/Mar/25 1:31 PM;712020:ae3212cd-e1d6-4083-bc70-ddd6dfebfad6;cash receipt report.mp4;https://microtec.atlassian.net/rest/api/3/attachment/content/16380 |
The script generates a cleaned and formatted CSV file (azure_output.csv
) containing:
Work Item Type | Title | Assigned To | Created By | Priority | State | Created Date | Changed Date | Description |
---|---|---|---|---|---|---|---|---|
Bug | Test issue | John Doe | Jane Doe | 3 | Open | 2025-03-11T13:31:00 | 2025-03-11T13:31:00 | ### Description\nTest issue\n\n### Environment\nProduction\n\n### Original Issue\nView in Jira\n\n### Attachments\nhttps://microtec.atlassian.net/rest/api/3/attachment/content/16380 |
We welcome contributions! Here’s how you can help:
- Fork the repository.
- Create a new branch:
git checkout -b feature/your-feature-name
- Commit your changes:
git commit -m "Add your feature"
- Push to the branch:
git push origin feature/your-feature-name
- Open a pull request.
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
For questions, issues, or feature requests, please:
- Open an issue on GitHub.
- Email us at muhammedsaidsyed215@gmail.com.