【Java8】Backlogの既存プロジェクトを別スペースに移行する手順

## 記事概要

自分が現在働いている会社ではタスク管理の際にBacklogを使用しているのですが、とある理由で既存プロジェクトを別スペースに移行しなければならなくなり、その移行作業を任されたので手順についてメモ書き。

## 前提条件

Backlogの既存プロジェクトを別スペースに移行したい場合、事前に以下の状態を作り出しておく事が前提条件となります。

- Java8の実行環境。
- ターミナルで簡単なコマンド（mkdir、cd、mv、curlなど）が叩ける事。
- 移行元のスペースの管理者もしくは移行元プロジェクトの管理者である事。
- 移行先のスペースの管理者である事。

## 下準備編（各スペース・プロジェクトやAPIキーを準備）

業務で使っているスペースやプロジェクトをそのまま映すわけにはいかないので、この記事用にそれぞれ適当なものを作成していきます。

「スペース」と「プロジェクト」の違いについてはちょっとわかりにくいかもしれませんが、

- スペース: 組織単位
- プロジェクト: プロジェクト単位

みたいな感じで勝手にイメージしています。まず大きな枠としてスペースが存在し、その中にプロジェクトが点在している感じですかね。

https://backlog.com/ja/

![スクリーンショット 2021-02-25 22.36.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/865fee1b-4611-c4db-f43c-69441a6f3ba6.png)
![スクリーンショット 2021-02-25 22.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/1dd11c8a-38ff-41fc-ad49-c0d7f3291ffb.png)

Backlogトップページから「無料でbacklogを試してみる」をクリックし、お好みのプランを選択してください。今回はプレミアムプランで進めていきます。

### 移行元

![スクリーンショット 2021-02-25 22.42.33_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/6687a71c-297c-2791-ac66-26c92efefbcf.jpeg)

それぞれ情報を入力してスペースを作成。

#### プロジェクトを作成

![スクリーンショット 2021-02-25 22.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/d2ac35a1-d280-195d-2a25-b65c71f124c0.png)

スペースの作成に成功するとこんな感じでダッシュボードに入れるようになるので、今度はプロジェクトを作成していきます。（名前は各自適当に）

![スクリーンショット 2021-02-25 22.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/6e44203d-895f-3216-0e29-2be8a93027b7.png)

こんな感じでプロジェクトができていれば成功です。

#### ユーザーを追加

![スクリーンショット 2021-02-25 22.51.24_censored (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/c765da7d-531a-8979-0324-7aae65e7dd7a.jpeg)

右上にある「ユーザーを招待」ボタンをクリックし、適当なユーザーを何人か追加しておきます。

#### 課題を追加

![スクリーンショット 2021-02-25 22.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/9ceb16e9-5f57-eed7-c7ba-95aa9bb12112.png)

左サイドバーにある「課題の追加」から適当なタスクを追加しておきます。

#### APIキーを作成

![スクリーンショット 2021-02-25 23.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/15cc7d5b-b58d-9cfe-06a7-009089f438f6.png)

右上のアイコンから「個人設定」をクリック。

![スクリーンショット 2021-02-25 23.02.30_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/d0f9cc32-691f-75ec-6501-dbef590d2c23.jpeg)

左サイドバーにある「API」からAPIキーを発行してください。（後ほど使うのでメモなどに控えておきましょう。）

### 移行先

![スクリーンショット 2021-02-25 23.05.20_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/e446db27-1f04-047d-39d8-fc5143e3f6dc.jpeg)

それぞれ情報を入力してスペースを作成。

#### プロジェクトを作成

![スクリーンショット 2021-02-25 23.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/fc14dea6-4cb2-5a02-fc51-b84e1109f2d4.png)

スペースの作成に成功するとこんな感じでダッシュボードに入れるようになるので、今度はプロジェクトを作成していきます。（名前は各自適当に）

![スクリーンショット 2021-02-25 23.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/d1bde98a-456b-868d-b485-8db6c8acf38b.png)

こんな感じでプロジェクトができていれば成功です。

#### スペースに移行元のユーザーを追加

![スクリーンショット 2021-02-25 23.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/17cfa1a8-0581-b646-de52-7f291d9bc5e0.png)

右上のスペース名をクリックすると「組織設定」という項目があるのでそちらへ進みます。

![スクリーンショット 2021-02-25 23.15.30_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/b9b13702-0b81-2b61-b9bd-510c0add0de1.jpeg)

移行元のユーザーのメールアドレスを入力し、管理者権限を持たせた上で組織内メンバーに招待してください。

![スクリーンショット 2021-02-25 23.20.25_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/5c06f6b0-4d93-adfd-ff42-c85c4aa5a818.jpeg)

途中でメール確認などのステップを挟むと思いますが、最終的にこんな感じで移行元のユーザーがメンバーに加わっていればOK。

#### APIキーを作成

![スクリーンショット 2021-02-25 23.21.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/a7e64097-fd53-2d2a-311c-498054b7b3fa.png)

今度は移行先のプロジェクトでAPIキーを作成します。（移行元のユーザーとして発行）

![スクリーンショット 2021-02-25 23.24.33_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/397b768c-8468-eac4-06fd-cd9b1c28957a.jpeg)

この辺はさっきと同じ要領ですね。こちらも後ほど使うのでメモに控えておきます。

## 実行編（Java8実行環境を構築 & ターミナルからコマンド実行）

下準備が終わったので、いよいよ実際にデータの移行に入っていきます。

### Java8実行環境を構築

パソコン本体にJavaをインストールしても良いのですが、個人的にはローカル環境を汚したくなかったのでDockerを使用しました。

#### 各種ディレクトリ・ファイルを作成

```
$ mkdir backlog-migration
$ cd backlog-migration

$ mkdir docker
$ mkdir docker/java
$ touch docker/java/Dockerfile

$ mkdir server
$ mkdir server/src

$ touch docker-compose.yml
```

```dockerfile:./docker/java/Dockerfile
FROM openjdk:8-slim

RUN apt-get update
WORKDIR /usr/src
```

```yml:./docker-compose.yml
version: '3.6'
services:
  java:
    build: ./docker/java
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./server/src:/usr/src:cached
```

最終的に次のような構造になっていればOK。

```
backlog-migration
├─ docker
  ├─ java
    ├─ Dockerfile
├─ docker-compose.yml
├─ server
  ├─ src
```

#### コンテナを起動

```
$ docker-compose up -d
$ docker-compose exec java bash

...

root@e4aee0a9aa31:/usr/src# 
```

無事コンテナへ入る事ができれば成功です。

```
$ exit
$ docker-compose down
```

一旦抜けます。

### 移行用ツールをダウンロード

https://backlog.com/ja/backlog-migration/releases.html

↑公式が用意してくれている移行用ツールをダウンロードしていきます。

```
$ (cd ~/.../backlog-migration/server/src && curl -O https://backlog.com/ja/backlog-migration/backlog-migration-1.5.2.jar)
```

前半の「cd ~/.../backlog-migration/server/src」という部分については適宜パスを変更してください。自分の場合はルートに「Workspace」というディレクトリを作成していたので、

```
$ (cd ~/Workspace/backlog-migration/server/src && curl -O https://backlog.com/ja/backlog-migration/backlog-migration-1.5.2.jar)
```

こんな感じになりました。

### 移行元と移行先をマッピング

移行用ツールがダウンロードできたら、移行元のデータと移行先のデータをマッピングしていきます。

```
$ docker-compose up -d
$ docker-compose exec java bash
```

コンテナを再度起動。

```
java -jar backlog-migration-1.5.2.jar \
init \
--src.key 移行元APIキー \
--src.url https://スペースID.backlog.com \
--dst.key 移行先APIキー \
--dst.url https://スペースID.backlog.com \
--projectKey 移行元プロジェクトキー:移行先プロジェクトキー
```

各値を自分のものに変更し、上記コマンドを実行します。

```
java -jar backlog-migration-1.5.2.jar \
init \
--src.key ******************* \
--src.url https://mig-src.backlog.com \
--dst.key ******************* \
--dst.url https://mig-dst.backlog.com \
--projectKey MIGSRC:MIGDST
```

参考までに自分はこんな感じ↑になりました。（APIキーは流石に割愛させてください。）

```
Backlog Migration 1.5.2 (c) nulab.inc
--------------------------------------------------
--------------------------------------------------
Source URL[https://mig-src.backlog.com]
Source access key[*******************]
Source project key[MIGSRC]
Destination URL[https://mig-dst.backlog.com]
Destination access key[*******************]
Destination project key[MIGDST]
Filter[]
Only Import[false]
Fit Issue Key[false]
Maximum number of retries[20]
https.proxyHost[]
https.proxyPort[]
https.proxyUser[]
https.proxyPassword[]
--------------------------------------------------

Checking whether the source is accessible ...
Checking whether the destination is accessible ...
Getting the source project ...
Getting the destination project ...
Checking for the presence of admin role ...
Checking for the presence of project admin role ...

Start collecting the information about the project.
--------------------------------------------------
     (4/4) [##########] 100.0% Analyzed wikis.
     (1/1) [##########] 100.0% Collected issues information.
     (1/1) [##########] 100.0% Analyzed issues.
--------------------------------------------------
Completed collecting the information about the project.

--------------------------------------------------
The mapping file about users is created.
[/usr/src/mapping/users.csv]
--------------------------------------------------
```

↑こんな感じのログとともにマッピング用のファイルが出力されていれば成功。

![スクリーンショット 2021-02-26 0.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/1a4ccacc-a35d-15ee-92ef-067fa79923a4.png)

#### ./server/src/mapping/users.csvを修正

「./server/src/mapping/users.csv」内の「Destination Backlog user name」列を、「./server/src/mapping/users_list.csv」の「Name」列に置き換えます。

```:./server/src/mapping/users_list.csv
"Name","Email"
"hoge","user001@example.com"
"fuga","user002@example.com"
```
```:./server/src/mapping/users.csv
"Source Backlog user id","Source Backlog user display name","Source Backlog user
email","Destination Backlog user name"
"test001","テスト001","test001@test.com","hoge"
"test002","テスト002","test002@test.com","fuga"

一番右の列が空文字になっているはずなので、それぞれ「hoge」「fuga」で置き換え。
```

#### 実行

```
$ java -jar backlog-migration-1.5.2.jar \
execute \
--src.key 移行元APIキー \
--src.url https://スペースID.backlog.com \
--dst.key 移行先APIキー \
--dst.url https://スペースID.backlog.com \
--projectKey 移行元プロジェクトキー:移行先プロジェクトキー
```

途中でyesかno「」か聞かれますが（(y/n [n]):y）、全て「y」で大丈夫です。

```
--------------------------------------------------
Export completed.

Start convert.
--------------------------------------------------
 project users Converted.
     (1/1) [##########] 100.0% Converted issues.
     (4/4) [##########] 100.0% Converted wikis.
 project key Converted.
--------------------------------------------------
Convert completed.

Start import.
--------------------------------------------------
     (8/8) [##########] 100.0% Imported project users.
     (1/1) [##########] 100.0% Imported wikis.
    (1/1) [##########] 100.0% [SUCCESSFUL] Imported issues about 2021/02/25.
--------------------------------------------------
Import completed.
```

こんな感じのログが出力されれば成功。

![スクリーンショット 2021-02-26 0.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/44c512a6-4366-b6c1-a658-cb301e1261ec.png)
![スクリーンショット 2021-02-26 0.42.45_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/389e1de7-7018-23b4-dff5-723aacb5708d.jpeg)

移行先のプロジェクトに課題やユーザーが移行できているのを確認してください。

## あとがき

お疲れ様でした。だいぶ細かく説明したつもりですが、どこか詰まるところなどあればコメント欄などでご指摘いただけると幸いです。