Rails

2015-07-05, capistrano rails

かなりずるい配備方法

Gitのmasterブランチにpushして、レビューとかテストを通ったものを配備する、というのがcapistranoのデプロイですが、思いっきり処理を端折った配備タスクを作りました。一見ややこしいですが、指定したサーバにrsyncでローカルのファイルを送っているだけです。

config/deploy/development.rb
server 'example.jp', user: 'username', roles: %w{web}
lib/capistrano/tasks/sync.rake
desc 'Sync files directly. (Only for development stage)'
task :sync do
  break unless fetch(:stage) == :development
  roles(:all).each do |s|
    n = ""
    host = s.hostname
    path = "./"
    rpath = fetch(:deploy_to)+"/current/"
    puts "Syncing files to #{host}:#{rpath}."
    puts `rsync -avz#{n} --delete --exclude "tmp" --exclude "log" --exclude ".git" #{path} #{host}:#{rpath}`
    # env = "development"
    # puts `ssh #{host} "cd #{rpath} && bundle install"`
    # puts `ssh #{host} "cd #{rpath} && bundle exec rake db:migrate RAILS_ENV=#{env}"`
  end
end

以下のように実行します。

$ cap development sync

Mac上にVagrantを立ち上げて開発をしていますが、Railsプロジェクト上のrakeコマンドはbundleが揃ってないと実行できないため、ここに開発用のタスクを定義すると、Vagrant上でしか実行できなくなってしまうんですね。Mac側だとmysqlやImageMagick絡みのgemがインストールし辛いため、ちょっとした作業の度「vagrant up」が面倒でした。ところがcapコマンドの方はbundleの状態に関わらず実行できるため、ここに実装するとお手軽です。

参考URL

この記事は役に立ちましたか?