2014年12月23日火曜日

チーム開発とかでSlackを使うといろいろと捗る話

こんばんは。毎日更新してますが、暇って訳じゃないです。

最近は、Slackを使っていろいろとやっています。
Slackは、(ある程度は無料で使える)企業向けのチャットツールです。

Slackの特にすごいところは、「他のツールと連携(Integration)できるところ」ですね。これほんとすごい。
RedmineやBitbucketなど、わりと様々な開発で必要なツールが連携できます。

こういうツールには、AtlassianのHipChatとかもあるんですが、HipChatはチャネルごとに通知設定ができなかったりとわりと不便なところが多い。
最近HipChatは基本料無料化されましたけど、デザインがダサいちょっと受け付けない感じだったので(昔のIRCを想像してもらえるといいと思います)、Slackを導入するに至りました。

僕自身は、大学入ってからというもの、高校の友達数人とCakePHPで開発してみたりしているのですが、そのときにチャットツールにLINEを使用してました。
LINEはやっぱり既読でどれくらい読んでもらえたのかがわかるのがとてもいいところなんですが、如何せん過去ログが追いにくい(最近検索機能とかついたみたいです)、PCとの連携もなんか1台ずつで面倒、さらにはモバイルデバイスは1台のみという明らかに使い勝手が悪い感じで、どうにかならんかなーといった感じでした。
Skypeのボイスチャットも同時に稼働してましたが、やっぱりグループを作るのが面倒って感じでした。

あと、Bitbucketの課題ツールの運用が、ちょっと前に失敗してしまったのです。理由は「見ない」。遠隔地で開発をやってるからこそ起こりそうな問題に直面してました。

そこで、課題ツールの通知もみれたらいいねーという話になって、とても強いIntegrationを持つSlackを導入したわけですね。

Slackですが、残念なことにIntegrationを無料では5つまでしか利用できません。残念。
あと、メインで使い始めたCodebreakなんていう弱小あまり話を聞かないサービスのIntegrationなどあるわけがなく…と思っていたら、Slackの公式で紹介されていた「Hammock」なるツールがあるとのこと。こいつは、一言でいうとオレオレIntegrationを作るためのツールです。なんとピュアなPHPとSmartyという最近はあまり聞かなくなった構成で動きます。

Hammockのプラグインを書くことで、簡単にSlackのIntegrationを作ることができます。あと、こいつはIntegration上限には含まれないので、Integrationの数をけちれます。Webhook飛ばしてくるのはこいつにまとめてしまえばかなり便利です。SlackのAPIのブリッジになっているだけなので、Slackに実装されている「Incoming Webhook」を自前で実装することができます。

スクリーンショット_122314_092638_PM

まあ、実際にSlackではこんな感じでHookされてきた情報が表示されるわけです。大変便利。

Slackの導入方法とかは、検索すれば山ほど出てきますが、チームメンバーがわかんない!って言ったので、ちょっとマニュアルを作ったのです。今度公開しようと思います。
HammockプラグインでCodebreak Integrationを書いた話も今度。

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の改行コードを使用すると、この出力とともにシェルスクリプトが反応しなくなります。要注意。

総括

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

2014年12月22日月曜日

Gitのリモートリポジトリ間で単方向の同期をとる

こんばんは。最近はブログ書きまくってますね。いい調子。

さて、最近はクラウド型のCIツール(Werckerとか、Shippableとか)が何かと流行ってますが、使おうと思ったときにBitbucketやGithubを強制されるんですよね。プライベートな開発で、Bitbucketのコラボレーション制限とかが邪魔をして、ちょっと人数のいる開発とかをやろうとすると、CIツールが使えないという大変残念な結果に。

しょうがないので、他のGitホスティング(あまり評判よくないけどCodebreakとか)と、Bitbucketを同期をとって、CIツールでデプロイするときはBitbucketを参照し、自分たちがプッシュする先はCodebreakにするってことをやってみました。

まあ、とりあえず方法としては、CodebreakにもあるWebhookを利用して、プッシュされたら外部サーバーにHookして、Bitbucketと連携させるスクリプトを書いてみることにしました。

Web言語は何にしようかなーと思ったりとかはしたんですが、サーバーであっさり動くし慣れ親しんでるのでPHPで動かすことにして、シェルスクリプトをたたくだけにしてみました。

肝心のGitとの同期ですが、--mirrorオプションを使ってサクッとクローンして、--mirrorなbareとして動作させています。その方が楽だしね。

あと、スクリプトを置く場所で、SSH秘密鍵を共有したくなかったので、GIT_SSH環境変数を使って、sshコマンドをラップして、任意の秘密鍵を用いるようにしました。秘密鍵の生成はssh-keygenで場所を指定して生成すれば全然問題になりません。

毎度毎度コマンドがりがりのくせに、今回ばかりは成果物ができたので、成果物をGithubに放り込んでみました。もしよければ使ってやってください。あまり検証してないので、セキュリティ的にヤバイかも?
https://github.com/litols0816/git-sync

2014年12月20日土曜日

OpenShiftでRedmineを動かそうという話

こんばんは。前回に引き続きRedmineをアレコレしています。

前回、さくらサーバーでの動作が悲惨だったので、今回はPassengerをタダで使えることを前提にして、いろいろと調べてみました。
やっぱりVPSやIaaSなどを借りるほどでもないので、PaaSを使ってRubyをデプロイできる環境にすることに。
最初は、Herokuとか思いつきましたけど、容量問題でGitリポジトリブラウザが使えなかったり、DB1万行も尾を引きそうだったので、RedmineをOpenShiftというRedhatが提供するPaaSサービスを利用することにしました。
OpenShiftを用いる理由として、

  • Redmineの高速インストールができる
  • 1GBのデータ領域
  • SSHでガチャガチャしたりやりたい放題できる
などなど、様々な理由があります。
しかし、案の定日本語のドキュメントが少なかったので、英語とコード(Ruby歴3時間)との戦いを強いられたのでメモを残します。

1.OpenShiftで試しに高速インストール

Redmineをインストールするのは、超簡単で、OpenShiftのアカウントを作ってログインしたら、まず[ Add Applications...]というボタンをおして、検索窓に「Redmine」と入力して、URLを設定したら、あとは[Create Application]を押すだけ。
数分すると、Redmineのインストールが完了してもうすでに動いています。
URLにアクセスすると、Redmineにログインできるので、ID=admin PW=adminでさくっとログインして使えます。
標準でSSLにも対応しているようです。

2.Redmineをバージョンアップしたら動かなくなった

さて、これでインストールされるRedmineはV2.4と古めです。なんで新しいRedmine 2.6を当ててみます。

まずは、Gitの設定をしておきます。SourceTreeあたりで、OpenShiftのコンソールに表示されているGitのURLをコピペしてcloneしておきます。

次にRedmine2.6をダウンロードです。
http://www.redmine.org/projects/redmine/wiki/Download

ダウンロードしたら、ファイルを展開して、Redmineの2.6をクローンしたリポジトリに放り込んでPushします。
まあこれでとりあえず、Internal server errorが出て動かなくなります。

というわけで、SSHして直接いじります。

$ cd app-root/repos
$ bundle install --no-deployment

(追記 2014/12/25)rakeすんの忘れてた。
$ rake generate_secret_token
$ rake db:migrate RAILS_ENV="production"
$ rake redmine:plugins:migrate RAILS_ENV="production"


これで、インストールされているGemを吹き飛ばして、Gemfileに沿って最初からダウンロードされます。このとき、Railsのルートに「Gemfile.lock」というファイルが用意されるのですが、こいつがわりと重要になります。

OpenShiftのリポジトリの中には、「.openshift」というフォルダがあるのですが、これはOpenShiftの環境系ファイルの塊です。そのうち、「action_hooks」というフォルダがあるのでみてみると、pre_○○とか、明らかにビルド前後に実行されそうなスクリプトが並んでます。
そのうちの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でGemfile.lockをRubyバージョンに合わせて再生成してます本当にありがとうございました。
あと、ついでとばかりにdatabase.ymlもコピッてつくってますね。
とりあえず、detabase.ymlのOpenShiftのRubyバージョンは考えなくてもよさそうなので、放っておきます。
わかったことは、(最近作ったGearなら、)Gemfile.lock.ruby-1.9をbundle install --no-deploymentで作成したGemfile.lockの内容に書き換えればいいわけですな。

総括

RedmineをOpenShiftでインストールしようとすると、さくっとできるけど、変更を加えたりするのがとても大変な感じですね。
Gemfile.lockを手作業で変更するのはとても大変なので、わざとコケさせてGemfile.lockを作らせるのが吉っぽいです。

(追伸)
Blogger使いにくいでござる。面倒だし、なんか別のブログサービスみつからないかなあ…