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:

  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <project name="HelloPhing" default="hello" basedir="." description="hello phing">  
  3.     <target name="hello">   
  4.         <echo msg="Hello Phing!" />  
  5.     </target>  
  6. </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:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project name="TestProject" default="info" basedir="." description="Phing test project">  
  3.     <property name="info"         value="Phing test project" />  
  4.     <property name="src"          value="src" />  
  5.     <property name="tests"        value="tests" />  
  6.     <property name="docs"         value="docs" />  
  7.     <property name="build"        value="build" />  
  8.     <property name="ftp.host"     value="test.server.hu" />  
  9.     <property name="ftp.port"     value="21" />  
  10.     <property name="ftp.username" value="username" />  
  11.     <property name="ftp.password" value="password" />  
  12.     <property name="ftp.dir"      value="~/www/" />  
  13.     <property name="ftp.mode"     value="ascii" />  
  14.       
  15.     <target name="info">  
  16.         <echo msg="${info}"/>  
  17.     </target>  
  18.       
  19.     <target name="test">  
  20.         <phpunit printsummary="true" haltonfailure="true">  
  21.             <batchtest>  
  22.                 <fileset dir="${tests}">  
  23.                     <include name="*Test.php" />  
  24.                 </fileset>  
  25.             </batchtest>  
  26.         </phpunit>  
  27.     </target>   
  28.       
  29.     <target name="docs">  
  30.         <delete dir="${docs}" includeemptydirs="true" verbose="true" failonerror="true" />  
  31.         <mkdir dir="${docs}" />  
  32.           
  33.         <phpdocext  
  34.             title="TestProject"  
  35.             destdir="${docs}"  
  36.             sourcecode="true"  
  37.             output="HTML:Smarty:default"  
  38.         >  
  39.             <fileset dir="${src}">  
  40.                 <include name="*.php" />  
  41.             </fileset>  
  42.         </phpdocext>  
  43.     </target>   
  44.       
  45.     <target name="build">  
  46.         <mkdir dir="${build}" />  
  47.         <copy todir="${build}" includeemptydirs="true">  
  48.             <fileset dir="${src}">  
  49.                 <include name="*.php" />  
  50.                 <exclude name=".git" />  
  51.             </fileset>  
  52.         </copy>  
  53.     </target>  
  54.       
  55.     <target name="deploy">  
  56.         <ftpdeploy  
  57.             host="${ftp.host}"  
  58.             port="${ftp.port}"  
  59.             username="${ftp.username}"  
  60.             password="${ftp.password}"  
  61.             dir="${ftp.dir}"  
  62.             mode="${ftp.mode}"  
  63.         >  
  64.             <fileset dir="${build}">  
  65.                 <include name="*.php" />  
  66.             </fileset>  
  67.         </ftpdeploy>  
  68.     </target>  
  69.       
  70.     <target name="clean">  
  71.         <delete dir="${build}" includeemptydirs="true" verbose="true" failonerror="true" />  
  72.     </target>  
  73. </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:

  1. <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

inf · 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. :)