Deployment mit Phing z.B. Joomla

Erstellung einer .tar.gz Datei für das Deployment


Oft möchte man für das Deployment bestimmte Dateien oder Verzeichnisse ausschließen, weil diese umgebungsspezifisch sind. Das jedes Mal per Hand zu machen ist sehr fehleranfällig. Unter anderem dafür verwendet man hierfür Buildtools. Phing ist im PHP-Bereich recht verbreitet.

Intern wird der Quelltext meist über die Versionskontrolle verwaltet. Man checkt den Quelltext aus. Passt die Konfigurationsdateien für die jeweilige Umgebung an. Und im Normalfall sollte man dann arbeiten können. Diese Anpassung erfolgt in den meisten Fällen über folgende Möglichkeiten:

  1. Zu der regulären Konfiguration, die keine sensiblen Informationen enthalten sollte, gibt es eine lokale Konfiguration. Dort werden die Werte, die spezifisch sind für eine Umgebung, eingetragen. Diese überschreiben die Basiskonfiguration.
  2. Umgebungsspezifische Werte werden aus den Umgebungsvariablen des Systems gelesen. Dies kann aus Umgebungsvariablen des Betriebssystems, der Serverkonfiguration oder .env Dateien geschehen.

Geht es ums Live-Hosting werden jedoch oft Quelltextpakete erstellt. Diese enthalten nur das was für den Live-Betrieb notwendig ist. Gründe hierfür können sein:

  1. Prozessbedingt sind für die Entwicklung und den Betrieb verschiedene Abteilungen zuständig. Diese haben jeweils immer nur Zugriff auf ihre Bereiche.
  2. Für das Live-Hosting wird ein Server verwendet, auf dem nur die allernötigsten Sachen installiert sind. Dazu zählt nicht die Versionskontrolle.
  3. Man hat ein eher kleines Hosting-Paket, das keine enge Integration in die Entwicklung erlaubt.

Natürlich kann man das auch weitgehend automatisieren. Hier hilft wieder die Kombination von Shell/Batch-Scripten und Phing.

phing-config.xml


<?xml version="1.0" encoding="UTF-8"?>

<project name="JoomlaDeployment" default="clean">

	<fail unless="projectName" message="Please provide a projectName." />
	<fail unless="dbHost" message="Please provide the database host." />
	<fail unless="dbName" message="Please provide database name." />
	<fail unless="dbUser" message="Please provide database user name." />
	<fail unless="dbPassword" message="Please provide database password." />
	<fail unless="projectDir" message="Please provide where the project is located." />
	<fail unless="baseBuildDir" message="Please provide the base build directory." />
	<fail unless="targetDir" message="Please provide a target directory." />

	<tstamp prefix="mytime"></tstamp>

    <property name="srcDirName" value="src" />
    <property name="dataDirName" value="data" />
    <property name="buildName" value="build_${projectName}_${mytime.DSTAMP}_${mytime.TSTAMP}" />
    <property name="buildDir" value="${baseBuildDir}/${buildName}" />
    <property name="srcDir" value="${buildDir}/${srcDirName}" />
    <property name="dataDir" value="${buildDir}/${dataDirName}" />
    <property name="archiveName" value="${buildName}.tar.gz" />
	
    <resolvepath propertyName="sourceDir" file="${projectDir}"/>	

    <!-- ============================================  -->
    <!-- Target: prepare                               -->
    <!-- ============================================  -->
    <target name="prepare">
        <mkdir dir="${buildDir}" />
        <mkdir dir="${srcDir}" />
        <mkdir dir="${dataDir}" />
    </target>	
	
    <!-- ============================================  -->
    <!-- Target: dump                                  -->
    <!-- ============================================  -->
    <target name="dump" depends="prepare">	
	    <echo msg="Dumping database ${dbName}" />
		<exec checkreturn="true" command="mysqldump  -h ${dbHost} -u${dbUser} -p${dbPassword} --default-character-set=utf8 --databases ${dbName}  > ${dataDir}/${dbName}.sql" />
	</target>	
	
    <!-- ============================================  -->
    <!-- Target: copy                                  -->
    <!-- ============================================  -->
    <target name="copy" depends="dump">	
        <echo msg="Copying files to build src directory ${srcDir}" />
		<copy todir="${srcDir}">
			<fileset dir="${sourceDir}">
				<include name="**"></include>
                <exclude name="**/.git/**"/>
                <exclude name="**/.svn/**"/>                
                <exclude name=".idea/**"/>
				<exclude name=".gitignore"/>
                <exclude name="cache/**"/>                <!-- has index.html -->
                <exclude name="tmp/**"/>                  <!-- has index.html -->
                <exclude name="administrator/cache/**"/>  <!-- has index.html -->
                <exclude name=".htaccess"/>
                <exclude name=".htpasswd"/>
                <exclude name="htaccess.txt"/>
                <exclude name="LICENSE.txt"/>
                <exclude name="README.txt"/>
                <exclude name="robots.txt.dist"/>
                <exclude name="web.config.txt"/>
			</fileset>
		</copy>		
		
		<copy file="${sourceDir}/cache/index.html" tofile="${srcDir}/cache/index.html" />
		<copy file="${sourceDir}/tmp/index.html" tofile="${srcDir}/tmp/index.html" />
	    <copy file="${sourceDir}/administrator/cache/index.html" tofile="${srcDir}/administrator/cache/index.html" />
		
        <echo msg="All source files copied." />		
    </target>
	
    <!-- ============================================  -->
    <!-- Target: pack                                  -->
    <!-- ============================================  -->
	<target name="pack" depends="copy">
		<tar destfile="${buildDir}/${archiveName}" compression="gzip">
			<fileset dir="${buildDir}">
				<include name="${srcDirName}/**"></include>
				<include name="${dataDirName}/**"></include>
   			</fileset>
		</tar>
    </target>	

	
    <!-- ============================================  -->
    <!-- Target: clean                                 -->
    <!-- ============================================  -->
    <target name="clean" depends="pack">
		<move file="${buildDir}/${archiveName}" tofile="${targetDir}/${archiveName}" overwrite="true"/>
		<chmod mode="0777">
			<fileset dir="${buildDir}" defaultexcludes="false">
				<include name="**" />
			</fileset>
		</chmod>
		
        <echo msg="Cleanup, delete build dir ${buildDir}" />
        <delete dir="${buildDir}" includeemptydirs="true" verbose="false" failonerror="true" />
	</target>
	
</project>

run.bat


echo off

set projectName="yourProject.com"
set dbHost="192.168.0.123"
set dbName="your_db_name"
set dbUser="your_db_user"
set dbPassword="super_geheim_123"
set projectDir="C:\htdocs\yourProject.com"
set baseBuildDir="G:\Build\joomla\yourProject.com"
set targetDir="G:\Deployment\archive"
set buildFile="G:\Projects\deployment-scripts\joomla\phing-config.xml"
set phingBinPath="C:\Opt\phing\phing.phar"

call php %phingBinPath% -f %buildFile% ^
-DprojectName=%projectName% ^
-DdbHost=%dbHost% ^
-DdbName=%dbName% ^
-DdbUser=%dbUser% ^
-DdbPassword=%dbPassword% ^
-DprojectDir=%projectDir% ^
-DbaseBuildDir=%baseBuildDir% ^
-DtargetDir=%targetDir%

Nachdem das Archiv auf den Zielserver geladen wurde kann es mit einem Shell, Perl-Script oder auch wieder mit Phing weiterverarbeitet werden. Backup machen, Archiv entpacken, SQL-Dump in die Datenbank einlesen und Quelltext an Zielort kopieren.

Zurück zur Kategorie: Dev-Ops
Zurück nach oben