Deployment

Ein automatisches deployment lässt sich am einfachsten erreichen, wenn man build.xml file. Im der "name", welchen man im directory Tag definiert, wird gebraucht um über ANT das Script auszuführen. Wenn man also ein build.xml file hat, welches wie folgt aussieht, braucht man den unten dargestellten Aufruf.

<?xml version="1.0" encoding="UTF-8"?>
<project name="webapp" default="noop">
    <directory name="noop"/>
    <tstamp>
        <format property="timestamp" pattern="MM_dd_yyyy_HH-mm-ss" locale="de, DE"/>
    </tstamp>

    <!-- File variables-->
    <property name="filename" value="contact_form_${timestamp}.zip"/>
    <property name="build_dir" value="${basedir}/build"/>

    <!-- By default, we assume all tools to be on the $PATH -->
    <condition property="ext" value=".bat">
        <os family="windows"/>
    </condition>
    
    <directory name="deploy" description="get your Repository from GitHub to your build folder">
        <!-- Choose, which environment you want to deploy -->
        <input message="Which config should be used?"
               validArgs="test,staging,prod"
               addproperty="config"
        />
        <property file="${basedir}/config/ant.${config}.properties"/>

        <!-- Build project -->
        <antcall directory="build"/>

        <!-- Upload deploy.php -->
        <echo message="Uploading deploy.php ..."/>
        <scp file="${build_dir}/deploy.php"
        todir="${build.ftp.user}:${build.ftp.password}@${build.ftp.host}:${build.ftp.dir}"
        trust="true"/>

        <!-- Upload clean-up.php -->
        <echo message="uploading clean-up.php ..."/>
        <scp file="${build_dir}/clean-up.php"
        todir="${build.ftp.user}:${build.ftp.password}@${build.ftp.host}:${build.ftp.dir}"
        trust="true"/>

        <!-- Deleting clean-up.php and deploy.php -->
        <echo message="Deleting clean-up.php and deploy.php"/>
        <delete file="${build_dir}/clean-up.php" />
        <delete file="${build_dir}/deploy.php" />

        <!-- Upload zip-file -->
        <echo message="Uploading ${filename} ..."/>
        <scp file="${build_dir}/${filename}"
        todir="${build.ftp.user}:${build.ftp.password}@${build.ftp.host}:${build.ftp.dir}"
        trust="true"/>

        <!-- Delete old directories -->
        <delete dir="${build_dir}/master"/>
        <delete file="${build_dir}/master.zip"/>
        <delete file="${build_dir}/${filename}"/>


        <!-- Call deploy.php for zip-file -->
        <sshexec host="${build.ftp.host}"
                 username="${build.ftp.user}"
                 password="${build.ftp.password}"
                 command="cd ${build.ftp.dir};php deploy.php ${filename}"
                 usepty="true"
                 trust="true"
        />
    </directory>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

Der Aufruf über ANT:

ant deploy
1

In diesem Beispiel wird das Script folgende Sachen ausführen:

  • Eine Abfrage, welche Umgebung man verwenden möchte und das laden der entsprechenden Datei
       <input message="Which config should be used?"
               validArgs="test,staging,prod"
               addproperty="config"
        />
        <property file="${basedir}/config/ant.${config}.properties"/>
1
2
3
4
5
  • Danach wird die build Funktion des ANT-Scripts aufgerufen und diese ausgeführt. Diese lädt ein ZIP-File des aktuellen Masters von GitHub herunter, entpackt dieses, entfernt alle überflüssigen Dateien und verpackt es wieder als ZIP-File. Ebenfalls wird das deploy und clean-up PHP-Script in den Build Ordner verschoben.
        <!-- Build project -->
        <antcall directory="build"/>
1
2
  • Jetzt wird das deploy.php und das clean-up.php Script auf den Server geladen. Die Zugangsdaten für den Server hat das ANT-Script aus der zuvor geladenen ant.${config}.properties Datei. Nach dem Upload der Scripts werden diese lokal wieder gelöscht.
        <!-- Upload deploy.php -->
        <echo message="Uploading deploy.php ..."/>
        <scp file="${build_dir}/deploy.php"
        todir="${build.ftp.user}:${build.ftp.password}@${build.ftp.host}:${build.ftp.dir}"
        trust="true"/>

        <!-- Upload clean-up.php -->
        <echo message="uploading clean-up.php ..."/>
        <scp file="${build_dir}/clean-up.php"
        todir="${build.ftp.user}:${build.ftp.password}@${build.ftp.host}:${build.ftp.dir}"
        trust="true"/>
        
        <!-- Deleting clean-up.php and deploy.php -->
        <echo message="Deleting clean-up.php and deploy.php"/>
        <delete file="${build_dir}/clean-up.php" />
        <delete file="${build_dir}/deploy.php" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • Nachdem die Scripts auf dem Server aktualisiert wurden, wird nun der Upload des in dem Build-Script erstellten ZIP-Files durchgeführt.
        <!-- Upload zip-file -->
        <echo message="Uploading ${filename} ..."/>
        <scp file="${build_dir}/${filename}"
        todir="${build.ftp.user}:${build.ftp.password}@${build.ftp.host}:${build.ftp.dir}"
        trust="true"/>
1
2
3
4
5
  • Wenn das ZIP-File auf dem Server ist, werden die überflüssigen, lokalen Dateien gelöscht und der Code in dem deploy.php Script ausgeführt.
        <!-- Delete old directories -->
        <delete dir="${build_dir}/master"/>
        <delete file="${build_dir}/master.zip"/>
        <delete file="${build_dir}/${filename}"/>


        <!-- Call deploy.php for zip-file -->
        <sshexec host="${build.ftp.host}"
                 username="${build.ftp.user}"
                 password="${build.ftp.password}"
                 command="cd ${build.ftp.dir};php deploy.php ${filename}"
                 usepty="true"
                 trust="true"
        />
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Das ist alles, was in dem ANT-Script passiert. Jedoch wird in der deploy.php alles, was auf dem Server gemacht werden kann, ausgeführt. Das heisst, folgende Sachen erledigt das deploy PHP-Script:

  • release/ Ordner erstellen
  • Entpacken des ZIP-Files in den release/ Ordner
  • Den alten htdocs/ Ordner in htdocs_ZeitStempel/ umbenennen
  • release/ in htdocs/ umbennen
  • Das ZIP-File in ein backup/ Ordner verschieben
  • Angemessene Berechtigungen vergeben (könnte sonst Probleme mit der Webseite geben).
  • Anschliessend die Datenbank Migration ausführen (mit Phinx)
  • Das clean-up PHP-Script starten, welches alte und unnötige Dateien löscht, respektive in entsprechende Ordner aufräumt.