世界上最伟大的投资就是投资自己的教育
部署之使用 mina 来部署 Ruby on Rails 应用之进阶 (八)
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 能处理好这件事。
完结。
本站文章均为原创内容,如需转载请注明出处,谢谢。
© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn
粤公网安备 44152102000088号 | 粤ICP备19038915号
Top