2014年12月23日火曜日

OpenShiftでRedmineを設置して、Bitbucket連携を完璧にキメるまでの話

こんばんは。OpenShift楽しくて、ドはまりしています。
さて、先日Redmineを2.6にして、インストールしましたが、次のような問題があります。

  1. プラグインのGemfileが自動読み込みされなくなった
  2. GitにOpenShiftからのSSHができなくて困る
  3. Redmine_Bitbucketを入れたときに、デプロイするごとにリポジトリがすっ飛ぶ
とりあえず、これらの問題を解決しないと、残念な結果になること間違いなしです。
設定にはそこそこの時間と工夫を要したので、メモしておくことにします。

1.プラグインのGemfileが自動読み込みされない

OpenShiftでは、デプロイ時にはGemfile.lockを参照するようになっています。というわけで、Gemfile.lockを自動で変更させていきたいのですが、なかなかそうは行かない。
前回は、応急処置的に、Gemfile.lock.ruby-1.9をbundle install --no-deploymentで作成したGemfile.lockの内容に書き換えればいいとかいいましたが、やはりオリジナルからGemfileをもって気やすいようにしたいところです。
ここは考えて、.openshift/action_hooks/pre_buildをいじって対応します。

===.openshift/action_hooks/pre_build===
pushd "$OPENSHIFT_REPO_DIR" > /dev/null
#[ ! -f Gemfile.lock ] && cp -f "Gemfile.lock.ruby-$OPENSHIFT_RUBY_VERSION" Gemfile.lock
cp config/database.yml-$OPENSHIFT_RUBY_VERSION config/database.yml
popd > /dev/null
======

まあ、cpでrubyバージョンごとのGemfile.lockを作らないようにしてるんですな。んじゃあデプロイするには、この状態でどうするかというと、
  1. Rubyプラグインぶち込む
  2. rm ./Gemfile.lock
  3. bundle install --no-deploymentでGemfile.lockを作る
  4. 作られたGemfile.lockをGitリポジトリにぶち込む
これで、プラグインのGemfileが取得できて、Gemfile.lockに反映されるはず。あんまり頭のいい方法じゃないね。
注意点は、Gemfile.lockがgitgnoreで例外化されている場合があること。これはもうgitgnoreいじるしかない。

2.GitのOpenShiftからのSSHができなくて困る。

ここをみてわかったのですが、どうやらOpenShiftには秘密鍵のアクセス権がなかったりで、どうもGitに向いてない模様。
しょうがないので、Git-syncの時にも使った、GIT_SSH環境変数に再度ご活躍いただきます。やってることは前回と同じ、SSHコマンドをラップしてあげるだけです。
しかし、配置場所は、{$OPENSHIFT_DATA_DIR}にしなければなりません。それ以外のフォルダに関しては、デプロイですべて消し飛ぶ可能性があるので、使用しないことを推奨されています。


次のファイルは、{$OPENSHIFT_DATA_DIR}に配置する必要があります。リポジトリに放り込んでも意味がありません。(もちろん秘密鍵、公開鍵はssh-keygenで発行させます)
  • {$OPENSHIFT_DATA_DIR}ssh/git-ssh.sh (モード700で)
  • {$OPENSHIFT_DATA_DIR}ssh/id_rsa
  • ({$OPENSHIFT_DATA_DIR}ssh/id_rsa.pub)
これで、SSH-GITを使う準備はOKなのですが、hookしたときに、リポジトリが取り出せなくて詰みます。理由は、Redmine側に、GIT_SSHのコマンドを使うための用意がないからです。というわけで、「Redmine Bitbucket Plugin」に追記します。(こんなことしなくても、configuration.ymlのscm_git_commandを設定すればいいだけという。あとは、bash_profileにaliasでもいいみたいだけど、個人的に同名コマンドにaliasを張るつもりないからなあ)

===plugins/redmine_bitbucket/lib/bitbucket_rb.git===
class BitbucketGit < SystemCommand

  #GIT_BIN = Redmine::Configuration['scm_git_command'] || "git"
  GIT_BIN = "GIT_SSH="+ENV["OPENSHIFT_DATA_DIR"]+"ssh/git-ssh.sh git"

  def self.scm_class
    Repository::Git
  end
======

まあ追記して、Git-sshを実行できるようにしたわけです。とりあえず、GitへSSHはこんな感じで実装します。

3.Redmine_Bitbucketを入れたときに、デプロイするごとにリポジトリがすっ飛ぶ

Redmine Bitbucketのリポジトリは、APPROOTの直下にフォルダが作成されて、そこにmirrorするようになっているようですが、Openshiftでは例外なく吹っ飛ぶので、設定が必要です。
ポピュラーな設定として、Symbolic linkがあるので、とりあえずそれで利用します。
まずは、bitbucket_reposというフォルダを作っておいておくことを言い忘れておりました。
作ってから作業スタートです。

===.openshift/action_hooks/post_deploy===
...
ln -sf ${OPENSHIFT_DATA_DIR}files ${OPENSHIFT_REPO_DIR}files
ln -sf ${OPENSHIFT_DATA_DIR}bitbucket_repos ${OPENSHIFT_REPO_DIR}bitbucket_repos
======

こんな感じで、bitbucket_reposにシンボリックリンクを張っておくと吹き飛ばなくてすみます。
あと、どうやらこのプラグイン、pushされたタイミングじゃないと読み込みがされないようで。厳しいのう。なんで、作られてなくてもとりあえず落ちつてDeployすればいいってことですね。${OPENSHIFT_DATA_DIR}filesフォルダがないなら、ちゃんと作っておきます。

おまけ:/bin/bash^M

改行コードエラーだったようです。LinuxでWindowsの改行コードを使用すると、この出力とともにシェルスクリプトが反応しなくなります。要注意。

総括

やっぱり、いろいろなことしないと正常に動かない印象。スマートな方法が欲しいなあ。

0 件のコメント:

コメントを投稿