2014年8月4日月曜日

RaspberryPiにSubversionのコードをAmazon Elastic Beanstalkにナイトリーデプロイさせる

社内のコード管理はsubversionを使っており
Amazon Elastic Beanstalkにデプロイするアプリもそれで管理している。

Beanstalkは開発環境と本番環境を別々に用意しているが
開発環境にはナイトリービルドならぬナイトリーデプロイさせたくなった。

subversionが動いているLinuxサーバーにシェルスクリプトをcron実行させればいいのだけど
あいにくOSのバージョンが古くデプロイに必要なgitのバージョンをインストールできなかった。
OSのバージョンアップは面倒なのでやりたくないと管理者に言われてしまう。
余っているPCはあるのだけど会社からの節電要求が厳しく24時間365日稼働させると怒られそうだ。
この程度の処理ならRaspberryPiで十分なのでB型を購入した。消費電力3.5Wなら許されると信じたい。

RaspberryPiにRaspbianをインストールする手順までは解説サイトが無数にあるので省略。
主にsubversionとgitとebコマンドラインツール、それらの依存モジュールが必要。
SSHで接続して
$ sudo apt-get update
$ sudo apt-get install python
$ sudo apt-get install ruby
$ sudo apt-get install subversion
$ sudo apt-get install git
$ wget https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.6.3.zip
$ unzip AWS-ElasticBeanstalk-CLI-2.6.3.zip
$ sudo mv AWS-ElasticBeanstalk-CLI-2.6.3 /opt/
$ sudo apt-get install vim
$ export PATH=$PATH:/opt/AWS-ElasticBeanstalk-CLI-2.6.3/eb/linux/python2.7/
$ vim .bashrc #上記exportを.bashrcにも書いとく
$ source .bashrc
$ svn checkout svn://hoge.com/piyo /piyo
$ cd piyo
$ git init
$ git add .
$ git --global user.email "hoge@piyo.com"
$ git --global user.name "hogepiyo" 
$ git commit -m "comment"
$ eb init
$ git aws.push

これで行けるかと思いきやpushに失敗する。botoモジュールが無いとか言われる。
$ sudo apt-get install python-pip
$ pip install boto
$ git aws.push
解決しない。

自分でbotoを入れてみる。
$ cd ..
$ git clone git://github.com/boto/boto.git
$ cd boto
$ sudo python setup.py install
$ cd ../piyo
$ git aws.push
上手くいった。botoが何なのかは興味無いので知らん。

あとはsvn updateからgit aws.pushまでの流れをシェルスクリプトに書く。
#!/bin/sh
logger "Started nightly deploy"
cd ~/piyo/
svn update
revision=$(svn info svn://hoge.com/piyo | grep "Last Changed Rev: " | cut -c 19-)
sed -i -e "s/revision/$revision\-nightly/" ~/piyo/.ebextensions/version.config
git add .
git commit -m "nightly-$revision"
git aws.push
logger "Exited nightly deploy"

大体こんな感じ。独自の工夫点としては
svn infoの出力からgrepやらcutでリビジョン番号を抽出して
バージョン番号の一部として使用している。
sedコマンドの置換処理の部分は各自のアプリに構造に合わせてね。
バージョン番号にリビジョン番号を入れておくと
不具合を指摘されたときに該当ソースコードの取得が簡単になる。tagsを作成してなくてもよくなる。
このスクリプトをcronに登録して毎日深夜に実行させる。

RaspberryPiのコストはケース・SDカード・充電器・microUSBケーブルを含めれば8000円くらいはかかってる。
この程度の処理だけだと割に合わないので他用途でも活用していきたいね。