前回、Berkshelf + Vagrantを使ってゲストOS上にrbenv環境を構築できたため、今回はその環境へ Capistrano 3 を使ってSinatraアプリをデプロイできないか試してみました。
なお、Capistranoは今年の6月にv3がリリースされたばかりのようで、Web上でよく目にするv2の設定情報とは異なっていたため、いろいろと悩みました。
環境
ホストOS
- Windows7 SP1
- Vagrant 1.3.5
- Capistrano 3.0.1
ゲストOS
- Ubuntu 12.04.3
- rbenvのglobalには、2.0.0-p247 + Bundler + Padrino
- デプロイするSinatraアプリ (thinkAmi/sinatra-hello-world · GitHub)
- デプロイ先のパスは、「/home/vagrant/fuga」(今回はVagrantへのデプロイを確認するだけなので、上記パスにしています)
流れ
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の記述を修正・追加
- コメントアウトしてある以下の2つをアンコメント
- require 'capistrano/rbenv'
- require 'capistrano/bundler'
- rbenv用の以下の設定を追加
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は動作したままでした)。
設定ファイル
補足部分も含め、以下の通りです。
- Vagrant + Berkshelf + Capistrano 3 時のVagrantfile
- thinkAmi/Capistrano_v3-example · GitHub (今回の例の、「capistrano\fuga」直下を入れました)