Deployment mit Capistrano

Bin gerade dabei, mal was anderes ausser Datenbanken zu machen. 😉
Momentan beschäftige ich mich mit Capistrano, als Tool zum deployen. Funktioniert tatsächlich sehr einfach, auch wenn man keine Ahnung von Ruby hat und keine Ruby-Applikation deployen möchte (da funktioniert es noch einfach).
Wer Phing / Ant … kennt, dem fällt der Einstieg sehr einfach.
Toll ist, dass man damit Skripte gleichzeitig per SSH auf mehreren Servern ausführen kann.

Die Idee bei mir ist, das Deployment in mehrere Phasen zu unterteilen:
1. Erstellen eine Paketes aus den vorhandenen Sourcen
2. Verteilen der Sourcen des Paketes auf die einzelenen Webserver
3. Live schalten der neuen Version

Um Capistrano ans laufen zu bekommen, muss man zuerst eine Ruby Umgebung und Capistrano installieren.
Danach in einem Verzeichnis deiner Wahl capify aufrufen und es werden zwei Dateien erzeugt: Eine Capfile und eine config.cab im Unterorder config.
Ich habe es so gehandhabt, dass ich meine Konfiguration in die Config Datei und die Tasks in das Capfile gepackt.
Als Testumgebung hatte ich 3 VMs. Soweit funktioniert alles (SSH-Keys müssen natürlich authorized sein).

So, hier mal der Inhalt der beiden Dateien. Ich denke, dass das ziemlich für sich selber spricht. Falls nein, gerne fragen!
Ich hoffe es hilft!

Config:
[code]
set :application, „MyApplication“
set :repository, „http://pathToMercurial“

set :release_branch, „default“

set :repo_path, „/tmp/release“
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 :web, „capistrano3“, „capistrano2“
role :staging, „capistrano2“
role :build, „capistrano1“
[/code]

Capfile:
[code]
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 „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 „cd #{sync_path}; tar xfjP #{package_path}/release-#{version}.tar.bz2“
end

desc „Rsync to tmp_www folder“
task :rsync, :roles => :web 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 : STAGING : move tmp_www and www
namespace :deploy_staging do
desc „Cyclic move“
task :move, :roles => :staging 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

# PHASE 4 : STAGING : move tmp_www and www
namespace :deploy_live do
desc „Cyclic move“
task :move, :roles => :web 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]

GD Star Rating
loading...

Kommentar verfassen