capistranoでrailsじゃないものをdeployする

こんにちは,たにたにです.

Railsのデプロイツールとして有名なのがcapistranoですが,
TwitterのBotを更新するのにこれを使えないかと思って試行錯誤してみたので
忘れないうちにφ(..)メモメモ.

Botはユーザーストリームを取得してゴニョゴニョするので,ループをDaemonsでデーモン化する仕様にしていました.
Daemonsを使うと,ruby hoge.rb startとかruby hoge.rb stopという感じで
起動・停止できるので便利.
ただ,githubからpullして,sshでリモートログインして起動という作業をいちいち
やるのは面倒になので,どうにか一発でできないものかと思ってたどり着いたのが
capistranoでした.

capistranoをrailsアプリケーション以外で使うためのプラグインとして,
railsless-deployを使い,daemonsの起動・停止などを行うためのタスクをちょこっと追加しました.
各gemの使い方は別の記事を参考にしてね.

とりあえず,適当なプログラムを用意.目標は,これをリモート起動したりすること.

Daemons.run_proc('test',options) do
  loop do
    p "hello"
    sleep(1000)
  end
end

capistranoとそのプラグイン系のものは全部gemでインストールします.

$ gem install capistrano
$ gem install capistrano-ext
$ gem install capistrano_colors
$ gem install railsless-deploy

capistrano-extは環境別にデプロイでやることを変えられるようにするもの.
capistrano_colorsは実行結果をカラー表示にして見やすくしてくれるものです.

rvm-capistranoを使うとデプロイ時にRVM環境を構築することもできます.

capistranoを使うためには,capifyコマンドで初期化を行います.

$ cd /path/to/app/
$ capify .
[skip] './Capfile' already exists
[skip] './config/deploy.rb' already exists
[done] capified!

Capfileとconfigディレクトリが生成されます.
“./config/deploy.rb"に共通の設定,"./config/deploy/#{環境名}.rb"に環境ごとの設定を書き込んでいきます.

# ./config/deploy.rb
require 'capistrano/ext/multistage'
require 'railsless-deploy'

set :application, 'test application'
set :default_stage, 'development'

# デプロイ時にpullしてくるリポジトリの設定
set :repository,  'git@github.com:user/repo.git'
set :scm, :git

# sshでログインするユーザの設定
set :user, 'ssh_user'
set :use_sudo, false
default_run_options[:pty] = true
# ./config/deploy/development.rb

# デプロイ先の設定
role :app, "domain.net"
set :deploy_to, "/home/#{user}/workspace/test"

# Daemonsの起動など
namespace :daemons do
  desc "Daemons start"
  task :start, :roles => :app do
    run "cd #{current_path} && ruby test.rb start"
  end

  desc "Daemons stop"
  task :stop, :roles => :app do
    run "cd #{current_path} && ruby test.rb stop"
  end
end

after 'deploy:start', 'daemons:start'
after 'deploy:stop', 'daemons:stop'

もっとスマートに書ける気がする...

設定が終わったらデプロイして実際に起動してみます.

$ cap deploy
$ cap deploy:start

これで無事起動できていたらOK.