いまさらだけどTracからRedmineに移行する

## 目的

[Trac](https://trac.edgewall.org), [Redmine](https://www.redmine.org), [GitLab CE](https://gitlab.com/) などを時代に合わせてオンプレで運用してきたが、サーバーの管理・維持などの関係もあり、Trac は廃止し、Redmine か GitLab に移行したくなってきた。

## 問題点

### Redmineへの移行

- 公式サイトのWiki - [Migrating from other systems - Trac](https://www.redmine.org/projects/redmine/wiki/RedmineMigrate#Trac) に記載されている様に当初は移行用のRakeタスク/スクリプトは存在している。
- しかし、対象のバージョンは Trac 0.8 から Redmine 2.x - 3.xの初期 あたりへの移行が可能だった様ではあるが、その後メンテナンスされておらず動作しない。
- 何年も前のIssue（チケット）にパッチが掲載されていたり、GitHubや各種ブログなどにパッチがあるが結局本家にはマージされていない。

### GitLabへの移行

- [TracBoat](https://github.com/tracboat/tracboat) という移行ツールがある。
  - [trac-to-gitlab](https://github.com/moimael/trac-to-gitlab) というのもあったが deprecated なので TracBoat を使えとのこと。
- この TracBoat も GitLab 11 までの対応で、現行の 12, 13 には対応していない。
- TracBoat は API経由で移行するものでなく、直接データベースを書き換える様子。自分は Omnibus 版を利用しているが PostgreSQL は Unix Domain Socket/Peer認証なので接続をどうするか？という問題もある。

移行ツールというものは、ツール作成者が自分の移行が完了したら後の変更への追従はあまりメンテナンスされない感じが多い。まあ当然かもしれない。

## 目標

- とにかく、Trac から移行する（Trac のサーバーをなくす）
- Issue Id の関係でプロジェクト毎でユニークな GitLab へ移行するのが目標だが、まずは、Redmine でもよい。
- Redmine に移行できたら、そこから GitLab に移行を考えてみる。
  - たとえば、[Redmine のプロジェクトを GitLab Issues へ移行する](https://qiita.com/jeffi7/items/75834ca22b9ddf473ed1)の記事を参考にする。
- 自分の利用している Trac 1.0.3 から Redmine 3.4.x or 4.0/4.1 へは探した限りのどのパッチを単体で利用しても移行できなかった。内容を精査し統合したパッチを作る。
- Ticket/Issue Idを保ちたいので、 Redmine は 1プロジェクト/1インスタンスとする(最終的にGitLabに移すのが目論見)。
- 内容確認のため繰り返し移行作業のテストが必要。
- 上記２つを満たすため Docker 上で作業を行う。
  - 次の2つの記事を参考にした。
  - [Redmine を Docker 公式イメージで運用する](https://qiita.com/bezeklik/items/b5c39136a8db23e2e81c)
  - [最新の Redmine 4 を Docker 公式イメージで運用する](https://qiita.com/bezeklik/items/b9d75ee74e0ae4c6d42c)

## 作業

- Copyright の年度ぐらいしか変更されず該当の Redmine では動かないけど、最新の [migrate_from_trac.rake](https://www.redmine.org/projects/redmine/repository/entry/trunk/lib/tasks/migrate_from_trac.rake) を一応ベースとした。
- 基本的に Redmine 2.x か 3.x の初期あたりを対象にしているパッチが多いので、「[Redmine 3.4.2でrake redmine:migrate_from_tracをエラー無く動作させるためのパッチを書きました - しばたテックブログ](https://blog.shibata.tech/entry/2017/09/30/121019)」をベースとした。
- 上記に記載されているが自分が移行させたい Trac が 1.0.3 のためタイムスタンプの保存形式が変更されており、別パッチの適用も必要だが Redmine の Issue にあるパッチの内容が自分にとっては微妙と感じたので、ここは自分なりの修正を適用（`Time.at()`を拡張）。
- ここまでで Ticket/Issue/Wiki などの移行は完了できたが、添付ファイルの移行が0件で失敗していた。調べてみると、Trac 1.0 から attachmentの格納方法が変わったのでその部分の[修正パッチ](https://github.com/eLvErDe/migrate_from_trac.rake)(Redmine 3.4.x には非対応？)から該当箇所を適用
- これで、 Trac 1.0.3 から Redmine 3.4.13 (3.x最終？）には移行完了できたっぽい。
  - 本番環境への適用はまだしておらず、ざっとした内容のチェックまで。
  - 最新の、Redmine 4.1.1 あるいは [Redmica](https://www.farend.co.jp/products/redmica/) 1.1.0 へは 基本 Redmine コンテナーの差し替えで移行できた。必要なら一旦 3.4.13 経由で 4.x へ。

## 成果物

GitHubの方に置きました。移行テスト様の`Dockerfile`, `docker-compose.yml`等もあります。

- https://github.com/hkato/migrate_from_trac.rake
  - [migrate_from_trac-trac-1.0.patch](https://github.com/hkato/migrate_from_trac.rake/blob/master/migrate_from_trac-trac-1.0.patch)

## 今後

- この Redmine から GitLab へ移行できるか？ 別記事を書くかも。
- 同居していたリポジトリーも、いまさらながら Subversion から Git へ移行したので、その件も書くかも。

## ところで…

誰か、Redmine 3.4.13 だけでなく Redmine 4.x (Rails/ActiveRecord 5.2.x) でも動作するようにしてほしい。っても、Redmine 本体の Issue へは何年も前に数々のパッチが投稿されてるけど、どれも適用されず。ずっと放置されている様子なので Trac からの移行なんてもう需要ないのかもしれないですね…。