Redmine を GitLab に移行する

[Trac/Redmine+Subversion+Jenkinsなどを捨ててGitLabに移行するまでの道のり](https://qiita.com/hkato/items/3ddfe72985f7536bdf97)

## 概要

とりあえずこんな感じ。以下説明。

![overview](http://www.plantuml.com/plantuml/png/rPG_JyCm4CNtV8fJaL0xHEgQ3gW3AWi3OcPnxMiu6l_H-OpwyN6QTWXDf5HX8HdYuRtVFR_8taPHBCasHSXVqXIK4rYyex7a49Q6elPkjO27GtxMwxwi9cdKlamHkRJAgHejEbdqHTonoelOKirAF7-uvVRpc5Tmy7nS_JAzaBogFNW7pruVaNC0LRLlCPK7vTC0PWFcl81zeiR08wHGZ6nZbA0PbI2qydXVd9jQDr2Z07jbh0h5GErbjaqTiRc2xWircPuJVIFBx3z0DdWMiDHW5E_mJpga61F6-HLsdF_Hu3NhJDg1JXSKa2bk5MC-F9rJ1FPVg6Nm_2xVs9kaXRexfAfskweQ7Z7iQVVQcx95PzhhwWS0)

## 前回の話

前回、[Trac を Redmine 経由で GitLab に移行する](https://qiita.com/hkato/items/3a46aaf71e1f8c3854c8)で、Trac を Redmine 経由で GitLab に移行できた。

これは、Trac の Ticket Id がプロジェクト毎に #1, #2, #3, ... なのが GitLab でもプロジェクト毎に Issue Id が #1, #,2 #3, ...となるからシンプルに移行できた。
Redmine の場合は #1(proj-A), #2(proj-B), #3(proj-A), ...とシステムで一意となる

- proj-A
  - #1
  - #3
  - ...
  - #100
  - #200
  - ...
- proj-B
  - #2
  - #101
  - ...
  - #199
  - ...

ちょっと嫌な仕様なので困る。

## [Redmine to Gitlab migrator](https://github.com/redmine-gitlab-migrator/redmine-gitlab-migrator/)の対応

こちら
> You can retain the issues ID from redmine, this cannot be done via REST API, thus it requires direct access to the gitlab machine.
> So you have to log in the gitlab machine (eg. via SSH), and then issue the commad with sufficient rights, from there:

一旦、`-RM-{ Redmine Id }-MR-`という形で Issue Title の頭に Redmine の Id 情報を付与しインポート。その後、直接データベース(PostgreSQL)を操作して、Id を書き換える機能が実装されている（昔、評価したときにはこの機能は実装されていなかったと記憶している）。しかし、これは REST API 経由で操作できないので、GitLab 本体と  Redmine to Gitlab migrator が同じインスタンスで動いている必要がある(Omnibus 版を前提としているようで`/opt/gitlab/embedded/bin/psql` コマンドを呼び出している。ちなみに[sameersbn/gitlab](https://hub.docker.com/r/sameersbn/gitlab/)などは`psql`などのパスが異なる)

## 私の対応

Trac からの移行同様に GitLab を一時的な Docker container で起動し、移行作業完了後、 Export/Import で本番環境へ移行することにした。

同時にこの GitLab の中に Redmine to Gitlab migrator も組み込み、 Issue Id の対応を図った。

[オリジナルを Fork](https://github.com/hkato/redmine-gitlab-migrator) し、 `Dockerfile` や `docker-compose.yml` を追加。

先程、 [Pull Request](https://github.com/redmine-gitlab-migrator/redmine-gitlab-migrator/pull/52) を出したがどうなるか？
→ 無事 Mergeされたので本家を使えば良いです。 :smile: 

## 作業方法

`README.md` に追加した通り。

### 作業用 GitLab を Docker 上に立ち上げる

```sh
$ export GITLAB_HOME=$PWD/srv/gitlab
$ docker-compose up -d
```

localhost:8081 で GitLab が立ち上がる。

### Milestone/Issueの移行

[Trac を Redmine 経由で GitLab に移行する](https://qiita.com/hkato/items/3a46aaf71e1f8c3854c8)で書いたことと同様。

```sh
$ docker-compose exec migrator migrate-rg issues --redmine-key xxxx --gitlab-key xxxx \
    http://redmine.example.com/projects/test \
    http://localhost:8081/test/test
INFO: Getting redmine issues
INFO: Converting issues
INFO: Creating gitlab issues
INFO: #1 -RM-83-MR-バグだよ
INFO: #2 -RM-84-MR-新しい機能をついかしてくれー
INFO: #3 -RM-88-MR-サポートよろしく
INFO: #4 -RM-93-MR-バグその２
```

この段階では、Redmineでこんな感じのものが、
<img width="639" alt="redmine-issue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132537/e170ded0-26d9-40ef-ce1b-6aa474b8be02.png">
GitLabでこんな感じに
<img width="393" alt="gitlab-issue-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132537/24ff7906-a60b-5796-cae1-6d3f3209d021.png">

### Redmine Issue Id の変換

```sh
docker-compose exec migrator \
  migrate-rg iid --gitlab-key xxxx \
  http://localhost:8081/mygroup/myproject

INFO: Ready to recover iid for 4 issues.
INFO: Migrated successfully iid for 4 issues
```
これで、きちんと Redmine と同じ Id に揃えて`--RM-XX-RM--`も消えてくれる！
<img width="397" alt="gitlab-issue-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132537/f2848c8c-697d-61da-3d45-fb03f0a6ac30.png">

### 本番環境への移行

こちらも、[Trac を Redmine 経由で GitLab に移行する](https://qiita.com/hkato/items/3a46aaf71e1f8c3854c8)で書いたことと同様。

## まとめ（Redmine → GitLab）

- 懸念していた Issue Id もいい感じで変換できた（実はまだ本番環境で試しておらず、自宅での個人テストだが）。
- Wiki は変換できないので後日楽な方法を考える(Trac 同様)

## つづく（？）

Trac/Redmine 共に Wiki の移行方法について考えようかな？