# gem search capistrano # gem install capistrano # cap --version
# mkdir capistrano # cap install mkdir -p config/deploy create config/deploy.rb create config/deploy/staging.rb create config/deploy/production.rb mkdir -p lib/capistrano/tasks create Capfile Capified (abbr)
list all available tasks
# cap -T cap deploy # Deploy a new release cap deploy:check # Check required files and directories exist cap deploy:check:directories # Check shared and release directories exist cap deploy:check:linked_dirs # Check directories to be linked exist in shared cap deploy:check:linked_files # Check files to be linked exist in shared cap deploy:check:make_linked_dirs # Check directories of files to be linked exis... cap deploy:cleanup # Clean up old releases cap deploy:cleanup_rollback # Remove and archive rolled-back release cap deploy:finished # Finished (abbr)
# cap -h
Install capistrano in a project:
bundle exec cap install [STAGES=qa,staging,production,...]
Show available tasks:
bundle exec cap -T
Invoke (or simulate invoking) a task:
bundle exec cap [--dry-run] STAGE TASK
Advanced options:
-h, -H, --help Display this help message.
-f, --rakefile [FILENAME] Use FILENAME as the rakefile to search for.
-T, --tasks [PATTERN] Display the tasks (matching optional PATTERN) with descriptions, then exit.
-t, --trace=[OUT] Turn on invoke/execute tracing, enable full backtrace. OUT can be stderr (default) or stdout.
-r, --roles ROLES Run SSH commands only on hosts matching these roles
-z, --hosts HOSTS Run SSH commands only on matching hosts
cap production console ROLES=web cap staging console
cap -t production deploy BRANCH=test
cap --hosts=server1,server2 production deploy HOSTS=server1,server2 cap production deploy
cap --roles=app,web production deploy ROLES=app,web cap production deploy
Capfile
require 'capistrano/console'
config/deploy/STAGE.rb
config/deploy/production.rb
config/deploy/staging.rb
server 'localhost'
server 'example.com', roles: [:web, :app]
server 'db.example.com', user: 'deploy', roles: %w{db}
server 'localhost', user: 'vagrant', roles: %w{web}
role :web, %w{host1 host2}
capistrano/config/deproy.rb
capistrano/lib/capistrano/tasks/***.rake
#cap test:show_hostname # Show hostname
namespace :test do
desc 'Show hostname'
task :show_hostname do
on roles :all do
execute 'hostname'
end
end
end
require "capistrano_colors"
desc "test"
namespace :deploy do
task :test1 do
run "pwd"
run "echo \"Hello Servers!\""
end
end
within /tmp/test do
ls -l /tmp/test
end
if test "[ ! -e /tmp/test ]"
touch /tmp/test
end
desc 'upload file'
task :upload_file do
on roles(:app) do |host|
if test "[ ! -e #{shared_path}/.env ]"
upload!('../.env.example', "#{shared_path}/.env") # .env
execute 'echo ".env uploaded!"'
end
end
end
desc 'uptime test'
task :uptime do
#local
run_locally do
output = capture "uptime"
end
#remote
on roles(:web) do
output = capture "uptime"
end
end
task :deploy => :archive do
archive_path = fetch :archive_absolute_path
archive_name = fetch :archive_name
release_path = File.join(fetch(:deploy_to), fetch(:application))
on roles(:web) do
unless test "[ -d #{release_path} ]"
execute "mkdir -p #{release_path}"
end
execute "cd #{release_path}; tar -zxvf #{archive_name}"
project_dir = File.join(release_path, capture("cd #{release_path}; ls -d */").chomp)
launch = capture("cd #{project_dir}; ls bin/*").chomp
end
end
deploy.rb
#sequence
module SSHKit
class Coordinator
private
def default_options
{ in: :sequence, wait: 1 }
end
end
end
module SSHKit
class Coordinator
private
def default_options
{ in: :groups, limit: 5 }
end
end
end