Was ist vcdeploy?

vcdeploy ist ein in PHP geschriebenes Skript, welches für die Steuerung von PHP Projekten verwendet wird. Als Backend wird ein SCM System wie Git, Bazzar oder Subversion verwendet.

Wieso vcdeploy?

Ich habe mich dazu entschlossen dieses Skript öffentlich, inklusive Quellcode anzubieten, da ich mir davon verspreche dadurch dem Skript mehr Stabilität und Sicherheit zugeben.

Wie läuft sowas normalerweise in einem Projekt? Es werden sich Gedanken gemacht, wie und mit was man das Deployment umsetzt. Anit, Phing, Capistrano u.s.w. kommen ins Gespräch. Bevor man sich dann an die “eigentliche” Lösung macht, fängt man letztendlich mit einem Bash-Script an (böse Gerüchte sind sogar verbreitet, dass manche Projekte noch händisch deployt werden). Und irgendwie bleibt man dann auch beim Bash Script, weil keine Zeit, kein weiteres Budget existieren oder was auch immer fehlt.

Das Bash Skript wächst und wird irgendwann auch sehr unübersichtlich. Tests für dieses Skript gibt es natürlich meist auch nicht. Und hier setzt vcdeploy ein. Um sich den Durchlauf der Bash-Entwicklung zu ersparen, wird hier PHP für das Deploy eingesetzt. Da es für PHP Projekte gedacht ist, sollte ja auch PHP auf den entsprechenden Rechnern vorhanden sein. vcdeploy ist bewusst einfach gehalten, um den Einstieg leicht zu machen. Da das Projekt in PHP entwickelt wurde, können die Entwickler auch ohne große Einarbeitung ein Plugin für vcdeploy schreiben.

Und das beste daran ist, man muss nicht von ganz vorne anfangen, wie es beim Deployment oft der Fall ist (was meine Erfahrung mir gezeigt hat).

Funktionsumfang

  • Unterstützung von CVS, SVN und GIT Repositories
  • Verwaltung der Systemkonfiguration über SCM
  • Zurücksetzen der Datenbank
  • Einrichtung einer neuen Systemumgebung (automatisiert)
  • Protokollierung
  • Benachrichtigung per Email (z.B. bei Fehlverhalten während des Deploys)
  • Einfache Erweiterung durch eigene Plugins

Vorteile durch den Einsatz

  • Formaler Prozess des Deployment wird klar definiert
  • Automatisiertes Deployment
  • Getestetes Skript - vcdeploy wird bereits eingesetzt und hat sich schon in der Praxis bewährt. Wohingegen ein neues Skript, was speziell für ein Projekt angefertigt wird, erst eine gewisse Stabilität erlangen muss.

Vorhandene Plugins

Sämtliche Funktionalität wird über Plugins verfügbar gemacht. Plugins können beliebig ergänzt und kombiniert werden. Im folgenden werden die einzelnen Plugins von vcdeploy vorgestellt, die jeweils als Kommando über vcdeploy verwendet werden können. Jedes Kommando hat eigene Parameter, die verwendet werden können. Um eine Liste der Verfügbaren Parameter zu erhalten, verwendet man vcdeploy COMMAND -h

backup-clear

Hiermit werden alle bestehenden Backups nach Spezifkation gelöscht. In der Konfigurationsdatei wird mit der Variablen $conf[‘backup_max_days’] festgelegt, wie lange ein Backup Satz aufbewahrt wird (Standard ist 7 Tage).

backup-db

Optionen:

  -p project, --project=project     Create backup of this project
                                    database(s)
  -d database, --database=database  Only create backup of this database
  -A, --all-databases               Create backup of all existing databases
  -h, --help                        show this help message and exit

Wird der Parameter -A übergeben, werden von allen bestehenden Datenbanken auf dem Server Backups erstellt. Hierbei wird für jede Datenbank eine eigene Datei erzeugt. Mit dem Parameter -p werden Datenbanken zu einem bestimmten Projekt erzeugt. Mit dem Parameter -d wird von einer spezifischen Datenbank ein Backup erstellt. Wir kein Parameter übergeben, werden von allen Datenbanken, welche Projekte zugeordnet sind, ein Backup erstellt.

Alle Backups werden in dem Verzeichnis abgelegt, welches mit

$conf['backup_dir']

in der Konfigurationdatei hinterlegt wurde (Standard /srv/backups).

backup-files

Es werden Backups zu den in der Konfigurationsdatei hinterlegten Verzeichnissen/Projekten angelegt.

backup-ls

Listet die vorhanden Backup-Sätze auf.

backup-rsync

Führt ein Backup über Rsync aus.

command-ls

Listet alle benutzerdefinierten Kommandos auf, die in der Konfigurationsdatei hinterlegt wurden.

command

Für einen benutzerdefinierten Befehl aus.

init-system

Wenn eine neue Linux Umgebung eingerichtet wird, kann man mit diesem Plugin automatisch Verzeichnisse anlegen und eine Liste von Paketen (deb, rpm) installieren. Besonders wenn Virtualisierung eingesetzt wird, ist dies eine sehr hilfreiche Funktion.

permission

Mit dem Befehl permission werden Dateiberechtigungen und Besitzer gesetzt. Dieser Befehl sollte nur für Dateien und Verzeichnisse verwendet werden, die keinen Projekt angehören (da für Projekte stattdessen rollout verwendet werden sollte).

Die Berechtigungen werden über den Array

$conf['permissions']

festgelegt, indem folgende Schlüssel verwendet werden:

  • name = Dateiname oder Verzeichnisname (absoluter Pfad!)
  • rec = yes (falls rekursiv), files (rekursiv, aber nur auf Dateien anwenden) dirs (rekursiv, aber nur auf Verzeichnisse anwenden) oder no (nicht rekursiv, standard)
  • mod = die zu setzende Berechtigung (z.B. 664)
  • own = der zu setzende Besitzer

name ist mit mod/own erforderlich.

Beispiel:

$conf['permissions'][0]['name'] = '/www/htdocs';
$conf['permissions'][0]['rec'] = 'files';
$conf['permissions'][0]['mod'] = 664;
$conf['permissions'][0]['own'] = 'www-data:www-data';
$conf['permissions'][1]['name'] = '/www/htdocs/sites/default';
$conf['permissions'][1]['mod'] = '550';

Dadurch wird im Verzeichnis /www/htdocs rekursiv allen Dateien (nicht Verzeichnissen) die Berechtigung 664 (Besitzer darf schreiben und lesen, Gruppe darf schreiben und lesen) zugewiesen und der Besitzer www-data mit der Gruppe www-data zugewiesen. Dem Verzeichnis /www/htdocs/sites/default wird die Berechtigung 550 zugewiesen (nicht rekurzsiv).

release-create

release-ls

Listetet alle vorhanden Releases auf.

reset-db

Ersetzen einer lokalen Datenbank durch einen SQL Dump, der auch von einem externen Rechner automatisch generiert werden kann (mit Hilfe einer SSH Verbindung).

reset-dir

Synchronisiert Dateien und Verzeichnisse mit einem externen System oder einen Datendump. reset-dir setzt als letzten Arbeitsschritt noch die Dateiberechtigungen, falls diese zum Projekt hinterlegt sind. Wird der Parameter -P verwendet, wird dieser Arbeitsschritt ausgelassen.

rollout-all

Führt ein rollout und ein rollout-system hintereinander aus.

rollout-system

Die Konfigurationsdateien werden über ein SCM (wie GIT oder SVN) gepflegt. Mit rollout-system wird diese Konfiguration auf dem System aktiviert. Es können dazu auch bestimmte Dienste gelistet werden, die nach dem Deploy einen Restart benötigen, welche dann automatisch durchgeführt werden.

Über $conf[‘system_source’] wird festgelegt, welches Verzeichnis als Quelle für den Rollout-Vorgang verwendet wird. Mit $conf[‘source_scm’] wird festgelegt, welches SCM zum Einsatz kommt (git, svn, bzr, cvs oder static). Wird static verwendet, wird keine Aktualisierung des Quellverzeichnisses voransgestellt, sondern die vorhandenen Dateien nur auf das Zielsystem ausgerollt. Dabei werden die Dateien aus dem Quellverzeichnis nach / kopiert. Es muss also die Verzeichnis-Hierarchie im Quellverzeichnis erstellt werden, wie sie auf dem Zielsystem zum Einsatz kommen.

rollout

Führt ein Rollout durch. Wird kein weiterer Parameter angegeben, werden alle aktiven Projekte ausgerollt. Alle vorhandenen Parameter für rollout sind:

vcdeploy rollout -h
rollout a new release

Usage:
  /Users/alex/www/system/vcdeploy/vcdeploy [options] rollout [options]

Options:
  -p project, --project=project  Rollout this project only (if skipped, all
                                 projects will be rolled out)
  -t tag, --tag=tag              Use this tag for rollout. If no tag is set
                                 with this option, default is used
                                 [rollout][tag]
  -d, --with_db                  Rollout database with this release
                                 (overwrites [rollout][with_db]
  -D, --without_db               Do not create database dump file with this
                                 release (overwrites [rollout][with_db]
  -f, --with_data                Create data dump with this release
                                 (overwrites [rollout][with_data]
  -F, --without_data             Do not create data dump with this release
                                 (overwrites [rollout][with_data]
  -b, --with_backup              Create a backup before the rollout
                                 (default with setting
                                 without_backup=FALSE)
  -B, --without_backup           Do not create a backup before the rollout
                                 (default with setting without_backup=TRUE)
  -P, --without_permission       Do not apply specified permissions
  -h, --help                     show this help message and exit

Mit “rollout” kann von Tarballs oder direkt aus dem SCM ausgerollt werden. Jeder Rollout kann durch pre_commands oder post_commands erweitert werden: die pre_commands werden vor dem eigentlich Rollout ausgeführt (z.B. um einen Serverdienst neu zu starten), die post_commands werden nach dem Rollout ausgeführt.

Die einzelnen Aktionen, die beim Rollout in dieser Reihenfolge ausgeführt werden:

1) Ausführung aller pre_commands Es werden alle Befehle auf Shell Ebene ausgeführt, die sich im Array $project[‘mein-projekt’][‘rollout’][‘pre_commands’] befinden. Die Reihenfolge der Ausführung richtet sich nach der Position des Befehls im Array.

2) Ausrollen des Codes aus SCM oder Tarball

3) Datenbank Rollout Sofern die Einstellung $project[‘mein-projekt’][‘rollout’][‘with_db’] gesetzt wurde oder diese über die Kommandozeile überschrieben wurde, werden alle Datenbanken ausgerollt, die mit $project[‘mein-projekt’][‘db’] festgelegt werden. db kann der Name einer Datenbank sein oder ein Array mit Namen. Für die Zugriffe auf den Datenbankserver werden die Berechtigungen des aktuellen Shell Benutzer verwendet. Der Shell Benutzer benötigt somit Zugiffe auf alle Datenbanken, die mit dem rollout verwendet werden. Sofern der Benutzername zum Datenbankserver von dem des Shell Benutzers abweicht, kann mit einer .my.cnf Konfigurationsdatei gearbeitet werden (auch um Hostnamen und Kennwort festzulegen).

4) Dateien Rollout Sofern die Einstellung $project[‘mein-projekt’][‘rollout’][‘with_data’] gesetzt wurde oder diese über die Kommandozeile überschrieben wurde, werden alle Verzeichnisse/Dateien ausgerollt, die mit $project[‘mein-projekt’][‘data_dir’] festgelegt werden. data_dir kann auf einen Verzeichnis oder einer Datei verweisen - oder auf einem Array mit Verzeichnissen/Dateien.

5) Dateiberechtigungen setzen Sofern zum Projekt ein Permissions Array zugeordnet wurde, wird dieser hier verwendet: $project[‘mein-projekt’][‘permissions’]

6) Ausführung aller post_commands Es werden alle Befehle auf Shell Ebene ausgeführt, die sich im Array $project[‘mein-projekt’][‘rollout’][‘post_commands’] befinden..Die Reihenfolge der Ausführung richtet sich nach der Position des Befehls im Array.

rollout setzt als letzten Arbeitsschritt noch die Dateiberechtigungen, falls diese zum Projekt hinterlegt sind. Wird der Parameter -P verwendet, wird dieser Arbeitsschritt ausgelassen.

Einsatz für Aktualisierung vieler Repositories mit einem Befehl

Um nur eine Aktualisierung des Codes aus mehreren Repositories durchzuführen, muss zu jedem Projekt der Projektpfad hinterlegt sein. Ein Beispiel zur Konfiguration sieht wie folgt aus:

// vcdeploy configuration

// overwrite git path to git binary
$conf['git_bin']       = '/opt/local/bin/git';

// log file for vcdeploy
$conf['log_file'] = '/Users/alex/vcdeploy.log';

// project configurations
$project['_common_']['scm']['type'] = 'git';

# Repository deployments
$project['xhprof']['path'] = '/Users/alex/www/system/lib/xhprof';
$project['gitosis']['path'] = '/Users/alex/www/gitosis-admin';
$project['redmine']['path'] = '/Users/alex/www/redmine';
$project['redmine']['scm']['type'] = 'svn';
$project['textmate-drupal']['path'] = '/Users/alex/Library/Application Support/TextMate/Bundles/php-drupal.tmbundle';

Es werden in dem Beispiel 5 Repositories aktualisiert. Dies bedeutet, da 4 Repositories Git als SCM verwenden, wird in jedem Verzeichnis ein git pull ausgeführt. Der Schlüsselname im Projekt-Array dient nur zur Identifikation des Projektes und muss sich somit bei jedem Projekt unterscheiden. Das Projekt redmine verwendet SVN als SCM, dafür muss der SCM Typ überschrieben werden.

Dies ist der einfachste Anwendungsfall für den “rollout” Befehl.

setup-drupal

Installiert mit Hilfe von drush als Backend eine Drupal Instanz. Hierzu können sogenannte pre_commands vor der Installation durch Drush und post_commands nach der Installation ausgeführt werden. setup-drupal setzt als letzten Arbeitsschritt noch die Dateiberechtigungen, falls diese zum Projekt hinterlegt sind. Wird der Parameter -P verwendet, wird dieser Arbeitsschritt ausgelassen.

Hier eine Übersicht der Parameter dazu:

Options:
  -P, --without_permission  Do not apply specified permissions
  -h, --help                show this help message and exit

Arguments:
  project  Name of project to setup
  command  Name of subcommand
           - reset-files: clear private and public download directories
           - reset-settings: copy drupal settings.php to target directory
           - reset-db: drop and create database to cleanup
           - install: install drupal
           - reset: run 'reset-settings', 'reset-files' and 'reset-db'
           - reinstall: run 'reset-settings', 'reset-files' and 'install'

status

Zeigt Informationen zu vcdeploy und dem System an.

system-log

Voraussetzungen

  • PHP CLI muss auf allen Rechner vorhanden sein, auf dem das Skript ausgeführt werden soll
  • Ein SCM (GIT, SVN oder CVS)
  • Grund-Erfahrung mit der Konsole

Installation

Der Source-Code kann von GitHub bezogen werden:

git clone git://github.com/alexandermeindl/vcdeploy.git

Nun noch die Konfigurationsdatei einrichten. Es gibt mehrere Möglichkeiten, wo diese Datei abgelegt wird:

  • im selben Verzeichnis wie das vcdeploy Skript, die Konfigurationsdatei muss dann config.inc.php heißen.
  • im Verzeichnis /etc mit dem Namen vcdeploy.inc.php - also /etc/vcdeploy.inc.php
  • im Home-Verzeichnis des Benutzers, der vcdeploy ausführt mit dem Namen .vcdeploy.inc.php - also ~/.vcdeploy.inc.php

Die Priorität der verwendeten Dateien entspricht dieser Auflisten. Als Ausgangskonfigurationsdatei kann eine Kopie der Datei config.inc.php.dist verwenden, indem man diese kopiert:

cp config.inc.php.dist config.inc.php

Nun kann man sich an die Arbeit machen und die Konfiguration festlegen. Globale Einstellungen kann man in der Datei lib/config_default.inc.php einsehen, wobei man diese Datei nicht verändern sollte, sondern stattdessen die gewünschten Einstellungen in der config.inc.php überschreibt.

Um das Skript auch außerhalb des Skriptverzeichnisses aufrufen zu können, empfielt es sich das Skriptverzeichnis im PATH mit aufzunehmen. Das kann durch folgende Anweisung erledigt werden:

echo 'export PATH="/pfad/zum/vcdeploy/verzeichnis:$PATH"' >>~/.bashrc
source ~./bashrc

Eigenes Plugin schreiben

<?php

/**
 * @file
 *
 * Beispiel eines neuen Plugins
 *
 */

$plugin['info']       = 'Meine Plugin-Beschreibung';
$plugin['root_only']  = TRUE; // für dieses Plugin sind root-Rechte erforderlich

class vcdeploy_plugin_sample extends vcdeploy {

  /*
   * Die Methode run wird automatisch ausgefuehrt, wenn das Plugin verwendet wird
   */
  public function run() {

   // Hier beliebigen PHP Code schreiben

   // Einen Test ausgeben
   $this->msg('Das gibt mein Beispiel Plugin aus.');

   // Einen Systembefehl ausführen
   $this->system('tar -cfz /root/tmp.tar.gz /tmp');
  }
}

Die Klasse dieses Plugins heißt vcdeploy_plugin_sample. sl_deploy_plugin_ muss immer als Präfix verwendet werden und dies erweitert mit dem Namen des Plugins. Hier im Beispiel wird “sample” verwendet, was wiederum bedeutet, dass die Datei unter plugins/plugin_sample.class.php abgespeichert werden muss. Ruft man nun vcdeploy -h auf, wird das neue “sample” Plugin auch in der Hilfe aufgelistet:

vcdeploy - version controlled deployment script powered by
https://alphanodes.com

Usage:
  /www/system/vcdeploy/vcdeploy [options]
  /www/system/vcdeploy/vcdeploy [options] <command> [options] [args]

Options:
  -v, --verbose      turn on verbose output
  -d, --debug        turn on verbose output
  -q, --quit         suppress messages (expect error message)
  -p, --projects     show list of all active projects
  -P, --allprojects  show list of all projects (active and inactive)
  -h, --help         show this help message and exit
  --version          show the program version and exit

Commands:
  backup-clear    remove old backups
  backup-db       Create database backup. If no database name is specified
                  a backup of all databases will be created
  backup-files    Create backup of files
  backup-ls       List all available backups
  backup-rsync    Rsync backup files with remote system
  command-ls      List all available commands
  command         run commands
  init-system     initial a new system environment
  permission      set file and directory permissions
  release-create  Create a new release. If no project is specified, for all
                  projects a new release will be created
  release-ls      List all available releases
  reset-db        Reset database. If no project is specified, all active
                  project databases will be reseted
  reset-dir       Reset directory. If no project is specified, all active
                  projects files/directories will be reseted.
  rollout-all     Run rollout, rollout-system and permission plugins
  rollout-system  rollout system files/configuration
  rollout         rollout a new release
  setup-drupal    Setup a drupal installation
  status          status messages and information of vcdeploy environment
  system-log      log system changes
  sample          Meine Plugin-Beschreibung

Die Ausführung des neuen Plugins erfolgt nun mit folgendem Befehl:

vcdeploy -p sample

Fallbeispiele für den Einsatz

Deploy der Produktivumgebung

Produktv/Staging Datenbank auf Entwicklersystem übertragen

Pflege der Systemkonfiguration

Einfaches Aktualisieren mehrerer Repositories mit einem Befehl

Systemkonfigurationen protokollieren

Weitere Ressourcen

Projektmanagement Services, Deployment Coaching und Consulting

Unser Projektmanagement Team aus München hat Experten für Drupal und PHP. Wir erstellen ein individuelles Konzept für das reibungslose Deployment Ihrer Plattform und helfen dabei, dieses in Ihrem Projekt umzusetzen. Kontaktieren Sie uns unverbindlich.

Aktualisiert: