« ITアーキテクトに必要な考え方 | トップページ | 業務システム開発の難しさ »

2013/10/05

Redmineの外部接続、データ移行の機能

Redmineは調べるほど、とても奥深く面白い。
Redmineを一つの業務システムと見なした時、特にRedmineの外部接続、データ移行の機能について考えたことをメモ書き。

【元ネタ】
Redmine: 期限が間近のチケットをメールで通知する機能 (Windows環境): Computer Practice

【1】業務システムには、普通のフロントエンドのWebシステムとは違った特徴がある。
特に、外部接続とデータ移行に特徴があると思う。

外部接続とは、外部のシステムと自システムを連携する仕組み。
よくある例は、夜間バッチとか、SOAPやRESTなどのリアル連携。

データ移行とは、業務システムに他システムのマスタデータやトランザクションデータを加工して移行する方法。
よくある例は、システムのリプレース時に、旧システムから新システムへデータ移行する時がある。

いずれも、業務システムとして機能させるには、外部からデータを取得して入れることが大切。
しかし、外部接続にせよ、データ移行にせよ、システムアーキテクチャとしてはかなり枯れた技術なのに、テストが大変なのでいつもトラブルが起きやすい。
外部接続やデータ移行の仕組みが揃っている業務システムは、数多くのデータを取り込んで一元管理できるので、色んな使い道を探ることができる。

技術的には、外部接続やデータ移行の問題点や解決方法は古くから知られている。
これらの観点でRedmineを分析してみよう。

【2】Redmineを外部接続やデータ移行の観点から分析すると、どんなインターフェイスを持っているのか?
Redmineには、rakeコマンドでバッチ処理のように一括処理する仕組みが下記のようにある。
ここから色々分析してみる。

rake -T | find "redmine"

rake redmine:attachments:prune # Removes uploaded files left unattached after one day.
rake redmine:email:read # Read an email from standard input.
rake redmine:email:receive_imap # Read emails from an IMAP server.
rake redmine:email:receive_pop3 # Read emails from an POP3 server.
rake redmine:email:test[login] # Send a test email to the user with the provided login name
rake redmine:fetch_changesets # Fetch changesets from the repositories
rake redmine:load_default_data # Load Redmine default configuration data.
rake redmine:migrate_from_mantis # Mantis migration script
rake redmine:migrate_from_trac # Trac migration script
rake redmine:permissions # List all permissions and the actions registered with them
rake redmine:plugins # Migrates and copies plugins assets.
rake redmine:plugins:assets # Copies plugins assets into the public directory.
rake redmine:plugins:migrate # Migrates installed plugins.
rake redmine:plugins:test # Runs the plugins tests.
rake redmine:plugins:test:functionals # Run tests for functionalsdb:test:prepare
rake redmine:plugins:test:integration # Run tests for integrationdb:test:prepare
rake redmine:plugins:test:units # Run tests for unitsdb:test:prepare
rake redmine:send_reminders # Send reminders about issues due in the next days.
rake redmine:tokens:prune # Removes expired tokens.
rake redmine:watchers:prune # Removes watchers from what they can no longer view.

【3】外部接続の観点

【3-1】他のWebシステムからRedmineのチケット情報を取得したい場合、REST APIで取得するのが一番簡単だ。
つまり、HTTPで接続するだけでXMLやJSONのデータを取得することができる。
あるいは、データをPOSTするだけでチケットを更新したり登録することができる。

リアル連携の良い点は、マッシュアップのように、データを簡単に取得して色んなWebサービスをカスタマイズしやすいこと。
リアル連携の弱点は、リアルタイムにデータ連携する前提のシステムでは、障害の影響が大きいこと。

この辺りは以前たくさん書いた。

Rest api - Redmine

RedmineのREST APIは素晴らしい~ビッグデータの手法をRedmineにも活用する: プログラマの思索

【3-2】Redmineの外部接続機能で面白いのは、メールの送受信によるインターフェイスを持っている点だ。
具体的には、メール送信によるチケット自動更新や期日が間近のチケットを通知する機能を持つ。
Redmineには、メールによるチケット登録インターフェイスには、下記のrakeコマンドが用意されている。

rake redmine:email:read # Read an email from standard input.
rake redmine:email:receive_imap # Read emails from an IMAP server.
rake redmine:email:receive_pop3 # Read emails from an POP3 server.

Redmineにおけるメールによるチケット登録機能は、調べてみるととてもよくできている。
管理画面上のユーザ権限とは別に、メールによるチケット登録インターフェイスでも、チケットの属性を指定できたり、チケット更新の権限を制御できる機能を持っている点がすごい。

メールを通知する機能は普通の業務システムでは普通に付属している。
例えば、サーバー監視ツールやログ監視ツールから障害検知メールを流したり、CRMからイベントやキャンペーンを一括メール送信したりする。
だから、これらの機能と連携すれば、例えば、Jenkinsのビルドエラー通知メールから障害チケットを起票したり、顧客からの問合せメールを起点にチケット登録することもできる。

この辺りは以前たくさん書いた。

メールからRedmineのチケットを自動登録する時の注意点: プログラマの思索

期日が間近のチケット通知インターフェイスは下記になる。

rake redmine:send_reminders # Send reminders about issues due in the next days.

期日が間近のRedmineチケットをメールで通知する: プログラマの思索

期日が間近のチケット通知インターフェイスは、個人的にはもう少し機能改善して欲しい。
現場リーダーの観点では、各プロジェクト独自の観点でチケットをフィルタリングして、メンバーに毎朝自動通知するようにしたいものだ。
機能改善の方法としては、例えば、RedmineのクエリIDを指定して、そのチケット集計結果をメールのBody部へ記載して通知することも考えられる。
RESTを使えば、Redmineの特定のクエリの結果は取得できるので、シェルスクリプトを自作してCronで通知する実装でもいい。

【4】データ移行の観点

【4-1】Redmineの機能の中で、SCMリポジトリと連携する機能は核となる機能だ。
従来から、Redmineでは、「リポジトリ」画面を開くまではリポジトリへの最新のコミット情報が取り込まれまない問題があった。
最もお手軽な解決手法は、SVNなどのSCMツールのpost-commit-hook時に、HTTP接続でリポジトリ情報取得へアクセスして更新する手法だろう。
実際は、Redmine管理画面からAPIキーを取得し、post-commit-hookスクリプトに、APIをパラメータで渡すURIを実行する手法になる。

小技(0.9): コミットと同時にリポジトリの情報を取得する | Redmine.JP Blog

しかし、Subversionのリポジトリ画面の表示がとても遅くなる別の問題もあったりする。
その原因は、SVNリポジトリが大きすぎたり、更新頻度が多いために、RedmineがHTTP接続でSVN表示する処理に負荷がかかりすぎる点にある。
解決方法としては、リポジトリ情報をRedmineへ更新するrakeコマンドをCronないし移行作業で実施する手法がある。

「リポジトリ」を開くまでSubversion等のリポジトリへのコミットが「活動」に表示されません ? Redmine.JP

rakeコマンドは下記になる。

rake redmine:fetch_changesets # Fetch changesets from the repositories

@daipresentsさんの資料にも、RedmineとSVNの接続処理の問題に対しては、SVNの参照リポジトリと更新リポジトリを分けて、Redmineからは参照用SVNリポジトリにアクセスするようにし、更新用SVNリポジトリへ開発者がコミットし、参照用SVNリポジトリと更新用SVNリポジトリはsvnsyncなどで同期する方法が書かれている。

@daipresentsさんのRxtStudyとshinagawa.redmineの講演資料を解読してみる #RxtStudy #47redmine: プログラマの思索

【4-2】Redmineで興味深い点は、TracやMantisからRedmineへ移行するデータ移行ツールが付属している点だ。
データ移行ツールが必要な背景としては、他ツールで使っていたマスタやチケットデータを捨てずに移行して使いたい場合があるだろう。

下記のrakeコマンドが用意されている。

rake redmine:migrate_from_mantis # Mantis migration script
rake redmine:migrate_from_trac # Trac migration script

他システムからの移行 ? Redmine Guide 日本語訳

他にもbugzillaからも移行が可能なようだ。

ralli/migrate_from_bugzilla

データ移行ツールはMantisやTracのバージョンに依存するだろうから、そのまま使えるかどうか、事前検証が必要だろうが、上記のインターフェイスを利用すれば、移行コストを下げられるだろう。
あるいは、データ移行ツールとして、上記のrakeコマンドではなく、importerプラグインを使う手法を取ることもできるだろう。

【5】このように、Redmineを業務システムとして分析した場合、オープンソースであるにも関わらず、外部接続やデータ移行のインターフェイスを持っている点は、とても素晴らしい。
外部接続、データ移行のインターフェイスがあれば、外部システムとデータ連携しやすくなるので、既存のRedmineを価値あるシステムとして長持ちさせることができる。

例えば、Redmineをフロント側のWebシステムとして、開発者やプロジェクトの情報を日々蓄積する目的で使っておき、バックエンドの業務システムへRedmineのトランザクションデータを流し込む運用も考えられるだろう。
あるいは、MantisやTracからRedmineでデータ移行することでプロジェクト管理ツールを一元化したり、SCMリポジトリの情報を日々連携することで、Redmineの価値を更に高めることもできるだろう。

今後もRedmineの機能を追いかけていく。

|

« ITアーキテクトに必要な考え方 | トップページ | 業務システム開発の難しさ »

モデリング」カテゴリの記事

Redmine」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« ITアーキテクトに必要な考え方 | トップページ | 業務システム開発の難しさ »