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能处理好这件事。
完结。