Už sa vám to niekedy stalo? Prišli ste na nový projekt, potrebujete si pripraviť vývojárske prostredie, aby ste mohli pracovať a zrazu zistíte, že to nie je také jednoduché. Ostatní developeri to majú u seba pripravené, ale nikto vám nevie povedať kompletný postup, a tak si to krok po kroku ladíte a skúšate a čas beží. Kedysi som si myslel, že najlepšou odpoveďou na tento problém je nejaká tá wiki alebo dokument s popisom, ako si nastaviť prostredie. Stále to považujem za celkom dobrú možnosť, ale o čosi lepší je nástroj Vagrant od firmy HashiCorp.
Vagrant je nástroj na voľné použitie, ktorého hlavnou úlohou je na jeden príkaz pripraviť kompletné developement prostredie. A to nezávisle od toho, na akom operačnom systéme ho spustíte. Vagrant to robí tak, že to prostredie pripraví do virtuálneho stroja a pripraví ho na základe skriptu, ktorý mu napíšete. Poďme si to teraz trochu rozobrať.
Vagrant je napísaný v Ruby a na svoj počítač (bez ohľadu na to, ktorý OS používate) ho viete jednoducho nainštalovať. Čo budete okrem toho potrebovať je ešte takzvaný provider virtuálneho stroja. To môže byt VirtualBox alebo VMWare alebo Hyper-V alebo aj Docker. Niečo na čom Vagrant spustí virtuálny stroj a začne ho pripravovať.
Ak máte inštaláciu za sebou, tak prácu s Vagrantom začnete príkazom
vagrant init
v koreňovom priečinku vášho projektu. Tento príkaz vygeneruje Vagrantfile, čo je konfiguračný súbor, ktorý Vagrantu povie,čo potrebujete pre svoj projekt. Definuje sa v ňom jedna dôležitá vec a to je, aký box chcete pre vývoj použiť – teda aký operačný systém sa má spustiť vo virtuálnom stroji. Vybrať si môžete z HashiCopr katalógu. Dajú sa tam nájsť minimalistické boxy, ktoré obsahujú len nevyhnutý základ, aby ste na virtuálnom stroji mali čo najčistejšie prostredie, ako aj hotové vývojové prostredia, ktoré už obsahujú nainštalovaný softvér. Väčšina boxov je linuxová, ale dajú sa tam nájsť aj Windows alebo OS X boxy. Dôležité je, že boxy sú určené len pre niektorých providerov, takže ak sa rozhodnete napríklad pre VirtualBox, tak si podľa toho treba aj vyberať box.
Ak si box vyberiete, musíte ho stiahnuť k sebe na počítač. To urobíte príkazom
vagrant box add <nazov boxu>
Toto vám stiahne box na lokálny počítač. Pri jeho použití pre konkrétny development environment sa z neho vyrobí kópia a do tej sa začne pripravovať prostredie pre konkrétny projekt. Takže stiahnutie boxu prebieha len raz.
Okrem boxu sa vo Vagrantfile nastavuje ďalšia dôležitá vec a to je tzv. provisioning. To je vlastne samotná prípravasoftvéru vo virtuálnom stroji. Postup môže byť zapísaný rôznymi spôsobmi: Ansible, Puppet, Chef, Salt, PowerShell alebo jednoducho bash. Viete ho zapísať do externého súboru a ten len volať z konfiguračného súboru, čím sa dá dosiahnuť ľahšia spravovateľnosť. Provisioning viete robiť aj pomocou Dockera. Teda Docker vie fungovať ako enging, na ktorom to celé beží (provider), ale tiež ako nástroj, ktorým sa pripravuje virtuálny stroj. Pri Vagrante sa vám teda znalosť Dockera naozaj hodí.
Ak máte postup pripravený, môžete prostredie spustiť. To sa deje jednoduchým príkazom
vagrant up
Ten príkaz vytvorí kópiu boxu, spustí ho v providery a spustí provision skripty, aby stroj pripravil. Keď všetko dopadne dobre, tak za krátky čas máte hotové lokálne bežiace prostredie so všetkým, čo treba.
A čo ďalej? Ako dostať zdrojové kódy na virtuálny stroj a ako potom bude prebiehať vývoj? Už vás počujem, ako hovoríte: „Ale ja predsa nechcem vyvíjať vo vim-e!“. Nič proti vim-u, som jeho fanúšik, ale viem, že takých nás nie je veľa. Odpoveďou je automatická synchronizácia vašich projektových súborov do a z virtuálneho stroja.
Tú robí Vagrant automaticky po spustení virtuálneho stroja. Jednoducho všetko, čo je okolo Vagrantfile (rekurzívne) sa vám defaultne synchronizuje do /vagrant adresára virtuálneho stroja (ak je to linuxový stroj). Synchronizáciu viete rôzne nastavovať a rovnako s tými súbormi viete na strane virtuálneho stroja robiť, čo potrebujete. Takže napríklad kompiláciu viete robiť na lokálnom počítači a deploy na virtuálnom. Alebo oba na virtuálnom, záleží len na vás. Podstatné je, že editovať kód viete ďalej lokále vo svojom obľúbenom IDE-čku. Okrem synchronizácie súborov vám pohodlie lokálneho vývoja zabezpečí aj forward portov, takže všetky otvorené porty virtuálnej machiny sa tvária ako keby boli na vašom localhoste.
Ako teda vyzerá postup rozbehania vývojového prostredia na projekte s Vagrantom
- Inštaluj Vagrant
- Inštaluj VirtualBox (alebo iný provider)
- Checkoutni zdrojové kódy s Vagrantfile
- spusť vagrant up
Tak nejako by to malo byť jednoduché. Vagrant ale nie je dobrý len na toto. Ideálny je tiež, ak chcete robiť experimenty s nejakým softvérom bez toho, aby ste ho inštalovali na svoj lokálny stroj. Pred časom som pripravoval prednášku o NoSQL databázach a chcel som mať na ukážku spustené štyri rôzne databázy (rôzneho druhu). Všetko sa dalo jednoducho pripraviť cez Vagrant a to bez toho, aby som si do vlastného stroja musel všetok ten softvér inštalovať. A ako bonus som po prednáške zozdieľal Vagrantfile, takže ktokoľvek si ho vedel u seba jednoducho spustiť a tak mať automaticky pripravené to, čo na prednáške videl.
Čo ešte Vagrant dokáže:
- pomocou takzvanej Share funkcie viete (ak máte účet na HashiCorp stránke – ten je zadarmo) zdieľať váš virtuálny stroj kdekoľvek na internete (cez špeciálnu linku, ktorá sa vygeneruje). Viete tak niekomu na diaľku ukázať, čo máte vo virtuály lokálne.
- vytvára na vašom lokálnom počítači sieť virtuálnych strojov – každý samostatne pripravený. Takto viete u seba jedným príkazom (všetko to môže byť postavené na jednom konfiguračnom súbore) vytvoriť celú infraštruktúru serverov.
- vytvárať snapshoty virtuálneho stroja. To je vhodné, ak si ladíte provision skript alebo sa chystáte testovať nejakú komplikovanú migráciu údajov v rámci virtuálu
- pribaliť virtuálny stroj k projektovým súborom. Takto viete hotovú virtuálku distribuovať so zdrojovými kódmi.
- „pushovať“ zdrojové kódy na preddefinované FPT, HashiCorp Atlasu, Heroku …
Vagrant podporuje niečo, čo si myslím, že by malo byť súčasťou každodenného života vývojára – podporuje automatizáciu. Každý developer totiž denne robí množstvo rutinných úloh, ktoré ho oberajú o čas, radosť z práce a kreativitu. Príprava vývojového prostredia je niečo, čo vás vie zabiť už hneď na začiatku projektu. Preto by som odporúčal si prípravu niekde dokumentovať. Akonáhle sa to začne celé komplikovať, tak by som prešiel na Vagrant.