Capistrano – Multistage

So, ich hab jetzt noch ein bisle geschaut, wie man das ganze mit Capistrano eleganter machen kann.
Leider kann man nicht nur den default Task einer Rolle zuordnen, sondern muss die Rolle bei jedem Task zuordnen.
Dabei bin ich über die Multisatge Extension für Capistrano gestolpert.
Wie man die installiert, findet ihr (Normalerweise reicht gem install capistrano-ext).
Ansonsten gibt es bei mir folgende Dateien

Capfile:
[code]
load ‚config/deploy‘ # remove this line to skip loading any of the default tasks

# TASKS

desc „Check for version information“
task :version_check, :roles => :build do
unless exists?(:version)
raise „Version has to be set“
end
end

# PHASE 1 : build the package
namespace :build do
desc „Cleanup build_path“
task :cleanup, :roles => :build do
run „rm -rf #{build_path}“
run „mkdir #{build_path}“
end

desc „Get the contents of mercurial repo“
task :checkout, :roles => :build do
run „hg pull #{repo_path}“
run „cd #{repo_path}; hg update -C -r #{release_branch}“
end

desc „Copy only the stuff needed to build_path“
task :copy_to_build, :roles => :build do
run „cp -R #{repo_path}/* #{build_path}“
end

desc „Build the tar bzip“
task :pack, :roles => :build do
run „mkdir -p #{package_path}“
run „rm -f #{package_path}/release-#{version}.tar.bz2“
run „cd #{build_path}; tar cfjP #{package_path}/release-#{version}.tar.bz2 .“
end

task :default do
version_check
cleanup
checkout
copy_to_build
pack
end
end

# PHASE 2 : prepare the deployment
namespace :prepare do
desc „Cleanup sync path“
task :cleanup, :roles => :build do
run „rm -rf #{sync_path}“
run „mkdir #{sync_path}“
end

desc „Unpack tar gz to sync path“
task :unpack, :roles => :build do
run „mkdir -p #{sync_path}“
run „cd #{sync_path}; tar xfjP #{package_path}/release-#{version}.tar.bz2“
end

desc „Rsync to tmp_www folder“
task :rsync, :roles => :target do
build = find_servers :roles => :build
run „rsync -aqz -e ssh #{build}:#{sync_path}/* #{tmp_www_path}“
end

task :default do
version_check
cleanup
unpack
rsync
end
end

# PHASE 3 : move tmp_www and www
namespace :deploy do
desc „Cyclic move“
task :move, :roles => :target do
run „mv #{www_path} /tmp/tmp_www_2; mv #{tmp_www_path} #{www_path}; mv /tmp/tmp_www_2 #{tmp_www_path}“
end

task :default do
move
end
end
[/code]

config/deploy.rb
[code]
set :stages, %w(staging production)
require ‚capistrano/ext/multistage‘

set :release_branch, „default“

set :repo_path, „/home/repo“
set :build_path, „/tmp/build“
set :package_path, „/tmp/packages“
set :sync_path, „/tmp/sync“
set :tmp_www_path, „/tmp/tmp_www“
set :www_path, „/tmp/www“

role :build, „capistrano1“
[/code]

config/deploy/staging.rb

[code]
role :target, „capistrano2“
[/code]

config/deploy/production.rb

[code]
role :target, „capistrano2“
[/code]

Beim Aufrufen muss man nun noch die Stage mitgeben und schon wird nur auf die entsprechenden Systeme deployed: z.B. cap production deploy -s version=37

GD Star Rating
loading...

Kommentar verfassen