Budapest DevOps Meetup - Deployment, build and release management
-
Upload
andras-szabo -
Category
Technology
-
view
1.121 -
download
3
description
Transcript of Budapest DevOps Meetup - Deployment, build and release management
Confidential & Proprietary
Deployment, build and release management
Szabó András
2012.
Confidential & Proprietary
Áttekintés• Deployment rendszer
– Saját igényekhez készült egyedi megoldás– Könnyen a fejlesztési folyamatokhoz
igazítható– Egyedi komponensek (pl. flash kifrissítés)– PHP
• Build folyamatok• Release management
Confidential & Proprietary
Deployment rendszer
Confidential & Proprietary
DEMÓ
Confidential & Proprietary
Deployment rendszer célja
• Build folyamatok futtatása (pl. nyelvesítés, packaging)
• Forráskód eljuttatása a célszerverekre
• Rugalmas konfigurálhatóság• A szerverek változásainak gyors
követése• Monitorozás
Confidential & Proprietary
Deployment – kézi kifrissítés
Confidential & Proprietary
Deployment – centralizált
Confidential & Proprietary
Deployment - SCM• SCM: Source Code Management
– Centralizált– Aszinkron műveletek: gearman jobqueue– Fájlok frissítése rsync-kel többszálon– Pre/post-commit hookok– Több verziókezelőt támogat (svn, git)– Széleskörűen konfigurálható– Monitoring– Release management
Confidential & Proprietary
Rendszer felépítése• Központi szerver
– Repositoryk– Gearman jobqueue– Központi feldolgozók
• Kliens szerverek– Kliens feldolgozó
• Minden szervert rövid hosztneve alapján azonosítunk
• Szervereket csoportokba szervezzük
Confidential & Proprietary
Rendszer felépítése
Confidential & Proprietary
Központi szerver komponensei
• Verziótár hookok• Gearman jobqueue• Deployment feldolgozók (branch
típusonként egy)• Branch létrehozásra feldolgozók
(feature és release branchekre)• Válasz feldolgozó
Confidential & Proprietary
Verziótár hookok• Pre-commit/pre-receive hook
– Autentikáció (git httpn keresztül)– Php lint– Egyéb ellenőrzések
• Post-commit/post-receive hook– Változások lekérdezése– Deploy job feladása a queueba, ha ismert és
aktív branchbe volt kommit– Deploy job már minden szükséges adatot
tartalmaz
Confidential & Proprietary
Gearman jobqueue• Van hozzá natív PHP extension• Nincs címzés és csoportos küldés
– Egy adott névvel rendelkező job valamelyik arra a névre hallgató feldolgozóhoz kerül
• Képes a szinkron végrehajtásra, de ez nem működött megbízhatóan – amúgy is érdemesebb aszinkron folyamatkezelést megvalósítani
• Egy feladat újbóli feladásáról nekünk kell gondoskodnunk
• Perzisztens adattárolás (nem használjuk)
Confidential & Proprietary
Gearman jobqueue• Saját PHP lib épült a gyári megoldás
fölé– Feldolgozók közös interfészt kaptak– Stabil PHP démon megvalósítás a
feldolgozókhoz– Válaszok kezelésére általános megoldás– Címzés: job nevébe került a rövid
hosztnév, pl. “Scm.Synchronize:flash56”
Confidential & Proprietary
Gearman jobqueue• Felmerült problémák
– A feldolgozók egy idő után elárasztották a hálózatot “noop” üzenetekkel (valószínűleg bug) – rendszeres újracsatlakozás megoldotta a problémát
– Hiba esetén jobok újrafeladása: a feldolgozó réteg automatikusan kezeli
Confidential & Proprietary
Deployment feldolgozó• Working copy létrehozása/frissítése• Szükség esetén build cleanup (ant task)• Build futtatása• Prioritás alapján szervercsoportoknak
szinkronizálási feladat• Válaszok monitorozása• Cache-ek ürítésére (pl. APC flush) jobok
feladása
Confidential & Proprietary
Egyéb feldolgozók• Feature/release branch létrehozására
1-1 feldolgozó– Branch létrehozása a repositoryban– Igény szerint working copy létrehozása
(git esetében)
• Válaszok feldolgozása– Külön démon végzi, különböző
válaszjobokra van feliratkozva
Confidential & Proprietary
Kliens oldali kifrissítés• Egy feldolgozó (gyakran szűk
keresztmetszet)• Szinkronizálás job:
– Rsyncet futtat (nagyobb io/hálózati terhelés esesén lassú)
– Branch törlés/létrehozás– Fájljogosultságok (chown)– Éles release branch kiválasztása (symlink
váltás)• APC flush job (lokális url meghívása)
Confidential & Proprietary
Szerverek teljes kifrissítése
• Külön job• Hasznos új szerver üzembehelyezése
után vagy sokáig kiesett szerver frissítéséhez
• Szerverek kifrissítési állapotának ellenőrzése– Minden repository/branchhez
verzióellenőrzés
Confidential & Proprietary
Rendszer karbantartása• Update system script
– Kliensek ellenőrzése (státusz, verzió)– Kliensek frissítése (giten keresztül)– Kliensek leállítása– Kliensek státusza felületen
nyomonkövethető
• Feldolgozó démonok aktív figyelése– monit
Confidential & Proprietary
SCM monitor
Confidential & Proprietary
Konfiguráció• Fő egység a projekt
– Build konfiguráció, APC beállítások• Projekten belül több repository• Repositoryn belül branchek
– Minden branchnek egyedi kifrissítési konfiguráció (milyen szervercsoportok mely szervereire menjen a kifrissítés)
• Egy projekten belül több kifrissítési konfiguráció (pl. feature/release branchekre külön)
Confidential & Proprietary
Egyedi modulok• Flash alkalmazások kezelése
– Egyedi verziókezelés és deployment– Munka branchek, trunk/prelive/live
kontextek kezelése– Minden branchhez egyedi
verziókonfigurácók adhatóak meg– Könnyű visszaállási lehetőség
Confidential & Proprietary
Egyéb szolgáltatások• Virtuális branchek kezelése (symlinkelt
könyvtárak, pl. csapat release branch)• Deployment parancsok commit
messageből– APC flush vezérlése (pl. nagy terheléscsúcs)– Build előtt cleanup
• Live release rss feed• Lehet kommitokat lájkolni
Confidential & Proprietary
BUILD folyamatok
Confidential & Proprietary
Build folyamat célja• A rendszer gyorsítása előfeldolgozással• Feladatai:
– Js/css fájlok tömörítése, csomagolása– Dinamikus fordításhoz nyelvesítési adatok
kigyűjtése– Template-ek nyelvesítése– Statikus tartalmak verziózása– PHP osztályok összecsomagolása
• 10 nyelv mellett 30-60 sec között fut
Confidential & Proprietary
Nyelvesítés• Saját nyelvesítési rendszer• A build folyamat automatikusan
feltérképezi, milyen template milyen nyelvi elemeket használ
• Újrabuildelés csak a változott fájlok/változott nyelvi elemek alapján
• Dinamikus fordítások feldarabolása (nyelvenként ~160 kicsi adatfájl)
Confidential & Proprietary
js/css csomagolás, verziózás
• YUI Compressor js és css fájlokra• Oldaltípusonként külön js és css
csoportokat csomagolunk össze (pl. channel/dashboard)
• Minden statikus tartalom utolsó fájlmódosítási dátum alapján kap verziót
• Css fájlokba injektáljuk a verziókat• Statikus tartalmat nagyrészét nginx/cdn
szolgálja ki
Confidential & Proprietary
PHP osztályok csomagolása
• Saját framework osztályok• Leggyakrabban használt üzleti
logikát megvalósító osztályok• Összeállítása kézzel történik
(érdemes lenne rendszeresen monitorozni a hatékonyságot)
• Mérete: ~1Mb jelenleg
Confidential & Proprietary
Release management
Confidential & Proprietary
Release management• A jó folyamat kiválasztása erősen
termék és cégfüggő• Igazodnia kell a megrendelők
(termékmenedzserek) igényeihez• Ustream: számos azonnali módosítás
és gyorsjavítás – be kell tudni illeszteni a napi folyamatokba
Confidential & Proprietary
Régi út• Minden fejlesztés és tesztelés a
trunkban• Élesítés közvetlenül a stagebe
– Lassú élesítés– Nehézkes a visszahúzás– Trunk/stage környezet eltérése miatt
gyakori hibák
• Trunkban rengeteg halott kód gyűlt fel, egyre nehezebb a karbantartás
Confidential & Proprietary
Brancheljünk?• Fő ág a stage/master branch• Minden branch a fő ágból ágazik el• Feature branchek a fejlesztéshez,
elsőkörös QA-hoz• Release branchek az élesítés
előkészítéséhez, végleges QA-hoz• Élesítés csak a release branch
váltását jelenti, könnyű visszavonás
Confidential & Proprietary
Feature branchek• Minden fejlesztés kisebb-nagyobb
feature és csapat branchekben folyik• Csapat branchek főleg demózáshoz,
komponensek összeillesztéséhez, de rövid időn belül halott kódot tartalmazhatnak
• A termékmenedzserek felől érkező állandóan változó igények miatt nehéz a brancheket karbantartani
Confidential & Proprietary
Fokozatos refactoring• Branchelés helyett refaktorizálás a fő
ágban közvetlenül– Adott komponensben új absztrakciós
réteg bevezetése– Új üzleti logika megvalósítása– Fokozatos átállás az új megvalósításra– Ha a régi kódokat már semmi nem
használja, az absztrakciós réteg megszüntethető
Confidential & Proprietary
Élesítés folyamata• Release branch létrehozása (nem tag!)
– Tesztelés minél közelebb az éles rendszerhez
• Éles release branch váltás:– Nincs kiemelt esemény abban az időszakban
(pl. sokezer dolláros ppv adás)– CI buildek hiba nélkül futnak– QA-n átment– Szükség esetén sysop/backend csapat review
• Live váltás/rollback egy kattintás
Confidential & Proprietary
Élesítések ütemezése• SCM felületen a csapatok előre
felviszik az élesítési időpontokat• Scrum szerint dolgozó csapatok a
sprintek szerint release-elnek• Pl. backend csapat fix heti release-
eket csinál• Fontos módosítás esetén quickfix
release/élesbe kommitolás engedélyezett
Confidential & Proprietary
Élesítés naptár
Confidential & Proprietary
Continuous integration• Különálló Jenkins szerver
– Repository mirrorból dolgozik (gyors)– Branchenként külön jobok– Unit/db/integrációs/end-to-end tesztek
futtatása minden kommit után (gyors)– Nightly build: code coverage, statikus
analízis futtatás (lassú)– Párhuzamos buildek futattása izoláltan
(saját db, memcache pooling)
Confidential & Proprietary
Továbbfejlesztési irányok• Jelenleg sok adminisztrációs munka
– Release log karbantartása (JIRA ticketek alapján kigyűjthető)
• Pre-commit/release hook– JIRA ticketek ellenőrzése– Phpcs futtatás változott fájlokra
• Release folyamat jobbá tétele, folyamatos kód integráció
Confidential & Proprietary
KÖSZÖNÖM A FIGYELMET!Jöhetnek a kérdések.