使用mina自動化部署Rails應用

Mooooon發表於2017-12-14

使用mina自動化部署Rails應用

為什麼需要自動化部署?

因為我懶啊!!!

簡介

mina是rails社群中流行的部署方案,允許你用Ruby DSL描述部署過程,mina生成一份指令碼在目標伺服器上執行。除了Ruby以外,也支援shell指令碼,所以可定製性非常高。相比於老牌的Capstrino,mina一次性上傳所有指令碼到目標伺服器執行,效率上會高一些。

核心步驟與原理

mina setup生成目標伺服器上的資料夾結構

mina deploy進行部署

mina會自動從設定好的git倉庫拉程式碼,執行bundle/migration等一系列流程,然後重啟伺服器

簡單對比

手動部署

  1. git pull

  2. bundle install

  3. rake db:migrate

  4. rake assets:precompile

  5. restart web server

自動部署

  1. mina deploy

一條命令就可以跑完整個釋出流程。當然前提是你的deploy task寫的天衣無縫,這需要對rails與linux有一定了解才可以做到。

舉個栗子


require 'mina/bundler'

require 'mina/rails'

require 'mina/git'

require 'mina/rvm'

set :domain, '121.42.12.xx' #你的伺服器地址或域名

set :deploy_to, '/var/www/api' #你打算把專案部署在伺服器的哪個資料夾

set :repository, 'git@github.com:xxx.git' #git倉庫

set :branch, 'master' #git分支

set :term_mode, nil  #mina的小bug,設為nil可以解決

set :shared_paths, ['config/sidekiq.yml', 'config/database.yml', 'config/secrets.yml', 'log', 'shared'] #很關鍵,這幾個資料夾會在多次部署間,通過符號連結的形式共享

set :user, 'moon' #ssh 使用者名稱

task :environment do

invoke :'rvm:use[ruby-2.1.0-p0@default]' #ruby 版本

end

task :setup => :environment do  #初始化task,建立資料夾結構

queue! %[mkdir -p "#{deploy_to}/#{shared_path}/log"]

queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/log"]

queue! %[mkdir -p "#{deploy_to}/#{shared_path}/config"]

queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/config"]

queue! %[mkdir -p "#{deploy_to}/#{shared_path}/shared"]

queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/shared"]

queue! %[touch "#{deploy_to}/#{shared_path}/config/database.yml"]

queue! %[touch "#{deploy_to}/#{shared_path}/config/secrets.yml"]

queue  %[echo "-----> Be sure to edit '#{deploy_to}/#{shared_path}/config/database.yml' and 'secrets.yml'."]

if repository

repo_host = repository.split(%r{@|://}).last.split(%r{:|\/}).first

repo_port = /:([0-9]+)/.match(repository) && /:([0-9]+)/.match(repository)[1] || '22'

queue %[

if ! ssh-keygen -H  -F #{repo_host} &>/dev/null; then

ssh-keyscan -t rsa -p #{repo_port} -H #{repo_host} >> ~/.ssh/known_hosts

fi

]

end

end

desc "Deploys the current version to the server."

task :deploy => :environment do

to :before_hook do

end

deploy do #部署流程

invoke :'git:clone'

invoke :'deploy:link_shared_paths'

invoke :'bundle:install'

invoke :'rails:db_migrate'

#invoke :'rails:assets_precompile'

invoke :'deploy:cleanup'

invoke :start

to :launch do

queue "mkdir -p #{deploy_to}/#{current_path}/tmp/"

queue "touch #{deploy_to}/#{current_path}/tmp/restart.txt"

end

end

end

desc "start puma & sidekiq"

task :start => :environment do

queue "cd #{deploy_to+"/current"}"

queue "sidekiq -e production -d"

queue "puma -e production"

end

複製程式碼

相關文章