Git
Heroku
Redmine
TiDD
継続的インテグレーション

Redmine on HerokuとBitbucketのGitプライベートレポジトリとの連携を実現するには

More than 1 year has passed since last update.

チケット駆動開発、スクラムなどの開発体制をとる話の一部で、gitレポジトリとRedmineなどのイシュー管理システム(バグトラッキングシステム、チケット管理システム)とを連動させる話があります。

レポジトリにpushする際のcommit logに、チケット番号を記載し、それをpushされると、レポジトリとイシュー管理システムが連携をとり、当該チケットを完了としcloseする、というような連携の仕方をさせることができます。


無料で実現する

Bitbucketは、無料でプライベートレポジトリ(非公開レポジトリ)を利用できます

また、herokuは、一定のトラフィック(など)範囲内であれば無料で利用できるPaaSであり、Redmineを配置できます。Redmineをローカルのvagrantやdocker上に置いても良いのですが、それだとどこからでもアクセスできないのでHeroku上に置いています。

Redmineは、Railsで実装されており、RailsはRuby言語でできており、そのRuby言語の開発者のmatzさんがherokuにいるという関係なので、できないはずはないのです。


Redmine on herokuについては

いろいろなサイトで解説されていますので、herokuとRedmineの概要を理解していれば、なんとかできるかと思います。


RedmineとBitbucketを連携させる手順

私のほうで、先ほど(2016年9月19日AM1時)試して出来た方法が以下の通りです。

作業PCのOSは、Macです。


  1. Redmineのプラグインsteveqx / redmine_bitbucket — Bitbucketを利用します。(似たようなのがあるのでご注意ください。)

  2. ローカルのherokuルートフォルダ下pluginsに移動

  3. 当該プラグインをgit cloneします。$ git clone git@bitbucket.org:steveqx/redmine_bitbucket.git

  4. cloneして出来上がったフォルダのredmine_bitbucketに移動

  5. .gitフォルダを削除(heroku上でRedmineと違うgitレポジトリがあると別アプリと認識され、うまく動かないため)

  6. herokuルートフォルダに戻る

  7. ここで、tmpフォルダ以下に、あとで使うbitbucket_reposフォルダを作って、.gitkeepを置く(tmp以下で無いとファイルが保持されない)


    1. $ mkdir tmp/bitbucket_repos

    2. $ touch tmp/bitbucket_repos/.gitkeep




  8. $ mkdir .ssh で.sshフォルダを作成し、移動。 $ cd .ssh


  9. $ ssh-keygen -t rsa -C "bitbucketにユーザ登録しているメールアドレス"で、SSHキーペアを作成(生成先を聞かれるので、当該redmineルートフォルダ/.ssh/id_rsaを指定。パスフレーズも聞かれますが、無しでそのままEnterしてください。)

  10. id_rsaファイルのパーミッションを変更。 $ chmod 600 id_rsa

  11. id_rsa.pubの中身をコピー。$ cat id_rsa.pubで出てきたものをコピーしてもいいですし、$ pbcopy < ~/.ssh/id_rsa.pubとか。

  12. ブラウザでbitbucketにログイン。右上のアカウント管理をクリック→アカウント管理→右メニューのSSHキーをクリック

  13. 鍵を追加ボタンで、Labelは任意のもの。Keyにさきほどコピーしたid_rsa.pubの中身をペーストし、保存。

  14. herokuルートフォルダから、herokuにpush。


    1. $ git add .

    2. $ git commit -m "add plugin file and ssh key for bitbucket-redmine"

    3. $ git push heroku master

    4. など



  15. (pushに失敗していたら当該ファイルはアップロードされないのでご注意を。ちゃんとpush後に表示されるプロンプトを見て完了しているか見てください。)


  16. $ heroku run bashで、herokuレポジトリ内にssh

  17. ここからheroku内($の色が違うなど)


  18. $ ssh -T git@bitbucket.orgを実行し、(yes/no)を求められるのでyes(すいません適当で)。そうすると、Redmineルートフォルダ/.ssh/以下にknown_hostsファイルが作成されます。

  19. 当該known_hostsファイルは、ログアウトすると消えてしまうので、$ cat .ssh/known_hostsなどして出てきたのをコピー


  20. $ exitで、herokuからログアウト

  21. ここからローカル

  22. Redmineルートフォルダ下の.sshディレクトリ下に$ vi known_hostsなどでknown_hostsファイルを作成し、さきほどheroku内でコピーしたものをペーストする。(vi では、pをおせばペーストされます。)

  23. ふたたび、herokuルートフォルダから、herokuにpush。


    1. $ git add .

    2. $ git commit -m "add known_hosts"

    3. $ git push heroku master

    4. など



  24. ブラウザでRedmineにアクセスし、管理者アカウントで管理メニューを開き、プラグインを開いて、プラグインが表示されているか確認。(「Redmine Bitbucket plugin」があるか。)

  25. 当該プラグインの「設定」を開き、「Bitbucketサービスを有効化」にチェックが入っている、「自動cloneを有効化」にチェックが入っていることを確認。ローカルレポジトリパス「tmp/bitbucket_repos」であることを確認(tmp/を追記する必要がある)。

  26. 次に同じくRedmineの管理メニュー→設定→レポジトリから、gitが有効になっているか確認し、その下の「コミットを自動取得する」が有効か、「リポジトリ管理用のWebサービスを有効にする」が有効かを確認し、無効なら有効にする(チェックを入れる)

  27. その下のAPIキー部分の右側の「キーの作成」を押し、生成されたキーが入力されたら、画面下の[保存]ボタンで保存する

  28. ブラウザで、Bitbucketにログインし、連携させたいレポジトリの設定→Servicesを開く。右メニューからPOSTを選択し[Add service]をクリックし、URLを以下のルールで入力し、Saveする。


    1. Redmineの連携させたいプロジェクトにブラウザからアクセスするURLが、https://example.herokuapp.com/projects/hogehogeだとすると、

    2. https://example.herokuapp.com/hooks/bitbucket/hogehoge?key={上記でコピーしたRedmineのAPIキー}

    3. を入力



という感じです。

スクリーンショットも無く、分かりづらいかもしれないですが、どうも情報が錯綜していましたし、古いものも散見されましたので、一応手順のまとめでした。


問題

どうもしばらくすると消えてしまう問題が発生。どうしたらよいか。herokuの構造? なんとかできないか明日にでも検討予定。。。

追記

tmp/以下であればファイルが保持される。そのためtmp/以下にレポジトリを保存するように変更。どのくらい保持されるか、その他問題が無いかなどは不明。

→追記: dynoの再起動時に消去される。2016年6月から無料プランでもクレジットカードを登録すれば1000時間無料になったので24時間稼働は可能だが、何かの拍子で再起動したら消える。ただし、Redmine上には設定が残り、そのままだと再びpushしても連動してくれないため、Redmine上のレポジトリの設定を消去する必要がある。なかなかめんどい。

追記2

gitのpush時にコミットコメントに「close #3」などを追記で、連携してチケットをclose出来ない。なんでだろう。設定を見直し中。

→追記3:コミットメッセージを「close #3」などから始めることでpushでclose出来た。なるほど。(また複数チケットをcloseしたい場合は、「close #1 #2」などスペース区切りで。カンマ区切りだと動作しなかった。