Přejít k navigační liště

Zdroják » Různé » Vy ještě nepoužíváte Continuous Integration?

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

Články Různé

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.

Komentáře

Subscribe
Upozornit na
guest
17 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Jan Žák

U nás v Salsitě používáme continuous deployment z CircleCI na Heroku (ale jde to i kamkoliv jinam), nějaké další triky z nastavení najdete v našem článku:

http://blog.javascripting.com/2014/12/05/continuous-deployment-with-github-circleci-heroku/

bazinder

Kedze sa prihlasuje cez github, predpokladam, ze to funguje iba s repozitarmi hostovanymi tiez na githube. alebo sa mylim?

existuje takato sluzba ktora by ficala aj s bitbucketom? najlepsie zdarma

jirkakoutny

Ano, CircleCI je jen pro GitHub.

Pokud používáte BitBucket, zkuste CodeShip, Shipable a další http://www.quora.com/What-are-the-alternatives-to-Travis-CI

pavel

A co kdyz nepouzivam ani BitBucket ale repository v nasi siti? Co kdyz vyvijim closed-source?

vaclav.sir

Můžete si nainstalovat Gitlab CI nebo Jenkinse a strávit spoustu času konfigurací, ale s pohodlnějšími hostovanými řešeními máte asi smůlu.

starenka

Muzu se zeptat, co je tak slozityho na Jenkinsovi? Vytvorim projekt, dam cestu k repu a jako build step executnu tox. Prace asi tak na jednu minutu. Dalsich deset stravis nastavenim emailu a pristupovejch prav.

satai

To urcite delas neco spatne, kdyz to mas tak rychle…

starenka

Hihi, asi jo.

jirkakoutny

Dazzi, umí Jenkins automaticky buildovat při pushi do Githubu? Umí to pro všechny branche? Umí bez složité konfigurace pouštět Selenium? Atd. atd.

Ondřej Machulda

Ne, že bych byl nějaký velký zastánce Jenkinsu, ale tohle všechno bez problémů umí :-).

jirkakoutny

Je to možné Ondro, ale osobně jsem to nikdy nebyl schopen jednoduše rozběhat. Každopádně na CircleCI to šlo hned bez toho, abych před tím studoval dokumentaci, něco konfiguroval, instaloval nějaké pluginy atd.

podlesh

Tohle všechno umí, ale přívlastek „bez problémů“ bych rozhodně nepoužil.

starenka

Jasne, neni problem. Ten hejt kterej slychavam proti jenkinsu je podle me 90% to, ze lidi nemaji poreseny testovani/build jako takovy. Cili to „slozite“ ctu jako tohle. Pokud ses schopnej pustit paramatrizovanej test jednim prikazem s flagem (delam v pythonu, takze pouzivam tox – kde jednim prikazem v sandboxu otestuju projekt pro x verzi interpretu, dbs apod.,), jenkins to v podstate jen pusti a vykolekti vysledky testu/coverage/blabla a udela neco dal (coz je zase jen task v nastroji, kterej pouzivas a je podle me upe burt, jesli je to ant, make, rake, tox, distutils nebo shell skript). Jenkins podle me jen tenhle nastroj pustit a proto je podle me.ten setup trivka.

alesroubicek

Closed source můžete mít v GitHubu nebo BitBucketu v tom přece problém není. Repository z vaší sítě můžete do těchto služeb mirrorovat.

to je jedno

tak určitě… budu platit Stash abych si pak platil jeste github a daval „ven“ kod zakazniku kteri ho ven dat proste nechteji.

Robert

CircleCI hlavně podporuje Docker a lze testovat v úplně stejném prostředí, jako máte při vývoji i na produkci. To je myslím hlavní killer feature!

Ladislav

Travis už také nějakou dobu podporuje Docker, viz.: https://docs.travis-ci.com/user/docker/

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.