ugrás a tartalomhoz

Bevezetés a Phing használatába

kacsandiz · 2012. Dec. 14. (P), 02.11

Webes fejlesztéseink során egyszer eljön az a pont, amikor a kész weboldalt, webalkalmazást ki szeretnénk rakni egy teszt vagy éles szerverre, hogy mindenki megcsodálhassa a művünket. Ez a művelet általában több lépésből áll (forráskód felmásolása, adatbázis migráció, bizonyos szolgáltatások újraindítása), sokan nyűgnek érezhetik, illetve sok hibalehetőséget hordoz magában. Hasznos lenne, ha ezt a folyamatot nem mindig kézzel kellene elvégeznünk, hanem valahogy automatizálni tudnánk. Ebben nyújt számunkra segítséget a Phing.

A Phing

A magyarul kiejtve kissé vicces nevű alkalmazás (ejtsd ’ping’ – a szerk.) egy Apache Ant alapú PHP build eszköz, a segítségével automatizálhatjuk a webes fejlesztéseink élesítési (és egyéb folyamatait). Egy bonyolultabb webalkalmazás esetén ez a folyamat nagyon sok lépésből állhat, nézzünk pár példát:

  • karbantartás oldal elhelyezése
  • tesztek, kód analitikai eszközök lefuttatása az élesítendő kódon
  • JavaScript és stíluslap fájlok tömörítése, egyesítése
  • forráskód tömörítése, felmásolása FTP-n, SSH-n, vagy más csatornán keresztül
  • forráskód kitömörítése, elhelyezése a szerveren
  • adatbázis migrációk elvégzése
  • karbantartás oldal eltávolítása
  • szolgáltatások (webszerver, adatbázis szerver újraindítása)

A listát folytathatnánk a végtelenségig. Ha kézzel végezzük ezeket a lépéseket, az bizony elég időigényes lehet, ráadásul nagy az esélye, hogy valamit kifelejtünk, elrontunk, ami a műveletsor újrakezdésével járhat. Most nézzük, hogyan tudnánk ezt automatizálni.

Hello Phing

A Phinget PEAR-en keresztül tudjuk legegyszerűbben telepíteni, a következő parancsokkal:

pear channel-discover pear.phing.info 
pear install phing/Phing

Telepítés után adjuk ki konzolból a phing parancsot.

Amint látjuk nem történt semmi, a build.xml fájlt hiányolja. Hozzunk létre egy test/ (vagy tetszőleges nevű) könyvtárat, benne pedig egy build.xml fájlt, a következő tartalommal:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="HelloPhing" default="hello" basedir="." description="hello phing">
	<target name="hello"> 
		<echo msg="Hello Phing!" />
	</target>
</project>

Most az újonnan létrehozott könyvtárunkban adjuk ki a phing parancsot, aminek eredményeként a képernyőnkön a „Hello Phing!” üzenetnek kell megjelennie pár egyéb információ mellett.

A build.xml fájl

Az előzőekben létrehozott build.xml fájl egy szabványos XML fájl, ami a Phing által végrehajtandó műveleteket tartalmazza. A műveleteket csoportokba (úgynevezett targetekbe) szervezhetjük, ezeket külön-külön is futtathatjuk, illetve egy műveletcsoport lefutását függővé tehetünk egy másiktól. A <project> elem attribútumaként megadhatjuk a projekt nevét, egy rövid leírást, a forráskönyvtárat és a kezdő műveletcsoport nevét.

Nézzünk most egy bonyolultabb példát, amiben a következő műveleteket fogjuk elvégezni:

  • lefuttatjuk a projektünk egységtesztjeit
  • legeneráljuk a dokumentációt
  • egy külön build könyvtárba másoljuk a forráskódot a felesleges fájlok kivételével
  • FTP-n keresztül feltöltjük az alkalmazásunkat egy tárhelyre
  • töröljük a folyamat során létrejött fájlokat

Lássuk, hogy fog kinézni a build.xml-ünk:

<?xml version="1.0" encoding="UTF-8"?>
<project name="TestProject" default="info" basedir="." description="Phing test project">
	<property name="info"         value="Phing test project" />
	<property name="src"          value="src" />
	<property name="tests"        value="tests" />
	<property name="docs"         value="docs" />
	<property name="build"        value="build" />
	<property name="ftp.host"     value="test.server.hu" />
	<property name="ftp.port"     value="21" />
	<property name="ftp.username" value="username" />
	<property name="ftp.password" value="password" />
	<property name="ftp.dir"      value="~/www/" />
	<property name="ftp.mode"     value="ascii" />
	
	<target name="info">
		<echo msg="${info}"/>
	</target>
	
	<target name="test">
		<phpunit printsummary="true" haltonfailure="true">
			<batchtest>
				<fileset dir="${tests}">
					<include name="*Test.php" />
				</fileset>
			</batchtest>
		</phpunit>
	</target> 
	
	<target name="docs">
		<delete dir="${docs}" includeemptydirs="true" verbose="true" failonerror="true" />
		<mkdir dir="${docs}" />
		
		<phpdocext
			title="TestProject"
			destdir="${docs}"
			sourcecode="true"
			output="HTML:Smarty:default"
		>
			<fileset dir="${src}">
				<include name="*.php" />
			</fileset>
		</phpdocext>
	</target> 
	
	<target name="build">
		<mkdir dir="${build}" />
		<copy todir="${build}" includeemptydirs="true">
			<fileset dir="${src}">
				<include name="*.php" />
				<exclude name=".git" />
			</fileset>
		</copy>
	</target>
	
	<target name="deploy">
		<ftpdeploy
			host="${ftp.host}"
			port="${ftp.port}"
			username="${ftp.username}"
			password="${ftp.password}"
			dir="${ftp.dir}"
			mode="${ftp.mode}"
		>
			<fileset dir="${build}">
				<include name="*.php" />
			</fileset>
		</ftpdeploy>
	</target>
	
	<target name="clean">
		<delete dir="${build}" includeemptydirs="true" verbose="true" failonerror="true" />
	</target>
</project>

Magyarázat: A fájlunk elején definiáltunk pár tulajdonságot (<property>), hogy a későbbiekben könnyebben tudjuk ezeket módosítani. Ezután definiáltunk hat targetet: info, test, docs, build, deploy és clean. A különböző targeteket a phing [targetnév] paranccsal tudjuk futtatni, alapértelmezetten az info target fut le, ami nem csinál mást, mint kiír egy egyszerű üzenetet. A test target feladata, hogy a tests/ könyvtárban lévő PHPUnit teszteket lefuttassa, majd megjelenítse az eredményt. Megadtuk neki a haltonfailure attribútumot, ami annyit tesz, hogy a futás folytatódjon-e a tesztek sikertelensége esetén is. A docs target PHPDocumentor segítségével legenerálja a docs/ könyvtárba a dokumentációkat, a build egy build/ nevű könyvtárat hoz létre, majd abba másolja a forrásfájljainkat, a clean pedig törli a művelet során létrejött könyvtárat és fájlokat. Ami érdekesebb lehet, az a deploy, ez a megadott kapcsolati adatokkal felmásolja egy FTP szerverre a build/ könyvtárban lévő fájljainkat.

A build.properties fájl

Hogy egy kicsit szebbé, illetve hordozhatóbbá tegyük a build fájlunkat, az abban található paramétereket kiemelhetjük egy külön fájlba, ami a projekt specifikus adatokat tartalmazza. Hozzunk létre egy build.properties nevű fájlt a következő tartalommal:

info="Phing test project" 
src="src" 
tests="tests" 
docs="docs" 
build="build" 
ftp.host="test.server.hu" 
ftp.port="21" 
ftp.username="username" 
ftp.password="password" 
ftp.dir="~/www/" 
ftp.mode="ascii

Majd a build.xml fájlunk elején a <property>-ket cseréljük le erre a sorra:

<property file="./build.properties" />

Bár nem kötelező, de sokkal elegánsabb így, hogy a projekt beállításainkat elválasztottuk a build fájlunktól, és kiemeltük egy külön állományba.

Összegzés

Összességében elmondhatjuk, hogy a Phing egy nagyon hasznos kis eszköz, egyszerűen használható, sok időt és fáradságot spórolhat meg nekünk. A segítségével automatizálhatjuk a fejlesztéseink élesítési folyamatait, érdemes kipróbálnia mindenkinek, akár sok kis, akár egy nagy projekten dolgozik. A példákban található műveletek csak egy nagyon kis része annak, amire az alkalmazás képes, érdemes szétnézni a hivatalos oldalon, illetve beleolvasni a dokumentációba: http://phing.info.

 
1

Egyszerűen olyan hülyén cseng

inf3rno · 2012. Dec. 16. (V), 16.52
Egyszerűen olyan hülyén cseng magyarul a neve, hogy muszáj kipróbálni :D
3

+1

EL Tebe · 2012. Dec. 19. (Sze), 15.45
lehet hogy off, de nem hagyhattam annyiban a hozzászólásod:
:DDDD
2

vajon..

EL Tebe · 2012. Dec. 19. (Sze), 15.44
..vannak ehhez már előre gyártott buildek is?
Gondolok itt olyasmire, hogy pl. egy alap Drupal cms, vagy mondjuk egy Zend FW2 skeleton..? (mint pl a Composer+Packager-párosnál)
4

Hivatalos, vagy mások által

kacsandiz · 2012. Dec. 19. (Sze), 17.51
Hivatalos, vagy mások által készített gyűjteményről nem tudok, de ha beírod Google-ba, hogy "phing build file template", akkor lehet találni.

Egyébként sok értelmét nem látom, egyrészt nagyon egyszerű egy ilyen build fájl megírása, másrészt ezek a folyamatok nagyon különbözőek lehetnek, ahhoz, hogy ilyen általános sablon fájlokat készíteni lehessen.
5

kis projekteknél kevésbé tűnik érdekesnek

fagzal · 2012. Dec. 20. (Cs), 00.12
Az mindig gyanús egy kicsit, ha valamit annyira bonyolult deploy-olni, hogy egy git-pull, meg egy migrate.pl nem elég hozzá :)
6

Ennek a bejegyzésnek a célja

kacsandiz · 2012. Dec. 20. (Cs), 00.50
Ennek a bejegyzésnek a célja a Phing mint eszköz bemutatása, természetesen meg lehet ugyanezeket csinálni Capistrano-val, git hook-okkal, bash scriptekkel, saját célalkalmazással, vagy bármi mással.
Szerintem abban egyetérthetünk, hogy a példában bemutatott műveletek se nem bonyolultak, se nem életszerűtlenek, ettől függetlenül vannak azért weboldalak/webalkalmazások, ahol a git-pull és a migrate.pl nem lenne elég. :)