Doufám, že jste si dobře užili svátky :-) a vítám vás u dalšího článku. Díky že jej opět čtete. Jak jsme minule slíbil, tak dnes si ukážeme PHP Jet již čistě prakticky a to na nástroji Easy Deployer, který jsem někde mezi dováděním se synem, povídáním si s rodinou a pojídání cukroví znovu „napsal“ v nejnovější verzi PHP Jet a připravil k uveřejnění (zatím jako beta verzi).
Deployment …
… to je také téma samo o sobě. Jsou různé teorie, různé strategie, různé metody a nástroje. To teď nebudu rozebírat a zaměřím se na to, jak to děláme „u nás“ a co a k čemu je Easy Deployer.
Cyklus vývoje a nasazení probíhá takto:
Realizaci požadavků klienta (prostě vývoj) provedeme každý na svém lokálním vývojovém prostředí, kde provedeme samozřejmě také testování a odladění (a kontrolu pomocí nástrojů integrovaných v IDE PHP Storm).
Změnu jsou přes VCS (je jedno zda Git, nebo ještě klasické SVN) pošleme na společný testovací server, kde je zároveň prostředí co nejbližší prostředí produkčnímu do které se změny automaticky „přepošlou“. Projekt je tedy možné „spustit“ a znovu otestovat na neveřejném serveru, který se však má blížit serveru produkčnímu.
Nasazení konkrétních změn na produkci pak probíhá dle potřeby a situace:
Pokud se jedná o jednoduchou změnu, kterou realizoval jeden vývojář, pak po otestování autor této změny provede nasazení do produkce pomocí nástroje Easy Deployer a to kdykoliv je to vhodné. Tedy žádné pravidelné lhůty a cykly – dílčí změna se nasazuje když je třeba a když je vše připraveno.
Pokud na změně pracovalo více lidí, pak se určí kdo provede nasazení a jak a vymění se informace pro nasazení potřebné, dohodne se kdy se operace provede a tak dále. Testování po nasazení provádí všichni kdo se na změně (nové funkci) podíleli + další vhodní lidé (např. zadavatel).
Pokud se jedná o opravdu obří změnu (konkrétně např. nasazení zcela nového frontendu aplikace, zcela nových částí aplikace jako je nákupní proces e-shopu atd), pak je na produkčním serveru zřízeno ještě jedno testovací prostředí. Tedy ještě jedna instance aplikace, napojená na „ostrou“ databázi, ale běžící neveřejně „bokem“. Tam probíhá testování jak postupu nasazení změn, tak samozřejmě změn a nových funkcí samotných a to za účasti mnohem většího počtu lidí. Ovšem toto není tak častá situace. Avřak při této situaci často dochází k ladění a tedy vzniká potřeba průběžné nasazovat změny / opravy na tzv. předprodukční prostředí za účelem retestů a pokračování testovacího a ladícího procesu. I pro tento účes se používá nástroj Easy Deployer.
Změny v databázi nejsou prováděny automaticky a ani pomocí žádného nástroje. To se neosvědčilo. Je totiž něco úplně jiného lehce modifikovat (relativně) nedůležitou tabulku a něco jiného je zásadně modifikovat tabulku objednávek a jiných kritických dat. Stejně tak je zvolen jiný přístup podle velikosti tabulek a dat a dalších kritérií – prostě racionálně dle situace. Změny v databázi řešíme centrální evidencí. Na jednom místě předepsaným způsobem evidujeme změny v databázích. Je evidováno toto: Kdy byla změna provedena na jakém serveru, kdo změnu provedl, stručný popis důvodu a smyslu změny a samozřejmě SQL skript pro provedení změn a případně další doplňkové informace. Ano, PHP Jet v Jet Studiu je k dispozici nástroj pro aktualizaci tabulek dle definice modelu, kde stačí „kliknout“. Ale změny na „ostrém“ serveru je nutno raději promyslet, včetně zvážení rizik a možných důsledků …
Na konci každého nasazení je pochopitelně předání klientovi a otestování někým z budoucích uživatelů, či určeným týmem klienta, prostě zadavatelem.
Tedy žádná raketová věda, nic složitého. Průběžně je nasazováno co je třeba (to je nejčastější situace) ve většině případů bez výpadku provozu projektu.
Ovšem při samotném nasazení je potřeba:
Mít vždy a automaticky zálohu přepisovaných souborů – bez možnosti proces zálohování vynechat.
Mít možnost názorně, jednoduše a snadno vidět seznam změn. Tedy které soubory jsou odlišné od těch na produkčním systému, ale také které jsou zcela nové.
Mít možnost porovnat změny na úrovni konkrétních souborů.
Mít možnost na základě tohoto porovnání a na základě znalostí autora změn sestavit seznam souborů k nasazení a pouze tyto soubory (snadno) poslat na server.
Mít možnost změnu rychle vrátit (rollback) pokud se něco nepovede.
Mít samozřejmě celkový přehled o tom co se dělo a děje.
Zjištění a přehledné zobrazení změn v projektu až do úrovně změn konkrétních souborů – skriptů.
Jednoduché provedení nahrání vybraných souborů na produkční server.
Případné vrácení změn.
To vše samozřejmě na více projektech. Kdo z nás také pracuje pouze na jednom projektu?
A samozřejmě evidenci, logování a řízení oprávnění uživatelů (je možné určí kdo co smí dělat a v rámci jakého projektu se pohybovat) – aby ne, je to PHP Jet aplikace.
Komunikace s produkčním serverem pomocí FTP (již hotovo), SCP a SFTP (bude).
Tento nástroj běží na našem vývojovém serveru, kde je používám pro klientské projektu, ale mám jej i na svém „lokálu“, kde jej používám pro nasazování změn na mých soukromých projektech. Například na webu www.php-jet.net. A právě na tom si Easy Deployer ukážeme v praxi, formou videa:
Použití nástroje:
Administrace:
A poslední – instalátor:
Easy Deployer jako reálná ukázková aplikace PHP Jet
Tento nástroj je zároveň první veřejně dostupné reálná aplikace postavená plně na PHP Jet a také lehce upravené knihovně PHP Diff (tuto skvělou knihovnu mám v plánu v budoucnu „zosmičkovat“ – zmodernizovat pro PHP8 – a zkusit poslat v této podobě zpět autorovi).
Co obnášel vývoj?
Nic složitého … Jako základ posloužila ukázková aplikace, která je součástí balíčky PHP Jet. Pak stačilo udělat tyto mandatorní a nemandatorní věci:
Mandatorní kroky při vývoji:
Vytvořit entitu Project, která představuje (jak jinak) konkrétní projekt přes Easy Deployer nasazovaný. Krom údajů o spojení na server, popisu, údajů o souborech a adresářích zahrnuje samozřejmě i napojení na kontrolu oprávnění.
Vytvořit entitu Deployment, která již predstavuje informace o konkrétním nasazení změn na konkrétním projektu a veškeré informace o tomto nasazení a jeho průběhu (jaké soubory byly nahrány, kdy, kým, s jakým výsledkem, …)
Vytvoření abstraktní tříd JetApplication\Deployment_Backend jako základu pro budoucí backend třídy mající na starosti komunikaci s produkčním serverem – tedy samotný přenos souborů.
Vytvoření třídy JetApplication\Deployment_Backend_FTP – první backend a podpora klasického FTP.
Vytvoření aplikačního modulu Projects.Admin určeného pro administraci seznamu projektů. S tím hodně pomohl wizard v Jet Studiu.
Vytvoření aplikačního modulu Projects.Deployer což je samotné rozhraní pro nahrávání změn.
Naklikání vazeb MVC.
Aktualizaci zdroje oprávnění rolí – role musí vědět o projektech a řídit přístup k nim. De facto pár řádek kódu v entitě Auth_Developer_Role.
Přepracování instalátoru – respektive jeho zjednodušení a sloučení několika kroků do jednoho kroku bez interakce s uživatelem. U tohoto projektu není nutné a vhodné aby si uživatel sám volil moduly a nastavoval báze. Instalaci lze tedy provést jednodušeji.
Texty, překlady …
Testy a ladění.
Celkově práce „na chvíli“.
Nemandatorní kroky při vývoji:
Aby aplikace byla uvnitř „pěkná“, tak jsem provedl následující:
Odstranění báze pro REST a všeho s tím spojeného.
Samozřejmě odstranění všech nepotřebných ukázkových aplikačních modulů.
Entitu visitor představující návštěvníka webu jsem přejmenoval na developer jakožto uživatele nástroje. Změnil jsem takto název všech relevantních tříd.
Báze pojmenovaná web zde také nemá smysl. Báze web se změnila na bázi deployer.
Z třídy Application_Web se stala třída Application_Deployer, Logger_Web byla přejmenována na Logger_Deployer a Auth_Controller_Web na Auth_Controller_Deployer.
Tohle vše technicky vzato nebylo vůbec nutné, ale ať je v tom pořádek.
Tak si Easy Deployer vyzkoušejte a pokud používáte podobné postupy, tak věřím, že vám pomůže.
A co nového se samotným PHP Jet?
A teď krátce k frameworku samotnému:
Pár drobných změn. Např. nástroj pro správu stránek v Jet Studiu má ikonu náhledu stránky. Cesta k datovému soboru SQLite je nyní pro jistotu generována při instalaci náhodně.
Několik drobných oprav.
Podpora composeru
Ano, vnímám vás :-) Jet má composer.json, je zaregistorvaný Packagist.
Lze tedy napsat: „composer create-project mirekmarek/php-jet“
Rovněž je možné do vašeho projektu postaveném na PHP Jet vkládat závislosti, funguje i autoloader composeru.
Pouze nehledejte adresář ~/vendor. Pokud použijete composer pro stanovení závislostí na knihovnách, tak ty najdete v adresáři „~/library/Composer/“.
Intenzivně ( v rámci časových možností ) hledám vhodnou cestu jak založit nějaké diskuzní fórum.