Switching from Jira

Bring your projects, issues, epics, sprints, comments, time and files over from Jira Cloud or Jira Data Center, check it before anything is written, and take it back if you want to.

Overview

The importer is part of Resourcecloud (Admin → Data Import, for RC Admins). You export your Jira data into one file, upload it, tell Resourcecloud what each Jira thing becomes, look at what would happen, and start. It runs in the background and reports what it did.

Before you start

Jira and Resourcecloud words

In JiraIn ResourcecloudNote
ProjectTeam + solutionThe team decides who sees the tasks, the solution what the work belongs to. Chosen per project in the mapping.
Issue (Task, Bug, Story, …)TaskThe task type comes from the mapping (Bug → Bugfix, …). A Jira Story becomes a task of type Story.
Sub-taskSubtaskBelongs to its task and takes that task's type, unless you choose another.
EpicEpicIn Resourcecloud an epic holds stories and a story holds tasks, so each epic gets a story of the same name that holds its tasks.
Story (issue type)Task of type Story
or a Resourcecloud story
The default is a task. You can map an issue type to a Resourcecloud story instead (a container for tasks) in the mapping.
BoardThe team's Kanban board and sprint planningBoards themselves are not copied; they decide which team a sprint belongs to.
Workflow, statusStages of the team's boardCategory To Do → Assigned (not started), Done → the task is closed, In Progress → a stage you choose (proposed: Working).
SprintSprintName, goal, dates, and whether it is closed, active or in the future. Tasks go into the sprints they were in.
Story pointsStory pointsRounded to whole numbers.
Original estimateEstimated timeTasks without an estimate get 10 minutes, as in the API.
WorklogTime entryBooked on the person who logged it, on their day. Needs a matching user (see below).
PriorityPriority: normal or highHighest, High, Blocker, Critical, Major, Urgent → high. Changeable per priority.
CommentCommentWith the original author and date.
AttachmentFileTaken from the zip.
Reporter, assigneeCreated by, assigned toMatched by e-mail, then user name.
Resolved, resolution dateDone, done dateA task whose status is mapped to "Done" is closed on its resolution date.
DescriptionDescriptionConverted to formatted text. Unsafe markup is removed.

1. Export from Jira

Jira has no "export everything" button, so use the script that comes with Resourcecloud: tools/jira_export.py. It asks Jira's REST API (it only reads) and writes one zip with projects, issues, comments, worklogs, attachments, boards, sprints and people.

  1. Jira Cloud:
    python3 jira_export.py --url https://acme.atlassian.net \
        --user [email protected] --token "$JIRA_TOKEN" --projects ABC,DEF
  2. Jira Data Center / Server:
    python3 jira_export.py --url https://jira.acme.com \
        --token "$JIRA_TOKEN" --projects ABC,DEF
    (a personal access token; or --user and --password)
  3. Leave --projects out to export every project the account can see. Put secrets in the environment (JIRA_USER, JIRA_TOKEN, JIRA_PASSWORD) so they do not end up in your shell history.
  4. The result is a folder jira-export/ and jira-export.zip. A README.txt inside says what was exported.

Useful options. --no-attachments leaves files out. --max-attachment-mb 200 skips larger files. --delay 0.5 pauses between requests on a busy Jira. --cafile trusts an internal certificate. Run it again with the same --out to carry on: files already downloaded are not fetched again.

The script waits when Jira asks it to slow down, completes the comment and worklog lists that Jira's search cuts short, never sends your credentials to any other host (Jira Cloud serves files from one), and stops with a clear message if the credentials or project keys are wrong.

Your own export. The importer reads what Jira's REST API returns: pages of search results, sprint and board pages, user lists, as .json, .jsonl, .gz or a .zip of these. If you already have such files, upload them as they are. Attachments go into the zip as attachments/<id>/<file name>; the importer finds them by Jira's attachment id.

2. Upload

  1. Open Admin → Data Import and drop the zip on the box (or click it to choose the file).
  2. The file is sent in pieces of 4 MB with a progress bar. Size does not matter. If the connection drops, the page tries again by itself; if you close the page, open the import from the list, choose the same file and it carries on where the server stopped.
  3. When the last piece is in, Resourcecloud reads the file in the background ("Reading the export…") and the mapping opens.

If Resourcecloud sits behind a reverse proxy that limits request bodies (some default to 1 MB), pieces of 4 MB are refused. Raise the limit for /backend/import_upload to at least 8 MB.

3. Map

The mapping screen lists everything that needs a decision, with how often it occurs. Everything is already proposed from what exists in Resourcecloud; read it, change what is wrong, and press Check. Back to the proposal undoes your edits.

TabYou decide
Issue typesWhat each Jira issue type becomes: task, subtask, Resourcecloud story or epic, and the task type. Types that do not exist (such as Story) are created if you allow it under Options.
StatusesThe stage for each Jira status: Assigned (not started), Done (closed) or a stage of the team. A stage the team does not have: tasks go to Assigned, unless you allow adding stages.
PrioritiesNormal or high.
ProjectsTeam, solution and (for a new solution) company per Jira project. Matched by name when possible.
PeopleWhich Resourcecloud user each Jira person is. Filter, show only the people nobody matched, search for a user, choose Me (comments are attributed to you), Nobody, or Create a user.
OptionsWhat may be created, and what to import (comments, worklogs, attachments, sprints).

People nobody matches

Creating users and teams

Off by default. An RC Admin can allow it with the switch on the overview page of the importer; the importer then offers Create a user and Create a virtual team. Created users are inactive, cannot sign in until you activate them, and do not count as licensed seats meanwhile. Created teams are virtual teams that get the stages their issues need and the people who work in them as members. The switch is checked again when the import runs.

4. Check and start

  1. Check saves the mapping and runs a dry run. It writes nothing. It shows, per kind, how many objects would be new, changed or unchanged, what would be created besides the work (task types, solutions, teams, users, stages), and what needs a look: people nobody matches, stages a team does not have, parents or epics that are not in the export.
  2. Errors (a project without a team, say) are shown per row and must be fixed. Warnings can be accepted.
  3. Start import asks once more. The import runs in the background; you can close the page.

5. Report and result

While it runs you see a progress bar and a log. Afterwards the report lists how many objects were created, updated, unchanged, skipped and failed per kind, each failed item with its reason, and the log (warnings such as people nobody matched, files that were not in the zip). One failed item does not stop the others.

Then look at the result where your people work: the backlog and Kanban board of each team (open work lands in the backlog, or in the stage you mapped), the sprint planning, the epics and stories, a task's comments and time, its files. Clean up removes the uploaded file and the staged data from the server; the report and the record of what was imported stay.

Speed. On a development machine the importer wrote about 1,000 objects (tasks, comments, worklogs) per second, so 50,000 issues with 150,000 comments take a few minutes. Reading the file is faster still. Exporting from Jira is the slow part, and depends on Jira.

Importing again

You can import the same project as often as you like: the first time to look, again for a final run just before you switch.

Undoing an import

On the report of a finished import, Undo this import shows a preview and, when you confirm, runs in the background.

What is not imported

Recreate the rules you need on the Resourcecloud side: stages and working model of each team, roles, notifications.

Cut-over plan

  1. Rehearse. Export one project, import it into a test team, look around, undo it. Fix the mapping until it is what you want.
  2. Import everything a week or two before the switch. Let the team members look at their tasks; fix names and stages that surprise them.
  3. Freeze Jira on the day: make it read-only, or ask everyone to stop. Export again and import again; only what changed is touched.
  4. Switch. Everyone works in Resourcecloud from now on. Keep Jira read-only for as long as your records require; the export zip is a complete copy of what was imported.
  5. Run Clean up on the imports when you are done, so the uploads are not kept on the server.

Questions

Why is a Jira Story a task and not a Resourcecloud story?

In Jira a story is an ordinary issue. In Resourcecloud a story is a container for tasks, which is a different thing, so a Jira Story becomes a task of type Story. If you use Jira stories as containers, map that issue type to Resourcecloud story instead; its sub-tasks then become tasks in it.

Some people were not matched. What now?

Open the People tab, tick Only people who are not matched and choose a user for each, or allow creating users (inactive) and choose Create a user. Then Check and import again: what was imported is left alone, and the missing worklogs are added.

Worklogs are missing.

Worklogs of people nobody matches are skipped on purpose (see "People nobody matches"). The log names them. Check also that "Worklogs" is ticked under Options.

An attachment was reported as missing.

The file was not in the zip, or in a different place. The export script puts every file at attachments/<attachment id>/<name>. Files over the size limit you gave the script are skipped on purpose. Add the file to the zip at that path and import again; the issue is not doubled, the file is added.

Emoji are gone from titles.

Resourcecloud's database cannot hold emoji in titles and names. They are dropped there. In descriptions and comments they are kept.

A title lost text between < and >.

Titles and names are plain text in Resourcecloud, so anything that looks like an HTML tag is removed, and a lone < or > is replaced by its full-width look-alike. Descriptions and comments keep their formatting; script, event handlers and unsafe links are removed from them.

Can I import into a team that already has a board?

Yes. Choose the team in the mapping and give each status the stage it should go to. A stage that team does not have is not added unless you allow it under Options; those tasks go to Assigned.

Can I import two Jira installations?

Yes. Each export is filed under the installation it came from (read from Jira's links), so ids that repeat across installations do not collide.

Does the import send mail?

No. No e-mails and no notifications are sent, however many objects are written.

The upload stops at the same point every time.

Something between the browser and the server limits the size of a request. See the note in step 2.

Security