Continuous Deployment mit TYPO3 Surf Step by Step

Als Ergänzung zu dem bereits veröffentlichten Artikel Deployment mit TYPO3.Surf ist dieser Artikel zu verstehen. Es geht hauptsächlich um den grundsätzlichen Systemaufbau. Automatisches Deployment wird immer beliebter. Das hängt zum einen damit zusammen, dass die Tools einfacher werden und die Abhängigkeiten die eine Webapplikation mitbringt steigen. Im PHP Umfeld leistet composer (https://getcomposer.org) als Dependency Manager großartige Arbeit. Composer reicht allerdings in manchen Fällen nicht aus um eine Applikation auf dem Server zu aktualisieren, da evtl. noch ein Cache gelöscht werden soll oder die Datenbank aktualisiert werden muss.

Bei der Verwendung von TYPO3 Applikationen, egal ob Neos oder Flow habe ich bereits gute Erfahrungen mit TYPO3.Surf gemacht. Für TYPO3 CMS habe ich TYPO3.Surf noch nicht eingesetzt, jedoch sollte auch das möglich sein.

Aufbau der Systemumgebung

Ich entwickele lokal auf dem MacBook. Ich habe ebenfalls lokal einen Webserver sowie eine Datenbank installiert. Das könnte z.B. XAMPP sein. Der Quellcode liegt in einem GIT Repository. Daneben habe ich einen Testserver welcher aus dem Internet erreichbar ist. Das ist zur Zeit eine virtuelle Maschine auf einem zweiten Rechner der hier im Büro steht. In der Fritz Box sowie in Virtualbox habe ich die Ports so weitergeleitet, dass man von außen auf die virtuelle Maschine kommt. Damit ich nicht alle 24 Stunden eine neue IP Adresse herausgeben muss habe ich außerdem einen DynDNS Service genutzt. Meine Fritz Box ist so konfiguriert, dass diese den DynDNS Service über neue IP Adressen informiert.

In der virtuellen Maschine habe ich einen Apache Webserver installiert und konfiguriert. Außerdem ist dort eine Datenbank installiert. Die notwendigen Abhängigkeiten die meine Applikation noch mitbringen habe ich dort ebenfalls von Hand installiert. Da ich nicht eine zweite virtuelle Maschine dauerhaft auf dem Server laufen lassen wollte habe ich zusätzlich noch TeamCity installiert.

TeamCity ist ein Continuous Integration Server von Jetbrains. Auf die Konfiguration und genauen Funktionen von TeamCity werde ich in einem gesonderten Artikel eingehen.

TYPO3.Surf ist ebenfalls auf dem Server installiert. Dazu habe ich in einem Ordner der nicht aus dem Internet erreichbar ist ein TYPO3 Flow installiert. Die genauen Schritte hierzu habe ich in dem Artikel Deployment mit TYPO3.Surf beschrieben. Die Installation von TYPO3.Surf liegt also in meinem Fall auf dem selben Server wie die Webseite. Dies ist jedoch nicht unbedingt erforderlich. Der Server auf dem die Webseite läuft muss lediglich von dem Deployment Server erreichbar sein. Im Idealfall liegt ein SSH Key des Deployment Servers auf dem Webserver so dass die Authentifizierung mittels Public/Private Key stattfindet.

Ablauf Deployment

Wie läuft jetzt so ein Deployment auf den Webserver ab. Ich führe einen Commit in meiner IDE aus und Pushe die Änderungen zu Bitbucket. Ich arbeite mit Bitbucket, da es dort beliebig viele private Repositorys gibt solange die Teams nicht zu groß werden.

Der TeamCity Server ist so konfiguriert, dass er bei Änderungen im GIT ein Deployment ausführt. Ein Deployment heißt in diesem Fall, dass ein Shell Skript ausgeführt wird. Der Inhalt des Shell Skriptes ist der folgenden:

cd /home/smeier/surf
./flow surf:deploy mein-deployment

Es wird also in dem Verzeichnis gewechselt in dem das Deployment TYPO3 Flow installiert ist. In diesem Verzeichnis wird das Deployment durchgeführt. Dabei wird automatisch die Datenbank aktualisiert und der Cache gelöscht und beliebige weitere Dinge geändert die noch in der Deployment Config von TYPO3.Surf geändert werden.

Der Einsatz von TeamCity hat den Vorteil, dass ich noch weitere automatischen Tasks vor dem eigentlichen Deployment durchführen kann. Das können z.B. automatisierte Tests oder Code Analysen sein. Wie das genau funktioniert und was sonst noch alles möglich ist, werde ich in einem späteren Artikel beschreiben. Da stehe ich teilweise auch noch am Anfang und muss das selber erst einmal genau verstehen.