Adatbazisfrissites GIT-tel

Fórumok

A cegnel ugy mukodik a fejlesztes, hogy van a dev repo, az lokalisan a gepemen (egyedul fejlesztek), van egy teszt, egy oktato es egy eles. Devrol pusholok tesztre, az post-receive checkoutol automatikusan, onnan oktatora, ott ugyanez, onnan pedig az elesre. Ott viszont nem checkoutol automatikusan, mert a site-frissites csak ejjel mehet ceges policy szerint, hogy tuti ne legyen fennakadas. Ekkor viszont mar nyilvan nem vagyok munkaban, szoval egy crontab bejegyzessel oldottam meg a checkoutot. Eddig rendben van, viszont itt jon a problema:

Teszten es oktaton tudom frissiteni az adatbazist checkout utan (alter table, create table, etc.), viszont az elesen nem. Pontosabban de, de akkor este 10-kor otthonrol fel kell masznom es ezzel kell foglalkoznom, ami nem biztos, hogy jo, mert megesik, hogy esetleg szeretnek valami mast csinalni szabadidomben, 10-kor pedig eselyes, hogy mondjuk egy buliban vagyok, amikor nem szeretnek ittas allapotban hazarohanni adatbazist frissiteni.

Szoval erre kellene valami megoldas. Ott tartok elmeletben, hogy csinalok egy filet, pl. sqlupdate.sql, amibe minden commit elott beleirom, mi valtozik, post-commit hookban pedig letorlom az egeszet, majd post-checkoutnal csinalok egy mysql < sqlupdate.sql.

Eddig ez viszonylag mukodokepesnek tunik, viszont van egy olyan problemam, hogy ha pl. csinalok egy olyat, hogy 12 commit utan pusholom ki elesre, mert tesztrol visszajon, hogy bugos, azokat kell fixelgetnem. A 12 commitbol lesz mondjuk 3-ban SQL script, tobbiben nem, akkor elvesztettem minimum kettot, ha az utolsoban nem volt, akkor mindharmat. Ezzel mit tudnek kezdeni? :) Vagy alapbol rossz a hozzaallasom esetleg?

Hozzászólások

Nézd meg, hogyan működik ez Rails-en, az egy nagyon elegáns megoldás. (Rails database migrations)

Egyébként meg úgy szokás (Magento pl), hogy van egy verziószáma minden modulnak és ha frissül a kód, akkor a régi és frissített között lévő update.sql parancsokat szépen sorban lefuttatja. Magento-ban mondjuk akkor, amikor észleli, hogy valaminek a verziószáma nem egyezik az adatbázisban lévővel.

--
http://sandor.czettner.hu
http://turaindex.hu

Látom a Magento-s példánál maradtunk. Ők egy adatbázistáblában tárolják a modulok neveit és a hozzá tartozó verziószámot. A modul tudja magáról, hogy éppen milyen verziószámmal fut (pl egy getVersion() method vagy konstans) A legközelebbi futásnál ha a kettő eltér, akkor végigcsinálja az update-t.

Rails esetén az egészet az ORM végzi, de lényegében ugyanez, csak nem kell SQL parancsokat írni, elég a migrációkat megírni, ez esetben pedig a visszalépés is megoldott korábbi verzióra.

De akár nézhetjük a Drupal-t is, ott is meg van oldva valahogy, szintén van egy tábla, ahol revíziókról van információ, ha lépünk egyet előre, végigcsinálja az update_1234 - update_1235 funkciókat. Ott kézzel kell futtatni az update.php-t.

Nem értem egyébként, hogy ennek mi köze a git-hez, gondolom valami egyedi deploy van.

--
http://sandor.czettner.hu
http://turaindex.hu

Nem feltetlen.

A rails pl ugy csinalja, hogy minden semamodositas kulon fajl a db/migration/ mappaban, az egyes fajloknak egy szamkoddal kezdodo neve van, es ezt az egyedi szamkodot (a fajl letrehozasanak ideje amugy) tarolja egy egysoros, egyoszlopos tablaban. Innentol tudja, hogy pontosan melyik verziotol kell rafuttatni az adott db-re az updateket.

A railsnel meg annyi extra van, hogy a modositasok - ha lehet -mindig ketiranyuak, van egy up es egy down ag is, az elso a tenyleges modositasert felel, az utobbi pedig azt csinalja vissza (pl ADD COLUMN / REMOVE COLUMN). Nyilvan nem minden esetben teljesen reverzibilis, de a sema szintjen mindenkeppen az.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

Ne érts félre, nem akarlak sem korholni, sem lenézni az erőfeszítéseidet, amit abba a rendszerbe bele fektettél!
Viszont én ezt gyökeresen másként csinálnám. Mivel az adatbázis alterelés (szerintem) nem egy olyan folyamat amit egy buta automatikára rá lehet bízni (megszalad egy update, vagy delete, kimarad egy where és ott a baj). Ezt én eddig így oldottam meg és így is fogom, mert egy igen megbízható rendszernek érzem, tapasztaltam.

A dev gép (jelen esetben a te géped) csinálhatja az élesítést és a db update -et a post-receive scriptel, de nézze meg, hogy az utolsó pushban van-e bd-update-.sql nevű file. Ha igen futtassa le azt, ami kezdődjön, úgy, hogy egy pl.: version_update nevű táblában az egy darab oszlopot pl.: current_version (unique key) beállítja (insert into version_update(current_version) value('1.0.107.build6');) ha van ilyen az insert elszál és a push sikertelen (hisz elrontottunk valamit).

A teszt oktatói és prod gépekre pedig egy ügyes script (ant build.xml) tegye ki a kódot, úgy hogy előbb exportálja ki a forrást, majd végezze el a szükséges buildelést (osztálylista generálás, css, js strip, fordítás stb.), majd egy verzíószám nevű mappába (/var/www/build2063/) rsync-elje ki az elkészült kódot. Ezután egy symlink segítségével tegyen ki egy sorry pageet (mint a twitter fail whale, vagy a google 404) ha kifogytak az aktív szálak akkor véggezze el az adatbázis update -et majd a sorry pageről állítsa át a symlinket az új verzióra.

Ez így biztonságos, nem lesznek tranziens hibák az inkonzisztens adatbázis, vagy kód miatt és látogatót sem veszít az oldal.

Ezzel a módszerrel, bármikor, napközben is elvégezhető a verzió váltás

----
올드보이
http://molnaristvan.eu/

Nem érzem, hogy ez teljes mértékig ellent mondana annak amiről én beszélek, lévén a release ablak lehetne előre egyeztetett időpontban (exhas: kedd 19:00, ezen a napon mondjuk igazodik a munkarendetek ehhez, persze nem én vagyok a PM)

Ha ez egy kereskedelmi rendszer én annál inkább óckodnék az autómatika "inteligenciájától". Másik dolog: az általam vázolt rendszer egy cirka 25000 soros PHP projektet kb másfél tucat serveren képes volt cirka 1,5 perc alatt élesíteni. probléma mentesen.

Ha gondolod tudok küldeni privátban build.xml -t (apache ant hoz)

----
올드보이
http://molnaristvan.eu/