SaaSのCIと言えばTravis CIやCircle CIといったサービスが有名ですが、いずれにしてもプライベートリポジトリを使う場合は有料なのです。しょうがないよね、商売だもんね。でもCI入れたいなぁ。
そんな中、GithubだろうがBitbucketだろうがプライベートリポジトリでも無料で使っていいよ!というβ期間中のCI、Werckerが僕の周辺で話題になっていたので、触ってみました。画面もスゲー使いやすい上に、ハマりどころもなく、これはひょっとしてひょっとするんじゃないの?という期待を込めて、rails new
からRailsアプリをHerokuにデプロイするまえのチュートリアルを作ってみました。みなさんもこの記事を参考に、ぜひ使ってみてください。
目次
この記事のゴール
- Githubにpushしたら自動的にWercker上でRSpecのテストが動くこと
- Werckerでのテストに成功したら自動的にHerokuにデプロイされること
僕の環境
$ ruby -v ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.5.0] $ rails -v Rails 4.0.2
今回CIするリポジトリ
Railsアプリを用意する
Railsプロジェクトの作成
Weckerでテストを動かすために、Scaffoldでテストを生成したRailsアプリを作成します。Herokuでも動くようにするために、PostgreSQLを最初から使うように作成します。
$ rails new rails-wercker-heroku --database=postgresql -T $ cd rails-wercker-heroku $ git init $ git add . $ git commit -m 'first commit'
テストはRSpecで動かす
テストはRSpecで動かしたいので、RSpecの設定を追加します。Gemfileに以下の設定を追加します。
group :development, :test do gem 'rspec-rails' end
そしてRSpecの初期設定をジェネレート。
$ rails g rspec:install $ git add . $ git commit -m 'Add RSpec'
Scaffoldでコードを生成する
Scaffoldは自動的にCRUDのビュー、コントローラ、モデルを生成してくれる便利機能ですが、ついでにテストも生成してくれます。今回はWerckerでテストが実行されるところも見たいので、Scaffoldでコードを生成してしまいましょう。
$ rails g scaffold book title:string author:string invoke active_record create db/migrate/20140107002508_create_books.rb create app/models/book.rb invoke rspec create spec/models/book_spec.rb invoke resource_route route resources :books invoke scaffold_controller create app/controllers/books_controller.rb invoke erb create app/views/books create app/views/books/index.html.erb create app/views/books/edit.html.erb create app/views/books/show.html.erb create app/views/books/new.html.erb create app/views/books/_form.html.erb invoke rspec create spec/controllers/books_controller_spec.rb create spec/views/books/edit.html.erb_spec.rb create spec/views/books/index.html.erb_spec.rb create spec/views/books/new.html.erb_spec.rb create spec/views/books/show.html.erb_spec.rb create spec/routing/books_routing_spec.rb invoke rspec create spec/requests/books_spec.rb invoke helper create app/helpers/books_helper.rb invoke rspec create spec/helpers/books_helper_spec.rb invoke jbuilder create app/views/books/index.json.jbuilder create app/views/books/show.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/books.js.coffee invoke scss create app/assets/stylesheets/books.css.scss invoke scss create app/assets/stylesheets/scaffolds.css.scss
DBの設定を行う
ローカルで動作確認をするにあたってDBの設定が必要です。database.yml
の設定を変更して、コマンドを実行しましょう。今回使用しているプロジェクトでは以下のようにdatabase.yml
を設定しています。
development: adapter: postgresql encoding: unicode database: rails-wercker-heroku_development pool: 5 host: localhost test: adapter: postgresql encoding: unicode database: rails-wercker-heroku_test pool: 5 host: localhost
そして以下のコマンドを実行します。
$ rake db:create $ rake db:migrate == CreateBooks: migrating ==================================================== -- create_table(:books) -> 0.0040s == CreateBooks: migrated (0.0041s) ===========================================
routes.rbにrootの設定を追加する
このままだとhttp://0.0.0.0:3000/books
にアクセスしないとScaffoldした画面を見ることができないので、http://0.0.0.0:3000/
にアクセスしても同じ画面が表示されるように設定します。routes.rb
に以下の一行を追加します。
root to: 'books#index'
ローカルでサーバを立ち上げて動作確認をする
$ rails s => Booting WEBrick => Rails 4.0.2 application starting in development on http://0.0.0.0:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server [2014-01-07 10:36:33] INFO WEBrick 1.3.1 [2014-01-07 10:36:33] INFO ruby 2.0.0 (2013-06-27) [x86_64-darwin12.5.0] [2014-01-07 10:36:33] INFO WEBrick::HTTPServer#start: pid=36818 port=3000
rails s
コマンドを実行してからhttp://0.0.0.0:3000
にアクセスすると、以下のような画面が表示されるはずです。これでRailsアプリの準備は終わったので、ここまでの作業をコミットしておきましょう。

$ git add . $ git commit -m 'Scaffolding'
Githubのリポジトリを用意する
Werckerに連携するために、Githubのリポジトリを作成しておきましょう。まだ作成していない方はこちらから。作成した後はGithubのリポジトリにpushしておきましょう。
git remote add origin git@github.com:mahm/rails-wercker-heroku.git git push -u origin master
Herokuアプリを作成する
更に事前にデプロイ先のHerokuアプリを作成しておきましょう。Herokuのアカウントをまだ持ってないよー!という方は、以下のQiita記事を参考に作成して下さい。
で、Herokuアプリを作成します。
$ heroku create rails-wercker-heroku
Werckerを設定する
いよいよWerckerの設定です。アカウントの新規登録から行きましょう。
Werckerのアカウントを新規登録する

こちらから新規アカウントを登録できます。Githubアカウントを利用して登録することができます。どうせGithubと連携するので、Githubアカウントを利用してアカウントを登録しておきましょう。
CIするアプリを追加する
アカウントを登録すると、マイページ的な画面にアクセスできるようになります。ここで以下の「Add an application」をクリックして、CIするアプリを追加しましょう。

Gitリポジトリのプロバイダを選択する

アプリの追加画面に入りました。まずはGithubを選択します。
リポジトリを選択する

するとリポジトリを選択する画面になるので、既にpushしてあるrails-wercker-heroku
リポジトリを選択します。インクリメンタルサーチがついているのが親切ですね。
wercker botを設定する

Githubにpushされたことを検知するために、Githubリポジトリにwerckerbot
ユーザーをコラボレータとして追加する必要があります。以下のようにGithubリポジトリの設定画面にwerckerbot
ユーザーを追加しましょう。

wercker.ymlを設定する(あとでやる)

wercker.yml
を設定してね!という案内が表示されます。あとでHerokuデプロイ用のwercker.yml
を設定するので飛ばします。
できたぞー!

「Create Application」をクリックしてアプリの追加が完了です。
Werckerで動かす
早速ビルドが動きます

アプリを作成し終えると、早速最新のコミットに対するビルドが動きます。「どんな風にビルドして欲しい?」という設定を記載したwercker.yml
をまだ設定していないので、デフォルトの設定でとりあえず動きます。とはいえ、ちゃんとした状態で動かしたいので、wercker.yml
を設定してみましょう。
wercker.ymlを設定する
こんなファイルをRailsプロジェクトのルートパスに追加します。
box: wercker/ubuntu12.04-ruby2.0.0 services: - wercker/postgresql build: steps: - bundle-install - rails-database-yml: service: postgresql - script: name: echo ruby information code: | echo "ruby version $(ruby --version) running!" echo "from location $(which ruby)" echo -p "gem list: $(gem list)" - script: name: Set up db code: RAILS_ENV=test bundle exec rake db:schema:load - script: name: Run RSpec code: bundle exec rspec deploy: steps: - heroku-deploy - script: name: Update database code: heroku run rake db:migrate --app $APP_NAME
「ボックス」「サービス」「ビルド」「デプロイ」という設定項目があります。
まず「ボックス」はどんな環境でアプリを動かすかを定義します。自分でChefやPuppetを使って環境を構築することもできますし、出来合いのものを使用することもできます。Ruby2.0.0の出来合いのボックスをとりあえず使いたいので、wercker/ubuntu12.04-ruby2.0.0
を指定しました。
次に「サービス」。Werckerにはサービスという形で、ミドルウェアを自動的に構築してくれる機能があります。現在サポートしているサービスは以下のものがあります。今回はPostgreSQLを使用するので、wercker/postgresql
を指定しています。
- MySQL
- PostgreSQL
- MongoDB
- RabbitMQ
- Redis
次に「ビルド」。アプリの立ち上げのときに行うタスクを、steps
以下に配列で定義します。上記のYaml上でrails-database-yml
という設定がありますが、あわせてサービス名と一緒に設定すると、そのサービスを利用してDBを動かすように、自動的にdatabase.yml
を生成してくれます。
最後に「デプロイ」です。Wercker上にHerokuにデプロイするための仕組みが事前に用意されているので、それに乗っかります。デプロイ後は自動的にDBをマイグレートしておくようにします。実際利用するときは、このステップに追加して、事前にDBのバックアップを取得しておくといったタスクを追加しておくと便利ですね。
そんな訳で、上記のYamlをコピペしてwercker.yml
ファイルを作成してコミット&プッシュして頂ければ設定は完了です。
正しいwercker.yml
になっているか不安な場合は、以下の「Validate wercker.yml」を利用すると、事前に正しいファイルになっているかどうか確認することができます。
wercker.yml
に関する詳細は以下のページを参照して下さい。
そしてまた自動的にビルドが走る
wercker.yml
の設定を終え、Githubにプッシュするとまた、以下のように自動的にビルドが走ります。

RSpecのテストも走らせるようにステップを記述したので、どんな形になっているか見てみましょう。

ちゃんとテストが走っているようです。
あれ、でもHerokuへのデプロイはまだ自動的に実行されないようですね。
Wercker上のHerokuの設定
Herokuでデプロイするためにはあらかじめ設定が必要です。以下の「Settings」タブから設定画面に入りましょう。

設定画面の中に「Deploy targets」という項目があります。ここに必要な項目を設定していきます。

wercker.yml
内で$APP_NAME
という変数を使用していました。ここで変数に設定する値を設定しておくと、デプロイ時に自動的に使用してくれます。例えばこれからステージング環境を追加したい、と思った時に、wercker.yml
内で固定値を書いてしまうと実現ができないので、変数にしておくと便利です。
WerckerからHerokuにデプロイ
Githubにプッシュするネタがないので、Werckerの画面上から直接デプロイしてみましょう。「Builds」タブを開くと、右上に「Deploy to」というボタンがあるので、クリックします。

「production」を選ぶとデプロイが走ります。この「production」という名前は、先ほどの設定したデプロイターゲットの「Deploy target name」という項目に対応しています。

デプロイできたようなので、早速HerokuのURLにアクセスしてみます。

おお、動いてる!
先ほど「auto deploy」にチェックをつけたので、これからはGithubにpushするたびにデプロイが走るようになります。
まだまだできる、いろんな設定
例えばビルドが完了したときや、デプロイに成功したときにHipchatに通知を流すなんてこともできます。
ブログを見ると活発に開発が進んでいる様子が伺えます。今流行りのDockerを利用したデプロイなんかにも対応しています。
ユーザビリティがかなり良いサービスなので、今までSaaSのCIに(金銭的な意味でも)躊躇していた方は、この機会にぜひ使ってみると良いのではないでしょうか!