GitLabとRedmineを連携してみるの巻

はてなブログさんの開発フローのお話

少し前の話になるんですが、GitHubKaigiで
はてなブログさんの開発フローについて発表がありました。
その中で

当初はGitHubとRedmineを併用していたが、
両ツールの連携がイマイチだったので
Redmineを止めてホワイトボードでタスク管理するようにした

という内容がありました。
https://speakerdeck.com/shibayu36/hatenaburogutimufalsekai-fa-hurotogithub


「ふむふむ、なるほどなぁ」という感じで非常に勉強になったのですが、
もしかしたら
「"GitLab+Redmine" ならツール自体が連携機能を持っている
のでもう少しマシになるのかも?とも思いました。


そこで、GitLabとRedmineを使うと
一体どういうことが出来る様になるのか?といったところを紹介してみます。*1

弊社でも連携機能は一応有効にしているんですが、
まだまともには運用していないので
再確認の意味でメモを残しておこう、という意図もありますw



TL;DR

これらの設定を行うと…

  • GitLabのIssuesタブがRedmineのIssuesタブとリンクされます
  • GitLabのコミットメッセージ内のissue番号がRedmineのissueとリンクされます(※6.9.2時点ではパッチが必要)
  • Redmineのチケット連携機能がそのまま使えます
  • その他、Redmineの便利プラグインとも連携できます

事前設定: Redmine

Github Hookプラグインを導入しておく

GitHubという名前ですが、GitLabでも同じように使えます。
インストールは、リポジトリダウンロードして bundle install するだけでOKです。
https://github.com/koppen/redmine_github_hook

事前設定: GitLab

Issue TrackerでRedmine連携が選択できるようにしておく

gitlab.ymlにRedmine連携するための記述をしておく必要があります。
この設定をしておくと、Settingで IssueTracker にRedmineを選択できるようになります。
RPMインストールしているのであれば、
/etc/gitlab/gitlab.rb に以下の記述を追記するだけでOKです。

gitlab_rails['issues_tracker_redmine'] = true
gitlab_rails['issues_tracker_redmine_title'] = "Redmine"
gitlab_rails['issues_tracker_redmine_project_url'] = "http://<redmine_url>/projects/:issues_tracker_id/issues"
gitlab_rails['issues_tracker_redmine_issues_url'] = "http://<redmine_url>/issues/:id"
gitlab_rails['issues_tracker_redmine_new_issue_url'] = "http://<redmine_url>/projects/:issues_tracker_id/issues/new"
RedmineからGitLabリポジトリにアクセス出来るようにしておく

これは環境によってやることが異なるのですが、
もしもGitLabとRedmineが同じサーバであれば
GitLabリポジトリへのPermissionが適切に設定されていればよいでしょう。
RPMインストールしているのであれば、
/var/opt/gitlab/git-data/repositories 以下にリポジトリの実体があります。
Redmineを実行しているユーザから、このディレクトリが見えるかどうか確認しておきましょう。


GitLabとRedmine別々のサーバの場合、詳細は割愛しますが
GitLabのwebhookを駆使してRedmineリポジトリに反映すれば良いでしょう。



プロジェクト発足時、GitLabとRedmineを連携するための最低限の設定

まず、プロジェクトを立ちあげた時に
最低限するべきことをリスト化してみます。

  • Redmine
  • GitLab
    • プロジェクト作成
    • b) Settingでissue_trackerを"Redmine"に変更する
    • c) Settingでリポジトリの更新を通知するためのwebhookを設定する
a) Redmine: Gitリポジトリ情報を設定

プロジェクト→設定→リポジトリ から、通常通りgitリポジトリの場所を設定します。

b) GitLab: Settingでissue_trackerを"Redmine"に変更する

プロジェクト→Settingからissue_trackerを"Redmine"に設定します。
project_idには、Redmineのproject_idを入力しましょう。

c) GitLab: Settingでリポジトリの更新を通知するためのwebhookを設定する

この設定を行うと、GitLabリポジトリにpushしたタイミングで
Redmineリポジトリ情報がリアルタイムで更新されます。
Hook URLのフォーマットはこちら↓

<redmine_url>/github_hook?project_id=<RedmineのプロジェクトID>



一体何が連携されるの?

GitLabのIssueタブがRedmineのIssueタブとリンクする

GitLabサイト上の "Issuesタブ" がRedmineのIssuesに移動します。

GitLabコミットメッセージのissue番号がRedmineのissueとリンクする

コミットメッセージの「#????」という部分が、RedmineのIssueにリンクします。
ただ、少し前のバージョンでは普通にRedmineチケットへのリンクされていたのですが、
現バージョン(6.9.2)ではRedmineのチケットのリンクが上手く作成されないようです。
リンクを復活させるには $RAILS_ROOT/lib/gitlab/markdown.rbのこの行
以下のようなモンキーパッチを当てます。*2

--- a/lib/gitlab/markdown.rb
+++ b/lib/gitlab/markdown.rb
@@ -178,7 +178,7 @@ module Gitlab
     end

     def reference_issue(identifier, project = @project)
-      if project.used_default_issues_tracker? || !external_issues_tracker_enabled?
+      if true
         if project.issue_exists? identifier
           url = url_for_issue(identifier, project)
           title = title_for_issue(identifier)

これおそらくJIRA連携を追加した時のバグだと思うのですが
英語力が足りなくて伝えられる気がしない…

Redmineのチケット連携機能がそのまま使える

たとえば、Issueに紐づくコミットの表示や、ステータスの変更/進捗率の変更なども
コミットメッセージから行うことが出来ます。
また、作業時間の連携も行えますので
コミットメッセージに設定した作業時間がチケットに反映され、
そのまま何もしなくてもプロジェクト毎/ユーザ毎の集計結果に反映されます。
実績管理も行っているプロジェクトではとても便利ですね。*3



ダッシュボート/スクラム開発 プラグイン

先のスライドではかんばんについても言及されていました。
そこで、Redmineでも同じようなことを実現するためのプラグインを紹介してみます。

といった機能拡張を提供するものです。
他にも同じようなプラグインがいくつか存在しますが、更新が活発なものを厳選しました。

Redmine Backlogs v1.0.6

Redmineスクラム開発を支援するためのプラグインです。
Redmineユーザの中では割とメジャーな気がします。
以下、RedmineのBacklogを利用した記事です。

Redmine Dashboard2

プロジェクト毎のタスクボードを提供します。
導入もかなり楽ですし、見た目/操作もわかりやすいので
単純にチケットのかんばんが欲しいだけならオススメ。
※以下、Gifzoで操作感を動画にしてみました
http://gifzo.net/l4gxyO45rI.mp4

Redmine ekanban

こちらもタスクボードを提供するプラグイン
デモサイトあり。
http://ekanban-demo.herokuapp.com/
account: guest
password: redmine



その他連携プラグイン

Redmine OmniAuth

GitLabのOmniAuthでRedmineを追加します。
こちらを導入すると、GitLabのアカウント管理をRedmineアカウントに集約することが出来ます。
設定手順としては以下の通りです。

弊社でも設定済みですが、導入に結構手間取った記憶が…(※後で追記するかもしれない)

Redmine_Gitlab_Merge_Request

Redmineからmerge_request出来るリンクがチケット詳細に追加されます。
ちょっと微妙かも。



まとめ

GitLabとRedmineを連携するための設定と、
連携するとどういったことが出来るか、
を書いてみました。
もちろん「この機能を使えば何でも解決します!」ということではなく、
こういうやり方もあるんだなぁ、というゆるい感じで
選択肢の一つにしていただければと思います。

*1:GitHubではなくて恐縮ですが…

*2:RPMインストールしているのであれば、こちらのファイルになります > /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/markdown.rb

*3:Redmineの設定で、リポジトリユーザとRedmineユーザの紐付けを忘れずに! http://blog.redmine.jp/articles/new-feature-1_1/automatic-spent-time-logging/