2012. január 18., szerda

Jenkins - Folyamatos integráció kialakítása

A folyamatos integráció egy olyan fejlesztési folyamat, ami hatékonyabbá teszi a csapatmunkában történő fejlesztést azáltal, hogy a fejlesztők gyakran (legalább naponta) és már a kezdetektől összeillesztik (integrálják) a kódjukat. A Continuous Integration arra a felismerésre épít, hogy a fejlesztés során a kódok integrációja a legproblematikusabb fázis és hogyha ezt korán lekezeljük akkor az esetleges problémák is gyorsabban javíthatóak lesznek!

A gyakorlatban ez úgy néz ki, hogy a fejlesztők bekommittolják a forráskód módosításaikat a verziókezelőbe, amiről a CI szerver értesül így frissíti a helyi kódbázisát majd lebuildeli a kódot és lefuttatja a teszteket, végül a build terméket kiteszi egy teszt szerverre ahol is a tesztelők egyből elkezdhetik a legfrissebb verzió tesztelését! Hibás build esetén a fejlesztők automatikusan visszacsatolást kapnak (email, sms, rss), így lehetővé válik a gyors beavatkozás a probléma elhárítása érdekében. Az értesítések mellett a CI szerverek lehetőséget adnak a buildek és a tesztek sikerességének időbeli követésére is egy dashboard-on keresztül.


Az előbb ismertetett folyamat akár manuálisan is elvégezhető lenne, azonban a CI szerverek segítségével ez kiválóan automatizálható és valóban egy gombnyomással minden elintézhető!

A piacon többféle kereskedelmi és open source CI szerver is megtalálható, a legelterjedtebb azonban mégis a Hudson ill. Jenkins a rengeteg rendelkezésre álló plugin-nak köszönhetően! Amikor az Oracle felvásárolta a SUN-t, a Hudson core fejlesztői létrehozták a Jenkins projectet, így a hasonlóság miatt a két CI szerver üzemeltetése és a konfigurálása szinte teljesen megegyezik.

Nemrég az én feladatom volt a céges folyamatos integráció bevezetése, így a következőkben megosztok egy-két hasznos tanácsot ezzel kapcsolatosan:
  • Hudson helyett használjunk inkább Jenkins-t, mivel az eredeti Hudson csapat fejleszti, dinamikusabban fejlődik és néhány plugin csak a Jenkins alatt érhető el!
  • Definiáljuk a JENKINS_HOME ill. JENKINS_BASE környezeti változókat!
  • A Jenkins jobok futtatását igény szerint állítsuk be kommitonként vagy napi egyszeri futtatáshoz (éjszakai build).
  • Archiváljuk a sikeres build termékeket (EAR, WAR) majd tegyük letölthetővé egy-egy link formájában.
  • Automatizáljuk a tesztek futtatását. (unit teszt, felületi teszt, integrációs teszt, performancia teszt)
  • Automatizáljuk a kód lefedettségi riportok futtatását.
  • Használjunk statikus kód ellenőrzőket a kódolási hibák kijelzésére és a cégen belüli kódolási konvenciók betartásához. (findbugs, pmd, checkstyle)
  • Sikertelen build esetére állítsunk be automatikus e-mail értesítőt, így a fejlesztők azonnal értesülnek a hibákról.
  • A webalkalmazás teszt szerverre történő telepítése után, hajtsunk végre egy egyszerű Smoke tesztet a telepítés sikerességének ellenőrzéséhez.
  • Aktiváljuk és használjuk a Jenkins security lehetőségeit.

Amennyiben a napi egyszeri build mellett döntünk, a web-alkalmazás telepítését követően érdemes automatizáltan lefuttatni egy 2-3 órás JMeter tesztet hétköznapi terhelést szimulálva, majd a teszt végén kigyűjteni a heap dump és verbose gc napló állományokat, melyeket a build termékek mellé is kirakhatunk, így szükség esetén gyorsan elővehetjük és analizálhatjuk. Sőt, a verbose gc információkból akár egyből egy diagramot is legenerálhatunk amit szintén betehetünk a build termékek közé!

Végül következzen egy-két hasznos Jenkins és Hudson plugin, amelyeket érdemes feltelepíteni:

A Jenkins további megismeréséhez és részletesebb konfigurációjához a Jenkins: The Definitive Guide ingyenesen letölthető e-könyvet ajánlom!

2012. január 4., szerda

Hasznos Eclipse pluginok Java alapú fejlesztéshez

Már elég régóta használok Eclipse-t a fejlesztéshez és mostanra összegyűlt pár hasznos plugin amiket mindig telepíteni szoktam, így most összeírtam ezeket. Az Eclipse Marketplace (Help/Eclipse Marketplace...) bevezetése óta, szerencsére a szükséges pluginok összevadászása is gyorsan megvan, nem kell sokat keresgélni.
JBoss, Hibernate és JSF alapú projectek fejlesztéséhez elengedhetetlen. Segítséget nyújt a projektek generálásához, kódok kiegészítéséhez, EJB-QL lekérdezések real-time teszteléséhez, JBoss ESB és JBPM-es fejlesztésekhez is.

JRebel plugin
A blogom olvasóinak gondolom nem kell bemutatnom a JRebel-t, nélkülözhetetlen eszköz Enterprise Java fejlesztéshez! A hozzákapcsolódó plugin megkönnyíti a telepítést és a konfigurálást is.

Eclipse Memory Analyzer plugin
Az EMA egy kiváló Java Heap analizáló kiterjesztés, ami segít a memory leak-ek megtalálásában, továbbá hasznos információkat szolgáltat arról, hogy milyen objektumok foglalják a memóriát! A legújabb fejlesztéseknek köszönhetően nemcsak SUN-os, hanem IBM Java-s heap dump-ot is analizálhatunk vele.
Log fájlok nézegetésére szolgáló plugin, a console view-hez hasonló működéssel. Erre a pluginra akkor volt szükségem amikor egy Websphere 6.1-es fejlesztésénél áttértünk a RAD folytonos belassulása miatt Eclipse-re és ott is fontos volt a napló állományok kényelmes követése. A plugin bevált, azóta is ezt használjuk!

Java Decompiler plugin (JAD)
Ez a tool lehetőséget ad a Java class fájlok visszafejtésére és analizálására. Hasznos lehet ha elveszett Java forrásainkat akarnánk a class fájlokból visszaállítani vagy ha egy nem open sorce Java library osztályainak tartalmába szeretnék betekintést nyerni! Van egy standalone verziója is JD-GUI néven.

Subclipse plugin
A népszerű Subversion-hoz (SVN) készült Eclipse plugin. Már régóta használom, gond nélkül működik.

FindBugs plugin 
A FindBugs felfedi a kódban a gyakori programozói hibákat, bad practice-eket és javaslatokat ad a kijavításukra. Pl.: objektumok összehasonlítása == operátorral; hashCode() nélküli equals() metódus; stb... Létezik még egy findbugs-contrib kiegészítő is, ami további hiba detektorokkal egészíti ki a keresést. Érdemes mind kettőt telepíteni!
A findbugs-hoz hasonló, potenciális Java hibák keresésére szolgáló plugin, ami segít megtalálni a nem optimális kódokat, lehetséges bugokat és a túlkomplikált kifejezéseket is. Jól paraméterezhető és egyszerűen szűkíthető a detektálandó hiba típusok köre, továbbá lehetőségünk van saját hiba detektáló kiterjesztéseket is beilleszteni! A PMD pluginhoz tartozik még egy paraméterezhető Copy-Paste-Detector (CPD), amivel segíthetünk kiiktatni ezt a rossz programozói szokást! :)

Checkstyle plugin
Szintén egy statikus kód ellenőrző plugin, azonban ezzel a kódolási standardokra fogalmazhatunk meg szabályokat. pl.: maximum 500 soros lehet egy Java osztály, legfeljebb 3 paramétere lehet egy metódusnak; a paraméternevek nem tartalmazhatnak ékezetes betűket; stb... A PMD-hez hasonlóan ez is jól paraméterezhető és egyedi szabályokkal is bővíthető.
Különböző metrikákat tudhatunk meg a kódunkról és az osztályok közötti csatolásról, melyeket grafikusan is megtekinthetünk! pl.: Ciklomatikus komplexitás; kohézió, stabilitás, stb...
A CodePro Analytix szintén egy hasznos tool amit a Google fejleszt. Az előbb említett statikus kód analizálók tulajdonságait ötvözi és kiegészíti kód lefedettség ellenőrzéssel valamint automatikus unit teszt generálással is, bár ez utóbbit azért kezeljük óvatosan! A statikus kód analizálók közül ez tekinthető a legteljesebbnek.


Érdemes még megnézni az Eclipse Marketplace toplistát, mert rátalálhatunk egy-két hasznos kiegészítőre! A jövőben még bővíteni fogom ezt a bejegyzést, így a későbbiekben is látogass majd vissza! .)