部署之使用 mina 来部署 Ruby on Rails 应用之进阶

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

完结。

猜你喜欢

转载自blog.csdn.net/weixin_39637597/article/details/111823784