[PaaS][CI] OpenShift Online上のRedmineとBitbucketを連携してみた

By |2月 18, 2014|CI, PaaS, |


先週のだゼイさんによる寄稿に対する各所からの反応を尻目に今週はまた普通のエントリです。

最近、Herokuのインスタンスがアイドルまたは再起動した場合、gitで管理されていないファイルは消えてしまうので、DeploydとかKibanaとか設定をファイルで持つアプリケーションはまともに動かせないということがありました。

Herokuで何とかできるのかもしれないですが根性のない私は他のPaaSを当たり、以前も解説しましたOpenShiftに目をつけました。

今回は無料のPaaSに置きたいランキングNo.1ツールであるRedmineを、3ギアまで無料のOpenShift上で動かし、これまた5ユーザまでならプライベートリポジトリも無料で使えるBitbucketと連携してみます。

そんなケチらないで少しお金払えばBacklogとかgithubとか使えるのに…という意見もありますが、時間を無駄に使っても完全無料で頑張りたいというニーズもあると思うので!

さて、OpenShiftにRedmine自体を構築するには以下のようにコマンド打つだけです(rhcコマンドのインストールは[PaaS][OSS] OpenShift Onlineを触ってみたをご覧ください)

[html]
$ rhc app create -a redmine -t ruby-1.9
$ rhc cartridge add -a redmine -c mysql-5.1
$ cd redmine
$ git remote add upstream -m master git://github.com/openshift/openshift-redmine-quickstart.git
$ git pull -s recursive -X theirs upstream master
$ git push origin master
[/html]

これで https://redmine-$yournamespace.rhcloud.com にアクセスするとredmineのログイン画面が現れます。当初の管理者IDとパスワードは「admin」なので即変更しましょう(OpenShiftもhttpsイケます!)

これでredmineをサクっと動かしてみましたが、せっかくなんでredmineのテーマをgithub風にしたいと思います。GitHubテイストなRedmineのテーマを自作してみたを適用してみましょう。

redmineのソースをローカルできちんと管理したい場合は先ほどcloneしたローカルのredmineディレクトリのpublic/themeにテーマを置きOpenShiftにpushします。

[html]
$ cd redmine/public/theme
$ wget –no-check-certificate https://github.com/makotokw/redmine-theme-gitmike/archive/r6.tar.gz
$ tar zxvf r6.tar.gz
$ cd ../../
$ git add .
$ git commit -m "add gitmike theme"
$ git push origin master
[/html]

OpenShiftにpushしたらredmineの設定でテーマを変更すると以下のように見た目がかっこよくなります。

ただ、OpenShiftはrhc sshでインスタンスにssh接続でき、サーバ内で結構普通にコマンド叩けるのでサーバ上で直接やっちゃっても良いんじゃないでしょうか。方針次第ですね。

次にBitbucketとの連携ですが、まずはredmine_bitbucketというPluginを入れます。

[html]
$ cd redmine/plugins/
$ wget –no-check-certificate https://bitbucket.org/steveqx/redmine_bitbucket/get/505f03204c32.zip
$ unzip steveqx-redmine_bitbucket-505f03204c32.zip
$ cd ../
$ git add .
$ git commit -m "add redmine_bitbucket plugin"
$ git push origin master
$ rhc ssh
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> cd app-root/repo/
[redmine-********.rhcloud.com repo]\> bundle install
[redmine-********.rhcloud.com repo]\> rake redmine:plugins NAME=redmine_bitbucket RAILS_ENV=production
[redmine-********.rhcloud.com repo]\> exit
$ rhc app restart
[/html]

OpenShiftはアプリをrestartすると頻繁に「503 Service Unavailable」になりますが、落ち着いて再度restartしましょう。Herokuほど安定していませんがHerokuが安定しすぎで他のPaaSはこんなものだと割り切りましょう。

あ、あと遅いのはHerokuも同じですね。CloudFlareとかAWSのCloudFrontでキャッシュすることで体感速度を上げる施策はHeroku同様有効だと思います(が、私はノーマルで使ってます)

で、再起動が終わったらプラグイン設定画面を開きます。

以下のように設定して保存します。

で、OpenShift上のリポジトリ(のディレクトリ)を設定したとおりの名前で作成します。

[html]
$ rhc ssh
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> mkdir app-root/repo/bitbucket_repos
[/html]

通常のサーバ環境であれば、あとBitbucket側に公開鍵とhookエンドポイントを登録すれば連携できるのですが、SSH鍵認証部分でOpenShift特有の作業があります。

OpenShiftのユーザには既にSSH鍵が設定されているのですが公開鍵を見ようにも権限がないようで以下のようにアクセスが拒否されます。

[html]
$ rhc ssh
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> cat ~/.ssh/id_rsa.pub
cat: /var/lib/openshift/52f7878be0b8cd**********//.ssh/id_rsa.pub: 許可がありません
[/html]

これじゃBitbucketに公開鍵を登録できませんので、別の鍵ペアを作成してそっちを参照するようにします。ポピュラーな方法としては~/.sshディレクトリ以下にconfigファイルを置く方法がありますが、OpenShiftでは~/.sshディレクトリでさえ権限がありませんので別の方法を取らざるを得ません。

で、色々調べているとシナジーマーケティングさんの技術ブログに正にOpenShiftの記事がありました。これによるとGIT_SSH環境変数にラッパースクリプトを指定する方法があるようです。

今回はシナジーマーケティングさんのブログを参考に以下のようなスクリプトを作成しGIT_SSH環境変数を設定しました。

[html]
$ rhc ssh
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> vi app-root/data/wrapper.sh
↓以下を追加
#!/bin/bash

ssh -i $OPENSHIFT_APP_SSH_KEY $1 $2
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> vi app-root/data/.bash_profile
# Warning: Be careful with modifications to this file,
# Your changes may cause your application to fail.

↓以下を追加
alias git="GIT_SSH=$OPENSHIFT_DATA_DIR/wrapper.sh git"
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> source $OPENSHIFT_DATA_DIR/.bash_profile
[/html]

※設定していく中で$OPENSHIFT_APP_SSH_KEY(/var/lib/openshift/52f7878be0b8cd**********/.openshift_ssh/id_rsa)に別の鍵ペアがあることに気付きました。まさか、それ専用の鍵が既にあって、この公開鍵を設定するだけで良いのではないか?と思って設定してみましたがダメでした。

実は最初はシナジーマーケティングさんのブログを参考に作成したスクリプトをGIT_SSH環境変数に設定するために$OPENSHIFT_DATA_DIR/.bash_profileに書いてsourceしてみたり、rhc env set GIT_SSH=…としてみました。

しかし、いずれも環境変数に設定されるものの実際のgit cloneやgit fetchされたタイミングのログを見ると鍵が認証されていないようでしたので、おそらく違う鍵を見ている=作成したスクリプトが参照されていないようです。

結局は上記の通り、gitコマンドのaliasに設定することで動作しました。

これで、Bitbucketにデプロイ鍵を設定しますのでOpenShift上で以下のように公開鍵を表示しコピーします。

[html]
$ rhc ssh
[redmine-********.rhcloud.com 52f7878be0b8cd**********]\> cat $OPENSHIFT_APP_SSH_PUBLIC_KEY
↓以下をコピー
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4eu8fKrBjMXxqkH/qvf4OuQuVZa9F9gmFZ/CzxwDkdLqwkzdagLUqlIbFHfUGeDM3A+KiQpvg6jfElqWcVdgfWYhlj8z4wWk71j5yPbxpPoaUeidDdh4DFlJA2m7jVQg/4X1VS+5MVJYrU/+sEbDzRt6BGS09HPGDz06AebQnHvIcOZihd2Qi1HD5Xz12GxpqFSmGXHlHgD1gUxndMbt1+V5N6n+G6jy8pvcv6p16JOGSVJ3T1aEfZQAgzFuXKmR4yYCa9IgWMitC58rpfEFfv2HYn+fhLCMvXlmtMjKZ02oGwtXm18ta99YYY5K5L5mlLaBKPSA6Qwz3C9vDKy+0w== 52f7878be0b8cd**********@ex-std-node226.prod.rhcloud.com
[/html]

続いてBitbucketの設定(右上の歯車マーク)→デプロイ鍵→鍵を追加をクリックして表示されたダイアログにコピーした公開鍵を貼付けます。

最後にBitbucketのフック設定→POSTを選択→ホックの追加をクリックして表示されたダイアログに「https://redmine-{あなたの名前空間}.rhcloud.com/bitbucket_service?project_id={Redmine側のプロジェクトID}」を設定します。

これでBitbucketへpushしたタイミングでBitbucketからRedmineへ通知されRedmineがBitbucketのリポジトリをclone若しくはfetchします。

Redmine側のプロジェクト設定のリポジトリタブとプロジェクトメニューのリポジトリを確認すると、それぞれ以下のような画面が表示されBitbucketへのpushの度の更新されれば問題ありません。