部署之使用 mina 來部署 Ruby on Rails 應用之進階
阿新 • • 發佈:2020-12-28
1. 編寫Mina tasks
Mina是一個強大的部署工具,mina setup
和mina 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能處理好這件事。
完結。