Autor Zpráva
RastyAmateur
Profil
Zdravím,

zajímá mě nějaká automatická synchronizace souborů na serveru a na localu. Aktuálně to dělám normálně - upravím soubory a přesunu přes SFTP klienta na server. Věřím ovšem, že to jde i nějak elegantněji. Hádám, že by to mohlo jít i přes GIT? Jednou jsem používal na jednom projektu bitbucket. Na tom jejich serveru byl ten "centrální repozitář" a já s ostatními jsme si samostatně programovali a pak změny pushovali na ten server. To je něco, čeho bych chtěl docílit (alespoň myslím).

Děkuji, RA
Beavis
Profil
RastyAmateur:
GIT je na tohle asi ideální. Ať už díky možnosti feature větví, tak třeba díky snadnému revertu jednotlivých commitů v podstatě na jedno kliknutí.
RastyAmateur
Profil
Beavis:
A jak docílím sdílení daného repozitáře? A jak docílím toho, abych ho mohlo upravovat na tom serveru pouze já?

Přiznám se, že se ptám bez toho, abych googlil. Už jsem vypl počítač, vrhnu se na to až zítra...
Taps
Profil
a co git-ftp www.kutac.cz/blog/weby-a-vse-okolo/git-ftp ?
RastyAmateur
Profil
Taps:
nemám FTP, pouze sftp
Tak už jsem na to koukal a i něco zkoušel. Zatím jsem se dozvěděl, že nastavení toho "propojení" se serverem a vlastním localem se dělá pomocí git remote add ... ... a že to přihlašování je stejné, jako kdybych se přihlašoval normálně k serveru pomocí ssh (tj. uživatelské jméno a heslo/SSH klíč)

Ovšem jak nyní docílit toho, abych měl na serveru jednu verzi a na localech další verze? Pokud nastavím repozitář na serveru jako --bare, nejsou tam ty soubory prakticky vidět (zdroj, pokud jsem pochopil). Ovšem pokud to nenastavím jako --bare, ale natvrdo jako working, pak nemohu používat příkazy push (a tím pádem asi ani pull, hádám)

Napadají mě dvě věci:
1) Vytvořit na serveru jak --bare, tak working repozitář. Vždy pushnu změny na ten --bare repozitář a pak ručně pullnu změny v tom working repozitáři
2) Zahodit myšlenku GITu, protože ten není na to, co hledám, ale pouze verzování (nepočítaje Tapsův nápad)
Keeehi
Profil
Git je rozhodně správná cesta. Umím si představit jen málo systémů které by fungovaly podobně dobře avšak bez gitu.

V předchozí větě je důležité slovo systém. Jde o to, že git je jen jeden z nástrojů, které k vytvoření takového systému potřebuješ. Je podstatnou součástí ale jen sám o sobě to nezvládne.

Nejdříve si přečti něco o Continuous Integration. Jeden z prvních článků co jsem našel a vypadal na první pohled přijatelně je www.atlassian.com/continuous-delivery/ci-vs-ci-vs-cd nebo si vygoogli něco sám, je toho hromada. Jelikož každý ten pojem chápe trošičku jinak může to být lehce matoucí mezi články různých autorů ale obecnou představu by jsi z toho měl dostat.

Obecně platí, že základním místem pro kód je git repozitář umístěný někde na internetu. Ten rozděluje úlohu na dvě části. Jednou částí je to jak programátor interaguje s kódem. To si asi dokážeš představit, je to úplně stejné jako když se git repozitář používá čistě jen pro verzování. Ta druhá je o tom, jak dostat ten kód na server. A tady se to obrovsky liší. Jde o to, že každý má na to odlišné požadavky, chce nebo musí použít určité technologie, má jinou síťovou toplogii serverů, používá jiné databáze atp. V jednom se ale celkem shodují, nasazení kódu na server se děje v naprosté většině případů plně automaticky, bez jakéhokoli ručního zásahu.

Popíšu ti ten úplně nejjednodušší systém, který je možné vytvořit (uplácat si) který jsem v trochu vylepšené verzi vytvořil, když jsem s tím začínal. Pro modelový příklad si vybereme jako službu uložení repozitáře do cloudu GitHub ale dá se to udělat i u jiných poskytovatelů. Aby to bylo plně automatizované, tak když se na GitHub nahraje kód, tak se o tom musí tvůj server dozvědět. To se dá zařídit pomocí developer.github.com/webhooks. Nastavený webhook sleduje repozitář a když tam proběhne určitá událost (push), pošle na zvolenou adresu HTTP požadavek. V tom požadavku je spousta dat o té události ale to nás momentálně nemusí zajímat. Důležité je to, že náš server je kontaktovaný, dozví se tedy o nové verzi kódu a může se podle toho zachovat. Webhook tedy bude nastaven třeba na adresu https://dev.example.com/new-release.php. Obsah souboru new-release.php pak může být velmi jednoduchý
<?php
exec("cd /var/www/myproject && git pull")
A to je prakticky vše. Toto je asi ten nejminimalističtější fungující příklad. Od tohoto se dá už jen rozvíjet.

Například první problém je, že ten adresář se stahuje do živé verze webu. Což může v době stahování souborů způsobit určitou nefunkčnost, kdy část souborů je stará a část už nová. Což se řeší tak, že neuděláš pull ve star složce ale naklonuješ novou verzi do složky vedle a když je hotovo, jen jednu složku vyměníš za druhou. Když si člověk pohraje se symbolickými linky (zástupce v českém překladu) tak to jde udělat atomicky. Tomuto okamžitému vyměnění jedné verze za verzi jinou bez jakéhokoli výpadku za plného provozu se říká zero downtime deployment.

Dále většina projektů nefunguje přímo ze zdrojového kódu, ale potřebuje build fázi. V té se stahují a instalují závislosti (např. composer balíčky s knihovnami), kompilují zdrojové kódy (LESS => CSS), optimalizují obrázky atp. V naší verzi by stačilo přidat dalších pár exec funkcí které zavolají jednotlivé externí programy které udělají co je potřeba. Nebo na build použiješ nějakou službu třetí strany. S GitHubem se hojně používá Travis ale jsou jich spousty jiných.

Dále se do toho po buildu dá zapojit testování. Automatické testy vyzkouší jestli nová verze nerozbila náhodou něco z předchozí funkcionality. Pokud testy projdou, pokračuje se s nasazením, pokud neprojdou, nasazení je přerušeno a nová verze se na server nepošle.

Další oblastí je úprava databáze. Jelikož programátor nemá přímý vliv na to, kdy se nová verze nasadí, nemůže moc ručně upravit ani databázi. Ta je potřeba upravit automaticky v průběhu nasazování nové verze. Což není úplně triviální úloha, řeší ji spousta různých nástrojů v závislosti na programovacím jazyku, frameworku a databázi samotné. Hledej pod názvem databázová migrace.

Nakonec se vrátím zpět k souboru new-release.php. Je snad jasné, že čím více toho budeš chtít do systému zakomponovat, tím složitější jeho obsah bude. Udržovat něco takového by se chtělo asi málokomu nehledě na to že volat přes exec příkazy shellu se považuje za zrovna moc košér. Takže my to v práci třeba nahradili pythonem na centrálním serveru který se připojoval build servery na kterých spouštěl předpřipravené šablony bashových příkazů které zajistily kompletní nasazení. Dá se však na to použít ansible a jiné.

Možností je tedy spousta. Od variant samo-domo až po komerční enterprise varianty. Ať usž si vybereš cokoli, je důležité nezapomenout, že to přidává určitou komplexitu a v důsledku spoustu míst kde něco zapomenout a tím vytvořit bezpečnostní díru. Je tedy rozhodně dobré mít někoho k ruce kdo tomu rozumí a bude tě moci upozornit na problémová místa. Například jedním z problémů je dostupnost .git adresáře na webu. To je bezpečnostní problém a není to nic neobvyklého. Zrovna nedávno vyšel skvělý článek s výsledky celosvětového scanu webu.
RastyAmateur
Profil
Keeehi:
No, nečekal jsem, že to bude až tak složité. Jde pouze o jednoduchý web, na kterém chci pracovat sám jak ze svého stolního počítače, tak z notebooku

Mrknu na to a zkusím si vytvořit nějaké řešení. Rozhodně ale nebude takto komplexní :D Každopádně děkuji za vyčerpávající odpověď
Kcko
Profil
RastyAmateur:
A co teda chceš? Verzovat umíš? Pokud ano tak GIT nebo Bitbucket (umí i privátní REPO). Pak už jde jen o deploy ne? Tak se podívej na Gitlab, jinak všechny deployovací služby jsou většinou placené.
RastyAmateur
Profil
Kcko:
Původně jsem chtěl při pushnutí aktualizovat verzi webu na serveru. Ale jak popsal Keeehi, není to úplně tak jednoduché, jak jsem si myslel
Kcko
Profil
RastyAmateur:
V tvém případě docela ano. Bude Ti stačit ten deploy skrze GitLab, to je ta nejsnažší varianta.
Keeehi
Profil
RastyAmateur:
Ano, celá problematika je poměrně komplexní. Ovšem pro vlastní projektíky, kde nezáleží na tom když to pár minut nepojede než to ručně opravíš, se ten systém dá uplácat celkem jednoduše. V oblasti byznysu si něco takového už nechceš dovolit a je proto potřeba vytvářet komplexnější systémy. Obecně dostat kód na server je celkem jednoduchá záležitost. Komplexní jsou ty systémy které hlídají že všechno probíhá v pořádku jelikož pokazit se toho může hodně a pokud to má být plně automatické, musí se toho hlídat a kontrolovat opravdu mnoho.

Tvůj projekt neznám ale zřejmě ti bude stačit nějaké jednoduché řešení. Což může být i ten výše popsaný webhook s PHP scriptem. Jen trochu komplexnějšími bash příkazy. Mám ale ověřeno že to takto fungovat může. Pokud chceš být trochu více fancy, můžeš zapojit nějaký ten CI tool. Dá se to sehnat i zdarma. Osobně jsem vyzkoušel kombinace GitHub + CircleCI* a také GitLab + GitLab CI/CD.
*CircleCI podporuje i Bitbucket.
RastyAmateur
Profil
Keeehi:
Dobře, mrknu na to a něco vymyslím

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0