Websupport a deployment

php Jenkins

Aktualne pracujem na jednom zaujimavom projekte, nazvyme to Start Up, ktory ( ako aj tato stranka ) bezi vo Websupporte. Okrem nejakych tych PHP veci je jednou z mojich uloh aj deployment. Uz pred tym som mal rozbehany Jenkins na virtualke, takze stacilo "len" vytvorit novy job.

Co bolo treba vyriesit

Co ma teda taky job spravit? Vyklonovat si projekt z gitu, spustit npm install, composer install a nakoniec build script, ktory nam pripravi templaty, csska, pospaja javascripty, atd. A nakoniec to treba vsetko nakopirovat na server. Easy?

Databaza

Ako sa projekt pomaly vyvija, spolu s nim sa meni aj databaza. Ako ale zabezpecit sync databazy? Sharovat nejaky sql script a ked sa nieco zmeni, tak vsetko dropnut a nahodit nanovo? Riesenim su samozrejme migracie. Problem je, ze vsetky taketo tooly sa spustaju pomocou prikazoveho riadka, co sa v pripade Websuportu neda. ( V admin rozhrani uz nieco take je, ale neviem ako by som to tomu Jenkinsu vysvetlil. )

Tak sme vytvorili jednu URL adresu naviac, ktora len spusta migracie:

$app->get('/migrate', function() {
  // run migrations
});

Composer a vendor adresar

Mazanie a kopirovanie cez FTP celkom frci, ale ked pride na vendor adresar, tak to stiham kludne ist na obed. V byvalej praci na to bolo super riesenie - zip! Cely adresar sa zazipoval, presunul na server a rozzipoval. Problem je, ze zipovat sa cez FTP neda. Ale tu znova pomoze trik, ktory vyriesil aj migracie:

$zip = new ZipArchive;
if ($zip->open('./vendor.zip') === TRUE) {
    $zip->extractTo('./');
    $zip->close();
    echo 'ok';
}

Takymto sposobom moze Jenkins zazipovat adresar vendor, presunut ho na server a na konci urobi len request na URL adresu, ktora spusti tento script. ( Jenkins job trval povodne 20 minut, po tomto "upgrade" to padlo na 5 a pol minuty! )

Jeden tip na zaver

V praci pouzivame tiez Jenkins ale projekt nebezi na PHP ale na JavaScripte. Build trval dost dlho tak som sa mu pozrel na zubky. Ako dependency manager sa pouziva Yarn, ktory si cachuje dotiahnute package a potom ich len linkuje. Toto ale u nas zabralo vela casu a hned som aj tusil preco. Povodny build script ( resp. jeho cast ):

npm install yarn
./node_modules/yarn/bin/yarn install

V takomto pripade si Yarn necachuje stiahnute package, takze vzdy vsetko stahuje nanovo. Zmena je teda jednoducha - nutnost mat pristup na server a potrebne prava. Najskor nainstalovat yarn globalne:

npm install -g yarn

A potom uz len zmenit build script:

yarn install

Vysledok? Povodne trval build proces 15 minut, po zmene je to okolo jednej minuty.

Zaver

Ak riesite tiez nieco podobne, pripadne ste sa stretli s inymi zadrhelmi, alebo riesite tieto veci inak, budem rad ked tu nechate komentar pripadne mi napisete na mail / fb / whatever.


Pridať nový komentár