Vy ještě nepoužíváte Continuous Integration?

Continuous Integration (CI) as a Service je v poslední době (nejen) v PHP světě stále populárnější. Firmy, které nechtěly trávit dny složitou instalací a konfigurací Jenkinse, nyní mohou rozjet CI server během několika hodin a často i zcela zdarma.

Mnozí PHP programátoři znají Travis CI, který je velmi rozšířený u open-source projektů. Pro neveřejné projekty je ale docela drahý. Mimo Travis naštěstí existují další podobné platformy jako Circle CI, CodeShip, Shipable a další.

U nás v Collabimu používáme právě CircleCI, který je v základní verzi zdarma pro neomezený počet repozitářů a spolupracovníků. Pokud ale potřebujete paralelizaci testů nebo spouštění paralelních buildů, budete muset zaplatit.

V článku vám ukážu zprovoznění CircleCI pro jednoduchou aplikaci Slovíčka napsanou v Symfony 2. Kód aplikace najdete na Githubu. Prohlédněte si i ukázkové buildy na https://circleci.com/gh/kutny/slovicka. Postupně vás provedu všemi kroky konfigurace buildu dle konfiguračního souboru circle.yml.

Proč bychom měli CI používat?

Nejdříve rychle shrňme, proč bychom měli CI vůbec používat. Klasická situace ze života vývojářského týmů začíná tak, že vývojář #1 (říkejme mu Petr) udělá nějakou změnu a pushne ji do GitHubu. Chvíli poté si změnu pullne druhý vývojář Jan do svého počítače a chce začít pracovat na jiném úkolu.

Po pár hodinách práce Jan zjistí, že určitá část aplikace vyhazuje chybové hlášení. Danou část Jan nezná a proto není schopen chybu opravit. Neví tedy ani to, že chybu způsobila změna, kterou předtím udělal Petr. Jan stráví nad hledáním řešení spoustu času, musí obejít další členy týmu a žádat je o radu. Mezitím se může stát i to, že někdo jiný nasadí aktuální verzi aplikace na produkci, čímž ji rozbije. Jak uvedené situaci předcházet?

Mnozí z vás hned vykřiknou „testy“. Já ale hned odpovím, že uvedená aplikace testy má včetně části, kterou Petr svou změnou rozbil. Problém je v tom, že Petr si po dokončení svého úkolu testy nepustil, nebo možná pustil jen některé. Pustit všechny testy na lokálním počítači totiž často trvá dlouho.

Kdyby uvedený vývojářský tým používal CI server, k uvedené situaci by pravděpodobně vůbec nedošlo. Petr by se totiž dozvěděl o své chybě chvíli po pushnutí svých změn do GitHubu, informoval by své kolegy a snažil by se problém co nejrychleji napravit.

Hlavní výhody CI serveru:

  • Testy (PHPUnit i Selenium) se spouští automaticky po každém pushi do repozitáře. Vývojář na jejich spouštění nemusí myslet. Ostatní vývojáři si jsou schopni ověřit „zdraví“ jednotlivých branchí a z nich vzniklých buildů.
  • Automaticky můžete spouštět další kontroly kódu jako lint, PHPCS, Mess Detector a další.
  • Aplikace se na CI serveru po každém pushi sestaví, naplní testovacím daty atd. Pokud vše projde, máme opět větší jistotu, že aplikace funguje správně.

Na druhou stranu může být nasazení CI u některých aplikací složité:

  • Vývojáři musí verzovat strukturu DB a vzorová data (fixtures a sample data). Výborně to jde např. využitím Doctrine2.
  • Časté problémy způsobují neoddělené testy, kde jeden test závisí na úspěšném dokončení testu předchozího. Testy může být nutné přepsat.
  • Je potřeba starat se a udržovat další prostředí (CI server), které se může chovat jinak než počítač konkrétního vývojáře.
  • Ladění testů (především Selenium) na vzdáleném serveru je složitější.

Úvod do CircleCI

CircleCI je obecná CI platforma. Můžete na ni sestavovat aplikace nejen v PHP, ale i v Ruby, Pythonu, Node.js a dalších. Do CircleCI se aktuálně můžete zaregistrovat jen s GitHub účtem. Po registraci můžete začít hned buildovat. Buildy se také automaticky spouští po každém pushi do libovolné větve repozitáře.

Nyní pojďme projít jednotlivé části konfiguračního souboru circle.yml:

Sekce machine:

Zvolte časovou zónu a verzi PHP, která se nejvíce blíží verzi na vašem produkčním prostředí. Sekci environment použijte k nastavení proměnných prostředí (v mém případě KUTNY_ENVIRONMENT). Pokud budete spouštět Selenium testy, nezapomeňte nastavit hosts.

Následuje seznam standardních služeb, které se na virtuální server nainstalují po spuštění buildu. Většina z nás neobejde bez mysql, ale můžete takto jednoduše nainstalovat i postgres, elasticsearch, redis i další. Pokud potřebujete další software, který není v seznamu, máte možnost si jej doinstalovat v sekci dependencies (viz dále) nebo napsat na podporu CircleCI.

Sekce dependencies:

V rámci kroku dependencies se instalují závislosti (v PHP pomocí composeru). V rámci podsekce pre doporučuji nastavit direktivu cache_directories, což výrazně urychlí build v případě, že používáte composer. Následně můžete např. upravit konfiguraci PHP (v mém případě short_open_tag = On) a doinstalovat další potřebný software, (zde memcached a Selenium server). Při spouštění Selenium serveru věnujte zvláštní pozornost parametru background, který zajistí spuštění procesu na pozadí.

Následuje krok post, ve kterém nastavíte, co se má stát po úspěšném nainstalování závislostí. Sem přijdou např. příkazy pro:

  1. vytvoření DB struktury z konfigurace Doctrine2 entit (doctrine:database:create); výchozí DB se vždy jmenuje circle_test, username: ubuntu a prázdné heslo,
  2. dump CSS, JS souborů a obrázků (assets:install a assetic:dump),
  3. kontrola codding standards přes Phing & PHPCS
  4. konfigurace virtualhostů v Apache, restartování Apache (aby fungovaly Selenium testy)
  5. nastavení práv (chmod 0777)

Sekce test:

V sekci test budete muset explicitně definovat, jak testy v PHPUnitu spouštět (direktiva override). Doporučuji nejdříve spouštět nejrychlejší unit testy, poté integrační testy a na závěr Selenium.

Narodil se první build

circle_build_header

Průběh buildu si můžete prohlédnout např. na https://circleci.com/gh/kutny/slovicka/82. Na stránce vidíme, že build proběhl bez paralelizace (Parallelism 1x) a trval necelé 2 minuty.

Věnujme nyní pozornost poslednímu kroku „Collect artifacts“. V tomto kroku CircleCI „sesbírá“ všechny důležité soubory (artefakty), které byly výsledkem buildu. Může jít o reporty z kontroly codding standards, screenshoty z rozbitých Selenium testů atd. Najdete je vždy pod záložkou Artifacts v záhlaví buildu.

Časté otázky:

  • Jak do Circle nahrát přístupová hesla a další citlivé údaje, aniž bych je ukládal do GITu? Můžete k tomu využít vlastní Environment variables. Hodí se např. při spuštění integračních testů na různá API třetích stran.
  • Na mém počítači mi testy procházejí, ale na integračním serveru ne. Mohu je na CircleCI serveru nějak ladit? Ano! K testovacímu serveru se můžete připojit přes SSH, stačí u každého buildu kliknout na tlačítko „& enable SSH“ v pravém horním rohu. Pokud potřebujete debugovat Selenium testy, zkuste si dle dokumentace nastavit port-forwarding. Následně se připojíte ze svého lokálního webového prohlížeče na webový server na CircleCI a testy pohodlně odladíte.
  • Je možné při pushi zamezit spuštění CI buildu? Stačí přidat do commit message text „[ci skip]„, viz dokumentace.
  • Umí CircleCI provést deployment aplikace, pokud build dopadl dobře? Tento případ jsem nikdy nezkoušel, ale CircleCI by tuto funkci měl podporovat.

Máte další otázky?

Pokud máte k CircleCI další otázky, rád je zodpovím v komentářích. Pokud váš CircleCI zaujalo, pojďte se ho naučit používat naplno u nás v Collabimu. Aktuálně hledáme do PHP vývojáře, který je schopen přelstít Google.

Jirka řídí vývoj webového SEO nástroje Collabim. Mimo SEO a programování ho baví webová analytika.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 17

Přehled komentářů

zakjan Deployement
bazinder musim mat repo na githube?
jirkakoutny Re: musim mat repo na githube?
pavel Re: musim mat repo na githube?
vaclav.sir Re: musim mat repo na githube?
starenka Re: musim mat repo na githube?
satai Re: musim mat repo na githube?
starenka Re: musim mat repo na githube?
jirkakoutny Re: musim mat repo na githube?
OndraM Re: musim mat repo na githube?
jirkakoutny Re: musim mat repo na githube?
podlesh Re: musim mat repo na githube?
starenka Re: musim mat repo na githube?
alesroubicek Re: musim mat repo na githube?
to je jedno Re: musim mat repo na githube?
Robert docker
Ladislav Re: docker
Zdroj: https://www.zdrojak.cz/?p=14252