酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

無料で Werckerで RspecのCI & Capistrano Deploy

プライベートなプロジェクトでもRspecをデプロイのたびに実行したくて、『wercker』を使い始めましてた。 個人的には、Bitbucketのプライベートリポジトリを使って、RSpecで継続的インテグレーションしつつ、CapistranoでDeployできる 一連のプロセスが無料でスピーディに実現できるのでプライベートプロジェクトにめっちゃオススメです!


競合サービスとの比較

無料で使いはじめることができるCIツールには、『Circle CI』や 『Magnum CI』などがありますが、日本語の情報が多く、Bitbucketのプライベートリポジトリが使える点を 考えて、『wercker』を選択しました。

前提: アプリの環境について

今回は以下のアプリ構成を対象としています。

- アプリ構成
  - Ruby 2.2.0
  - Rails 4.2.0
  - RSpec 3.1.0

- デプロイ先のサーバー構成
  - CentOS
  - RVM

- リモートリポジトリ
  - Bitbucket

weckerでユーザーを作成 & アプリ登録

(1) GitHubかBitBucketにリポジトリを作ってアプリのコードをプッシュ

(2) 『wercker』でユーザー登録

(3) werckerで、GitHubかBitBucketのアカウントと連携

(4) werckerにアプリケーションのリポジトリを登録

(5) GitHub or BitBucket側で『werckerbot』ユーザーをコラボレーターに追加

ユーザー登録のフローに関しては、『Githubのプライベートリポジトリでも無料で使えるCI、Werckerを使ってrails newからHerokuのデプロイまでやってみる』 がわかりやすくてオススメっす!

wercker.ymlの設定

werckerでは、RailsプロジェクトのRootパスにwercker.ymlを作成すると そのステップにそって、スクリプトを実行することができます。

ちなみに僕は上記の『アプリ構成』でRSpecとCapistranoでデプロイするスクリプトはこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
box: wercker/rvm
services:
  - wercker/postgresql
build:
    steps:
        - rvm-use:
            version: 2.2.0

        # A step that executes `bundle install` command
        - bundle-install:
            jobs: 4

        # A step that prepares the database.yml using the database in services
        - rails-database-yml:
            service: postgresql

        # A custom script step, name value is used in the UI
        # and the code value contains the command that get executed
        - script:
            name: echo ruby information
            code: |
                echo "ruby version $(ruby --version) running"
                echo "from location $(which ruby)"
                echo -p "gem list: $(gem list)"

        # Add more steps here:
        - script:
                name: rspec
                code: bundle exec rspec --color -f d
deploy:
    steps:
        - rvm-use:
            version: 2.2.0
        - bundle-install:
            jobs: 4
        - script:
            name: make .ssh directory
            code: mkdir -p "$HOME/.ssh"
        - create-file:
            name: write ssh key
            filename: $HOME/.ssh/id_rsa
            overwrite: true
            hide-from-log: true
            content: $WERCKER_SSH_KEY_PRIVATE # 独自鍵設定の場合は、$DEPLOY_KEY
        - script:
            name: set permissions for ssh key
            code: chmod 0400 $HOME/.ssh/id_rsa
        - cap:
            stage: $WERCKER_DEPLOYTARGET_NAME
            tasks: deploy

環境変数の設定

(1) デプロイ用のブランチ名とターゲット名を設定

wercker => アプリ => Settings => Deploy Target に Deploy Targetで「production」を作成し、branch名「master」を 設定してください。

(2) サーバーの認証鍵の設定

こちらは任意の設定ですが、オススメの鍵情報の設定は、『wercker => アプリ => Settings => SSH Keys』 からwerckerデプロイ専用の鍵を作って設定する方法です。

もし何らかの事情で独自の鍵情報を使いたい場合には、『wercker => アプリ => Settings => PIPLINE』 に独自の環境変数DEPLOY_KEY(例)を作って、秘密鍵を登録しています。

werckerでRSpecを実行

あとはいつも通り、gitにソースコードをプッシュすると、自動的にwerckerでCIが実行されます。

CIが成功すると、werckerからDEPLOYボタンが押せるようになるので、それを実行するとcapistranoのタスクを実行してくれます。

Special Thanks

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

wercker + Capistrano で自動デプロイ - milk1000cc’s blog

Werckerの仕組み,独自のboxとstepのつくりかた | SOTA

Werckerのデプロイボタンはなんだかんだ言って便利だった / マスタカの ChangeLog メモ

おすすめの書籍