1. 程式人生 > 其它 >部署之使用 mina 來部署 Ruby on Rails 應用之進階

部署之使用 mina 來部署 Ruby on Rails 應用之進階

技術標籤:文章分享ruby on railsruby

1. 編寫Mina tasks

Mina是一個強大的部署工具,mina setupmina deploy只是mina工具中的兩個tasks。Mina還提供了各種tasks。用mina tasks可以列出所有的task。我們也可以編寫我們自己的task。

例如檢視生產環境的日誌。

desc "Shows logs."
task :logs do
  queue %[cd #{deploy_to!}/current && tail -f log/production.log]
end

desc "Display the unicorn logs."
task :unicorn_logs do queue 'echo "Contents of the unicorn log file are as follows:"' queue "tail -f #{deploy_to}/current/log/unicorn.log" end

如果你的命令要加sudo的話,那可以這樣寫。

desc "Display the cron log"
task :cron_log do
  queue "sudo tail -f /var/log/syslog | grep CRON"
end

其他例子

desc "Display the redis memory information"
task :redis_memory do
  queue 'redis-cli info memory'
end

desc "Display the redis statues information"
task :redis_stats do
  queue 'redis-cli info stats'
end

desc "Using request-log-analyzer display production log"
task :request_log_analyzer do invoke :'rbenv:load' queue! "cd #{deploy_to}/#{current_path} && BUNDLE_GEMFILE=#{bundle_gemfile} #{bundle_prefix} request-log-analyzer #{deploy_to}/current/log/production.log" end

2. 編寫Mina puma服務

使用actioncable時,需要開啟websocket的伺服器,這個gem是用bundle exec puma -p 28080 cable/config.ru來部署的,但我們需要結合Mina來自動部署。

其實是有mina-puma這個gem的,只是不能直接拿來用,這個gem的原始碼很簡單,我仿照它的原始碼寫了個部署指令碼。

set :puma_cmd, -> { "#{bundle_prefix} puma" }
set :puma_pid, -> { "#{deploy_to}/#{shared_path}/pids/puma.pid" }
set :puma_state, -> { "#{deploy_to}/#{shared_path}/pids/puma.state" }
set :pumactl_cmd, -> { "#{bundle_prefix} pumactl" }
set :puma_env, -> { fetch(:rails_env, 'production') }
set :pumactl_socket, -> { "#{deploy_to}/#{shared_path}/tmp/sockets/pumactl.sock" }
set :puma_socket, -> { "#{deploy_to}/#{shared_path}/tmp/sockets/puma.sock" }

desc 'Start puma'
task :puma_start => :environment do
  queue! %[
    if [ -e '#{pumactl_socket}' ]; then
      echo 'Puma is already running!';
    else
      cd #{deploy_to}/#{current_path} && #{puma_cmd} -q -d -e #{puma_env} -b 'unix://#{puma_socket}' -S #{puma_state} --pidfile #{puma_pid} --control 'unix://#{pumactl_socket}' #{deploy_to}/#{current_path}/cable/config.ru
    fi
  ]
end

desc 'Stop puma'
task :puma_stop => :environment do
  queue! %[
    if [ -e '#{pumactl_socket}' ]; then
      echo 'Puma is stopping!'
      cd #{deploy_to}/#{current_path} && #{pumactl_cmd} -S #{puma_state} stop
      rm -f '#{pumactl_socket}'
    else
      echo 'Puma is not running!';
    fi
  ]
end

desc 'Restart puma'
task puma_restart: :environment do
  invoke :'puma_stop'
  invoke :'puma_start'
end

程式碼很容易看懂,原理也簡單,都是利用命令。

3. 其他各種外掛

Mina的官方github的readme頁面有列出了各種第三方外掛。這些外掛原始碼都很簡單,使用起來也方便,都是幾條命令就可以搞定的。

只是有個地方要注意的是,在新增gem到Gemfile檔案的時候,是要這樣新增的gem 'mina-xxx', require: false

值得一提的是這個外掛mina-multistage,它能讓你部署多個線上應用環境。例如你可以用test.aa.com作為線上的測試環境,www.aa.com才是真實生產環境。這個gem能處理好這件事。

完結。