Ganz allgemein ist Capistrano ein Tool, um Vorgänge, die auf einem (oder mehreren) Servern ausgeführt werden zu automatisieren.
Die in Capistrano angelegten Vorgänge können dann mit einem Einzeiler angestoßen werden und laufen automatisch durch. Setzt man dies schlau ein, kann man sich eine Menge Arbeit ersparen.
Wir wollen Capistrano zum automatischen Deployen unserer Ruby-Anwendung benutzen. Unser Rubycode ist in einem Subversion eingecheckt und wird von dort aus auf den Webserver geschoben, sprich deployed.
Capistrano installieren
Die Installation von Capistrano ist denkbar einfach, denn es handelt sich, wie auch schon Rails selbst, um ein Gem:
gem -y install capistrano
Damit das funktioniert, muss RubyGems installiert sein, aber dafür haben wir ja im Rahmen unserer Ruby on Rails Installation gesorgt.
Der Schalter -y sorgt wieder dafür, dass alle Dependencies, also von Capistrano benötigte Gems, gleich mitinstalliert werden.
Capistrano einrichten
Der schwierige Teil ist die korrekte Konfiguration von Capistrano.
Das hat mich zig Stunden und einige Nerven gekostet.
Zunächst bewegen wir uns in der Shell in unser Ruby-Projektverzeichnis:
cd /kunden/12345_12345/webseiten/projekt
Dort aktivieren wir dieses Projekt für Capistrano mit folgender Zeile:
capify .
Im Verzeichnis config wurde eine Datei namens deploy.rb angelegt, welche zunächst wie folgt aussieht:
set :application, "set your application name here" set :repository, "set your repository location here" # If you aren't deploying to /u/apps/#{application} on the target # servers (which is the default), you can specify the actual location # via the :deploy_to variable: # set :deploy_to, "/var/www/#{application}" # If you aren't using Subversion to manage your source code, specify # your SCM below: # set :scm, :subversion role :app, "your app-server here" role :web, "your web-server here" role :db, "your db-server here", :primary => true
In dieser Datei verraten wir Capistrano ein paar Details über unser Projekt. So könnte die Datei dann fertig ausgefüllt aussehen:
set :application, "projekt" set :repository, "svn+ssh://ssh-12345-svn@scm.domain.de/kunden/12345_12345/svn-repository/projekt # If you aren't deploying to /u/apps/#{application} on the target # servers (which is the default), you can specify the actual location # via the :deploy_to variable: set :deploy_to, "/kunden/12345_12345/webseiten/#{application}" # If you aren't using Subversion to manage your source code, specify # your SCM below: # set :scm, :subversion # Wo liegt SVN? set :scm_command, "/kunden/12345_12345/bin/svn/bin/svn" default_run_options[:pty] = true role :app, "www.domain.de" role :web, "www.domain.de" role :db, "mysql5.domain.de", :primary => true
Wie man sieht, deployen wir zunächst nur auf einen einzigen Server. So, wie wir die Config hier sehen, wird sie jedoch nicht funktionieren, denn da wir es mit einem Managed Server zu tun haben, erfolgt der Zugriff auf die Datenbank in leicht abgewandelter Form. Wir müssen nun also, um Fehlermeldungen zu vermeiden, die Datenbank vom Deployment ausschließen. Dazu kommentieren wir die Zeile einfach aus:
#role :db, "mysql5.domain.de", :primary => true
Ist die aktuellste Version des Codes bereits im SVN eingecheckt, steht einem ersten Deployment direkt aus dem Repository nichts mehr im Wege!
Wir begeben uns in das Projektverzeichnis auf dem Server (/kunden/12345_12345/webseiten/projekt/) und geben folgendes ein:
cap deploy
Nun werden wir je Rolle (also einmal web, einmal application) nach dem Kennwort gefragt; da geben wir das des SSH-Accounts für unser SVN an und das Deployment läuft.
Fertig!
Haben wir alles richtig gemacht, ist unser Ziel erreicht:
Unsere Ruby on Rails Anwendung läuft unter Mongrel auf einem ManagedServer von Domainfactory und zieht sich seinen Code mittels Capistrano aus unserem Subversion-Repository, welches wir z.B. mit Ecplise befüllen.
Happy End.