Githubのプライベートリポジトリでも無料で使えるCI、Werckerを使ってrails newからHerokuのデプロイまでやってみる

SaaSのCIと言えばTravis CICircle 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アプリの準備は終わったので、ここまでの作業をコミットしておきましょう。

RailsWerckerHeroku 2
$ 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アプリを作成します。

$ heroku create rails-wercker-heroku

Werckerを設定する

いよいよWerckerの設定です。アカウントの新規登録から行きましょう。

Werckerのアカウントを新規登録する

wercker-2

こちらから新規アカウントを登録できます。Githubアカウントを利用して登録することができます。どうせGithubと連携するので、Githubアカウントを利用してアカウントを登録しておきましょう。

CIするアプリを追加する

アカウントを登録すると、マイページ的な画面にアクセスできるようになります。ここで以下の「Add an application」をクリックして、CIするアプリを追加しましょう。

wercker00

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

wercker01

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

リポジトリを選択する

wercker02

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

wercker botを設定する

wercker03

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

wercker04

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

wercker05

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

できたぞー!

wercker06

「Create Application」をクリックしてアプリの追加が完了です。

Werckerで動かす

早速ビルドが動きます

wercker07

アプリを作成し終えると、早速最新のコミットに対するビルドが動きます。「どんな風にビルドして欲しい?」という設定を記載した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」を利用すると、事前に正しいファイルになっているかどうか確認することができます。

Validate wercker.yml

wercker.ymlに関する詳細は以下のページを参照して下さい。

wercker.yml

そしてまた自動的にビルドが走る

wercker.ymlの設定を終え、Githubにプッシュするとまた、以下のように自動的にビルドが走ります。

wercker08

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

wercker09

ちゃんとテストが走っているようです。

あれ、でもHerokuへのデプロイはまだ自動的に実行されないようですね。

Wercker上のHerokuの設定

Herokuでデプロイするためにはあらかじめ設定が必要です。以下の「Settings」タブから設定画面に入りましょう。

wercker10

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

wercker11

wercker.yml内で$APP_NAMEという変数を使用していました。ここで変数に設定する値を設定しておくと、デプロイ時に自動的に使用してくれます。例えばこれからステージング環境を追加したい、と思った時に、wercker.yml内で固定値を書いてしまうと実現ができないので、変数にしておくと便利です。

WerckerからHerokuにデプロイ

Githubにプッシュするネタがないので、Werckerの画面上から直接デプロイしてみましょう。「Builds」タブを開くと、右上に「Deploy to」というボタンがあるので、クリックします。

wercker12

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

wercker13

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

RailsWerckerHeroku

おお、動いてる!

先ほど「auto deploy」にチェックをつけたので、これからはGithubにpushするたびにデプロイが走るようになります。

まだまだできる、いろんな設定

例えばビルドが完了したときや、デプロイに成功したときにHipchatに通知を流すなんてこともできます。

ブログを見ると活発に開発が進んでいる様子が伺えます。今流行りのDockerを利用したデプロイなんかにも対応しています。

ユーザビリティがかなり良いサービスなので、今までSaaSのCIに(金銭的な意味でも)躊躇していた方は、この機会にぜひ使ってみると良いのではないでしょうか!

あわせて読みたい

Wercker Devcenter

WerckerでPrivateリポジトリなGemやPuppetモジュールを利用する方法