Deployment mit Capistrano

Sep 2007
28

1 Kommentar(e)

Eingetragen von Martin Maciaszek

Ein Rails-Projekt mit Capistrano zu deployen ist eigentlich gar nicht so schwer. Es kann jedoch leicht passieren, daß man einen Schritt vergißt und dann erstmal dumm aus der Wäsche schaut. Deshalb habe ich mal kurze Anleitung hier geschrieben, wie der grundsätzliche Ablauf aussieht. Ich setze Capistrano 2.0 ein. Wer noch die Vorgängerversion (1.4.x) einsetzt sollte sein Gem updaten, um dieser Anleitung zu folgen.

Projekt capistranisieren

Um ein Rails-Projekt mit Capistrano zu deployen, brauchst du zu allererst das Capistrano-Gem. Dies kannst du mit gem install capistrano -y installieren. Auf dem Zielserver (auf den das Projekt deployed werden soll) benötigst du außerdem noch Subversion. Ich muß hoffentlich nicht extra erwähnen, daß ein Zugriff per ssh auf den Zielserver Pflicht ist? Damit sollte alles installiert sein, was du benötigte. Capistranisiere dein Projekt mit capify. In meinem Beispiel sieht dies so aus:

[~] capify /Users/fastjack/Sites/DrawBridge
[add] writing `./Capfile’
[add] writing `./config/deploy.rb’
[done] capified!

Auf die Plätze

In der config/deploy.rb mußt du Capistrano mitteilen, wohin es dein Projekt beim Deployment befördern soll. Die Konfiguration sieht bei mir in etwa so aus:

set :application, "DrawBridge"
set :repository,  "http://svn.meinserver.irgendwo/DrawBridge/trunk"

role :app, "192.168.1.182"
role :web, "192.168.1.182"
role :db,  "192.168.1.182", :primary => true

set :deploy_to, "/usr/local/www/frigg/#{application}"
set :use_sudo, false

namespace :deploy do
  desc "upload database configuration"
  task :add_database_configuration, :roles => :web do
    run "mkdir -p #{shared_path}/config"
    config = File.read(File.join(File.dirname(__FILE__), "database.yml"))
    put config, "#{shared_path}/config/database.yml"
    run "ln -s #{shared_path}/config/database.yml \
          #{latest_release}/config/database.yml"
  end

  after "deploy:finalize_update", "deploy:add_database_configuration"
end

Mit dieser Konfiguration wird Capistrano mein Projekt auf den Server mit der IP-Adresse 192.168.1.182 unter /usr/local/www/frigg/DrawBridge befördern. Capistrano wird hierzu einen Checkout mit Subversion durchführen. Der Subversion-Server sollte also vom Zielserver erreichbar sein. Zu guter Letzt wird noch die Datenbankkonfiguration von meinem Rechner auf den Zielserver kopiert (weil ich die Datenbankkonfiguration nicht in das Repository einchecke). Damit sollte auch klar sein, daß die config/database.yml einen Abschnitt für die production-Umgebung besitzen muß, der auf dem Zielserver funktioniert.

Damit Capistrano nach dem Deployment auch den Mongrel starten kann, brauchst du noch ein spin-Skript im scripts-Verzeichnis. Dieses sollte ausführbar sein und auch als ausführbar in Subversion (svn propset svn:executable on script/spin) markiert sein. Mein script/spin sieht so aus:

#!/bin/sh
script/process/spawner -a 127.0.0.1 -p 15000 -i 3

Damit werden 3 Mongrel-Server auf den Ports 15000-15002 gestartet, die nur auf Anfragen vom Localhost reagieren. Die Mongrels werden bei mir hinter einem Apache, der als Proxy fungiert, laufen, deshalb sind sie auch nur an den Localhost gebunden.

Fertig

Damit ist hoffentlich alles bereit, um das Projekt zu deployen. Mit cap deploy:check kannst du noch schnell prüfen, ob es irgendwelche schwerwiegenden Probleme gibt, die das Deployment behindern könnten. Warnmeldungen über ein Fehlendes releases-Verzeichnis kannst du dabei ignorieren, dies wird im nächsten Schritt angelegt. Nun ist es an der Zeit, das Deployment vorzubereiten. Mit cap deploy:setup läßt du Capistrano die noch fehlenden releases- sowie shared-Verzeichnisse anlegen. Überprüfe noch schnell, ob du auch wirklich alle lokalen Änderungen wieder ins Repository eingecheckt habst, sonst werden sie nicht auf den Zielserver gelangen.

Los!

Jetzt kann es losgehen. Mit cap deploy:cold startest du nun den Deploymentprozess. Dies dauert ein paar Minuten und endet hoffentlich damit, daß am Ende folgende Zeilen stehen:

[192.168.1.182] executing command
** [out :: 192.168.1.182] appending output to nohup.out
   command finished

Nun laufen 3 Instanzen des Mongrels und warten auf Anfragen vom Apache.

Herzlichen Glückwunsch. Dein Projekt wurde erfolgreich deployed. Lehn dich zurück und genieße ein erfrischendes (alkoholisches) Getränk.


1 Kommentar(e) zu Deployment mit Capistrano

  1. Daniel sagte:

    Sun Nov 18 18:30:24 UTC 2007

    Hey, danke dir für die Anleitung, das spin/script habe ich gleich bei mir einsetzen können!

    Viele Grüße,

    Daniel

Hinterlasse einen Kommentar