ボクココ

個人開発に関するテックブログ

Railsのテスト,デプロイ,ドキュメント生成をBitbucket, Jenkins で行う

今回はJenkinsとBitbucket の連携をします。
Bitbucket はプライベートリポジトリを何個でも作れて、5人までなら無料で使えるという優れもの。少人数開発ならこれを使わない手はないです。 Github Enterprise だとお金かかる部分が浮きます。 さらに! Wiki 機能もあり、今回はここに自動生成したドキュメントを反映できるようにします。

またJenkinsはどっかのリモートに置くとそれだけでお金がかかるし、無料のJenkins ホスティングサービスは柔軟性が無いので使いません。その代わりにしばらくはMacのローカルでJenkinsサーバを立てて運用していきます。

ローカルでJenkinsを立てると、Bitbucketへのフックができなくなるので、git push した瞬間にJenkinsを走らせる、みたいなことはできないのでご注意を。

やりたいこと

Git push したら Jenkins で以下の手順を実施する

  • テストの実行
  • 全て通ったらHerokuにアプリケーションをデプロイ
  • 成功したらそのドキュメントをBitbucket に更新

これにより、毎回デプロイやドキュメント更新をコマンドで打つ必要が無くなり、手間が減る。そして開発により専念することができるようになる。

主要ポイント

細かい設定とかは他のサイトに色々情報が載ってるので、大まかな部分だけ解説。

RSpec によるテスト

基本的にShellでゴリゴリ書いていきます。 Jenkins に rake plugin とかあるけど、ローカルで既に入れてあるし、わざわざまたそのプラグインから入れるのも大げさな気がしたので使わないことにした。

シェルの実行で以下のコマンドを叩きます。

COVERAGE=true AUTODOC=1 bundle exec rake spec

COVERAGEとAUTODOCについてちょっと解説。

カバレッジの出力

Jenkins でテストがどのくらい通ってるのかを一覧で見れます。これは Rails で Jenknsを回すなら是非入れたい所。

  gem 'simplecov', '~> 0.7.1'
  gem 'simplecov-rcov'

spec_helper.rb に色々追加して、Jenkinsにrcov pluginを入れてビルド後の処理でcoverage/rcovを指定すればOK.

自動ドキュメント生成

これは結構すごい。

  gem "autodoc"

spec_helper に設定をちょちょっと書いて、RSpecの itに autodoc: true を指定する。そして specを流すだけで APIのサンプルrequest と responseの .md ファイルができあがる。

doc/api というディレクトリが出来るので、後でこれをBitbucketのwikiに載せる。 toc.md を作ったほうがいい。これは目次を作ってくれるんだけど,autodocはデフォルトでは作らないようになってる。詳細はautodocのドキュメント参照。

Heroku にプッシュ

ここはHerokuのドキュメント見ながら git push heroku master までこぎつける。
自分のアプリではHeroku用の設定(gemfileにrails_12factorを追加したり)する必要があったけど、それもシェルでゴリゴリ書いた。

Wiki にアップ

Bitbucket にはWiki 機能があって、これも一つのGitリポジトリとなっている。そのため、その Wiki を git clone して自動生成した .md ファイルを追加して push するとなんと Bitbucket 上でリンク付きのAPIドキュメントができちゃう!

シェルはこんな感じ

git clone https://{{your account}}@bitbucket.org/hogehoge.git/wiki

# 古いwikiを削除
rm -rf wiki/api

# 新しく作ったwiki をコピー
cp -r doc/* wiki/

cd wiki

git add -A
git commit -a -m "added wiki" || pwd
git push origin master || pwd

cd ..
rm -rf wiki

|| pwd してるのは、そこでexit code が0以外になっちゃうとJenkinsが失敗したと見なして以降の処理をしてくれなっくなってしまうので、それの対応。 もっといいシェルは書けると思うので、参考程度で。。

Bitbucket のWiki のホームを作って、そこに [API Rquest Response](./api/toc.md) のようなリンクを作れば完了。