Windows7で Capistrano 3を使って、Vagrant上のUbuntuのrbenvにSinatraアプリをデプロイしてみた

前回、Berkshelf + Vagrantを使ってゲストOS上にrbenv環境を構築できたため、今回はその環境へ Capistrano 3 を使ってSinatraアプリをデプロイできないか試してみました。
なお、Capistranoは今年の6月にv3がリリースされたばかりのようで、Web上でよく目にするv2の設定情報とは異なっていたため、いろいろと悩みました。

環境

ホストOS
ゲストOS

流れ

Capistrano用の作業フォルダを作成・移動

d:\>mkdir capistrano\fuga
d:\>cd capistrano\fuga

デプロイ用のGemfileを作成

d:\capistrano\fuga>bundle init
Writing new Gemfile to d:/capistrano/fuga/Gemfile

Gemfileに記述

デプロイ先で Bundlerとrbenvを使うため、記載しておきます。

# A sample Gemfile
source "https://rubygems.org"

gem 'capistrano', "~>3.0.0"
gem 'capistrano-bundler', github: "capistrano/bundler"
gem 'capistrano-rbenv', github: "capistrano/rbenv"
Bundlerでインストール

d:\capistrano\fuga>bundle install
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from capistrano:
If you're updating Capistrano from 2.x.x, we recommend you to read the upgrade g
uide: http://www.capistranorb.com/documentation/upgrading/

Capistrano用のセットアップ

d:\capistrano\fuga>bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified

Capfileの記述を修正・追加
set :rbenv_custom_path, '/home/vagrant/.rbenv'
set :rbenv_ruby, '2.0.0-p247'
deploy.rbファイル(fuga\config\deploy.rb)の修正

repo_urlを、SinatraアプリのGitHubリポジトリに変更

set :repo_url, 'https://github.com/thinkAmi/sinatra-hello-world.git'


デプロイ先の変更

set :deploy_to, '/home/vagrant/fuga'


scmでコメントアウトしてある以下のものをアンコメント

set :scm, :git
デプロイ先環境の設定

今回はゲストOSをproduction環境と考え、「d:\capistrano\fuga\config\deploy\production.rb」に以下の記述をしておきます。
なお、WindowsではVagrant用の鍵が環境変数「USERPROFILE」の下にあることから、設定ファイル内でその環境変数を展開して使用するため、「win32/registry」ライブラリをrequireしておきます。

require 'win32/registry'
key_path = Win32::Registry.expand_environ('%USERPROFILE%\.vagrant.d\insecure_private_key')

server '127.0.0.1', roles: %w{sinatra}, user: 'vagrant', port: 2222, ssh_options: {
  user: 'vagrant',
  keys: key_path,
  auth_methods: %w(publickey)
}

参考: Windowsの環境変数を含んだ文字列の展開 - DEAD BEEF



Vagrantfileの修正

Sinatraの動作確認をすることから、Vagrantでホストの適当なポート(今回は9876)をゲストのポート4567へフォワードするよう記述を追加します。

config.vm.network :forwarded_port, guest: 4567, host: 9876


Vagrantで起動している場合には、以下で再起動しておきます。

vagrant reload
Capistranoを使ったデプロイ

d:\capistrano\fuga>bundle exec cap production deploy

# 結果
[34mINFO[0m [[32m9aee9e3d[0m] Finished in 0.040 seconds with exit status 0([1m[32msuccessful[0m[0m).

sshによる確認

ゲストOSに vagrant ssh で入り、Sinatraを起動後、ホストOSのブラウザで動作を確認します。

d:\berkshelf\hoge>vagrant ssh
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-generic i686)


vagrant@hoge:~$ cd fuga/current
vagrant@hoge:~/fuga/current$ bundle exec ruby app.rb -e production
[2013-11-12 21:39:37] INFO WEBrick 1.3.1
[2013-11-12 21:39:37] INFO ruby 2.0.0 (2013-06-27) [i686-linux]
== Sinatra/1.4.4 has taken the stage on 4567 for production with backup from WEBrick
[2013-11-12 21:39:37] INFO WEBrick::HTTPServer#start: pid=3472 port=4567
10.0.2.2 - - [12/Nov/2013 21:40:00] "GET / HTTP/1.1" 200 119 0.0108
10.0.2.2 - - [12/Nov/2013:21:40:00 UTC] "GET / HTTP/1.1" 200 119- -> /

参考: Sinatraがデフォルトでは外部から繋がらなくなってたよ - Qiita



問題なく動作しているようです。



補足

試しに、Sinatraの起動もCapistranoでやってみようと考え、deploy.rbに以下の記述を追加してみます。
executeについては、上の記述でも動作しましたが、短い下の方を使いました。

on roles(:sinatra) do
  within current_path do
    # execute :bundle, :exec, :ruby, "app.rb -e production"
    execute :ruby, 'app.rb -e production'
  end
end


その後、再度Capistranoでデプロイをします。

d:\capistrano\fuga>bundle exec cap production deploy


以下のログが出たところで、コマンドプロンプトの動作が停止していますが、実際にはゲストOSではSinatraが上がって動作しているようです。ホストOSのブラウザで確認したところ、正しく表示されコマンドプロンプトにもログが追加されました。

[0m[30mDEBUG[0m [[32mc117a5d5[0m] [31m [2013-11-12 20:33:19] INFO WEBrick::HTTPServer#start: pid=3072 port=4567
[0m


ただ、Capistranoから制御が戻らないのは問題なため、他の方法でSinatraを起動したほうが良さそうです(Ctrl + C でCapistranoの実行をキャンセルした場合、VM上のSinatraは動作したままでした)。



設定ファイル

補足部分も含め、以下の通りです。