ウェブサービスを作っています。

wercker + Capistrano で自動デプロイ

GitHub / Bitbucket のプライベートリポジトリも無料で CI し放題の wercker というサービスがあります。(2013/11/30 現在)
サイトもきれいで素敵です。ビルド成功後、Capistrano でデプロイが自動実行される方法を書いておきます。


まず、アプリの設定で SSH 公開鍵を作成します。


生成された公開鍵は、デプロイ先サーバの ~/.ssh/authorized_keys や Bitbucket のデプロイ鍵などに追加しておきます。
次に、アプリの設定から Deploy targets の設定をします。Custom deploy を選択して、


master ブランチのビルドに成功したら、自動デプロイするようにします。
入力したら、Deploy pipeline の Add new variable をクリック。


SSH Key pair を選択し、先ほど作成した鍵を選択します。
名前の欄には、WERCKER_SSH_KEY と設定しました。
これで、デプロイ時に WERCKER_SSH_KEY_PUBLIC, WERCKER_SSH_KEY_PRIVATE という環境変数が設定されます。
OK をクリック。


Save をクリック。


あとは、wercker.yml に deploy 部分を追加して commit & push すれば、自動デプロイ環境構築完了です。
Capistrano の config/deploy.rb も、適切に設定してあるか確認しておくと良いと思います。
以下、wercker.yml の追加部分です。

deploy:
    steps:
        - 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
        - script:
            name: set permissions for ssh key
            code: chmod 0400 $HOME/.ssh/id_rsa
        - cap


最後に、とある Rails アプリの wercker.yml 全体例も貼っておきます。

box: wercker/ubuntu12.04-ruby2.0.0
services:
    - wercker/mysql
build:
    steps:
        - bundle-install
        - rails-database-yml
        - 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: setup config files
            code: |
                cp config/resque.sample.yml config/resque.yml
                cp config/sunspot.sample.yml config/sunspot.yml
        - script:
            name: setup db
            code: bundle exec rake db:schema:load RAILS_ENV=test
        - script:
            name: rspec
            code: bundle exec rspec
    after-steps:
        - hipchat-notify:
            token: $HIPCHAT_TOKEN
            room-id: 357378
            from-name: wercker
deploy:
    steps:
        - 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
        - script:
            name: set permissions for ssh key
            code: chmod 0400 $HOME/.ssh/id_rsa
        - cap
    after-steps:
        - hipchat-notify:
            token: $HIPCHAT_TOKEN
            room-id: 357378
            from-name: wercker