本機安裝 Capistrano:
gem install capistrano
初始化:
cap install
然後在 config/deploy/ 中設定各環境的主機位置等資訊.
在 config/deploy.rb 設定共同資訊 (application, repo_url, deploy_to, …), 其中要特別提到的有:
# Default value for linked_dirs is []
set :linked_dirs, fetch(:linked_dirs, []).push('node_modules')
# Default value for default_env is {}
set :default_env, { node_env: 'production' }
將 node_modules 設為 linked_dirs 可以避免每次 npm install 都重新安裝一樣的套件.
加入這些代碼, 就會在更新完程式碼後跑 npm install --production:
namespace :npm do
task :install do
on roles(:app) do
within release_path do
execute :npm, 'install', '--production'
end
end
end
end
before 'deploy:updated', 'npm:install'
在遠端主機上準備 <deploy_to>/shared/processes.json (自行替換 <deploy_to> 與 <application_name>):
{
"apps" : [{
"name" : "<application_name>",
"script" : "index.js",
"instances" : 0,
"exec_mode" : "cluster_mode",
"run_as_user" : "deploy",
"watch" : false,
"node_args" : "--harmony",
"merge_logs" : true,
"cwd" : "<deploy_to>/current",
"env": {
"NODE_ENV": "production"
}
}]
}
並且安裝好 pm2:
npm install -g pm2
回到本機, 在 deploy.rb 中加入:
namespace :pm2 do
task :start do
on roles(:app) do
within shared_path do
execute :pm2, 'start processes.json'
end
end
end
task :restart do
on roles(:app) do
execute :pm2, 'startOrReload <application_name>'
end
end
task :stop do
on roles(:app) do
execute :pm2, 'stop <application_name>'
end
end
end
after 'deploy', 'pm2:restart'
現在就可以使用 cap staging deploy 部署了.