Forráskódkezelés és folytonos integráció

Szoftveres projektek során szisztematikus módszerek alkalmazása és az automatizálás nagyban növeli a készülő szoftver minőségét. Ilyen módszerek közé tartoznak az ezen gyakorlat keretében megismerhető technikák is:

Verziókezelő rendszerek

A verziókezelő rendszerek a szoftver forráskód különböző korábbi verzióinak könnyű kezelését teszik lehetővé. Használatuk támogatja a csapaton belüli együttműködést és javítja a fejlesztő csapat hatékonyságát. Mindezeken túl egy olyan központi tárolóként (repository) használható, melyre a fordítás automatizálása és a folytonos integrációs rendszerek épülhetnek.

A szoftver verziókezelő architektúrájának kialakítására két különböző megközelítés terjedt el:

Jelenleg a Git a legnépszerűbb verziókezelő rendszer, ezért a tárgy keretében ennek megismerésével foglalkozunk.

Git alapok

Egy fejlesztés aktív folyamata egy Git ág (branch) keretében történik, amely fájlok elkülönített létrehozását, módosítását és törlését jelenti. Ezen elemi módosításokat hozzáadhatjuk/eltávolíthatjuk az aktuális módosításokat tartalmazó indexhez/indexből és végül véglegesíthetjük (commit) azt.

A fejlesztés során több párhuzamos ágat használhatunk, amelyek összeolvasztásával (merge) és elágáztatásával (branch) halad előre a fejlesztés. A Git komplex elágaztatási modellt kínál, amelyben ágak létrehozhatók (create), módosítások tehetők egy-egy ágon, majd végül a különböző módosításokat tartalmazó ágak összeolvaszthatók.

A véglegesített (committed) módosítások a helyi és távoli tárolók között szinkronizálhatók, a távoli tárolóból a helyibe a pull (letöltés (fetching) és összeolvasztás (meging)) művelet segítségével, míg a helyi tárolóból a távoliba a push művelet keretében.

További részletesebb információk és parancssori példák megismeréséhez elolvasandó a Git Lectures Page vagy a Basic Git Tutorial oldal. (A két segédanyag egyike kötelezően elolvasandó az órára való felkészüléshez).

Git munkafolyamatok

Több bevált munkafolyamat modell is létezik csapaton belüli együttműködésre, amellyel a szisztematikus fejlesztés megvalósítható a fejlesztői csapatokon belül.

A tantárgy keretében ezen GitHub Flow munkafolyamat modellt használjuk, ami a következő lépésekből épül fel:

  1. Az új funkciók számára új ág létrehozása
  2. A szükséges módosítások elvégzése, véglegesítése ezen az ágon.
  3. A módosításokat tartalmazó pull request létrehozása, amelyet egy csapattag ellenőrizhet.
  4. Egyeztetés folytatása és ennek megfelelő módosítások megtétele a pull request kapcsán.
  5. Az elfogadott pull request beolvasztása a master ágba.

Fordítás automatizálás

Komplex szoftveres projektek fordítása kihívásokkal teli feladat. Különböző modulok és köztes fordítási termékek elkészítése, a függőségek nyilvántartása és integrációs fordítás létrehozása szisztematikus módszert kíván.

Kezdetekben a Make volt az egyetlen fordítást támogató eszköz. Később jelent meg az Ant, ami már több szabadságot biztosított a fordítási folyamat definiálása során, végül az Ivy integrálásával pedig bevezetésre került a függőségek kezelése is.

A Maven volt a következő fordítás automatizálási megoldás, amelyet elsősorban Java projektekben használtak fel. A fordítás két aspektusát célozta meg: egyrészt leírja, hogyan épül fel a fordítási folyamat, másrészt definiálja a függőségeket. Az Ant eszközhöz képest a Maven konvenciókat ajánl a fordítási folyamathoz, ezáltal csak a kivételes eseteket kell kezelni. A Maven vezette be elsőként a függőségek internetről való letöltésének lehetőségét, ami már önmagában megreformálta a szoftver fordításról alkotott képet.

A Gradle már kifejezettem nagy, több-projektes fordítások kezelését biztosítja. Az Ant és a Maven alapjaira épül, kombinálja mindkét eszköz előnyeit és a fordítási konfiguráció leírására bevezetett egy Groovy-alapú szakterület-specifikus nyelvet a korábban használt XML-alapú leírókkal szemben. Ennek eredményeként a Gradle szkriptek áttekinthetőbbek, mint az Ant vagy Maven leírásai. Ezeken túl a Gradle inkrementális fordítási megoldást is kínál, melynek keretében intelligensen érzékeli, hogy mely fordítási lépéseket nem kell újból végrehajtani, mert nem történt változás.

Ezen gyakorlat keretében a Maven megoldást használjuk Java projektek fordítására.

Folytonos integráció

A folytonos integráció alatt legtöbbször az integrációs, fordítási és tesztélési lépések gyakori, akár naponta többszöri végrehajtását értjük. Ez egy folyamat, ami a verziókezelő rendszeren alapul és a fordítás, tesztelés és telepítés lépéseken vezet végig.

Egy folytonos integrációt biztosító keretrendszer a folyamat különböző eszközeinek menedzselt végrehajtását biztosítja és a létrehozott köztes fordítási termékeket kezeli.

Ezen gyakorlat keretében a Travis-t használjuk, hogy a folytonos integrációs keretrendszerek alapjait megismerjük.

Travis

A Travis a legtöbb esetben magától tudja, hogy mit kell csinálnia. Például, amennyiben létezik egy pom.xml fájl, a Travis kitalálja, hogy a projektet Maven segítségével kell lefordítani és tesztelni. A Travis szorosan integrálódik a Git szolgáltatásaival, emiatt más verziókezelők használata esetén nem a legjobb választás. Bármikor, amikor a kód a tárolóba kerül (push) ezt a Travis érzékeli és a változtatásoktól függően elvégzi a feladatokat. Probléma esetén e-mailben értesít, vagy létezik integrációs lehetőség bármilyen más kommunikációs csatornához (pl. Slack).

A Travis CI beüzemelése egy projekt esetén a következő lépésekből áll:

  1. Regisztrálni kell a Travis CI oldalon.
  2. A saját GitHub tárolók aktiválása a Travis profil oldalon.
  3. A .travis.yml fájl hozzáadása a tárolóhoz.
  4. Egy git push utasítással elindítjuk az első fordítást.

Az órára való felkészüléshez ezen további segédletek elolvasása szükséges:

További opcionális olvasnivalók