Kontrola arduino sketchů pomocí Gitlab CI
Poslední dobou se opět hodně věnuji IoT. Některé aplikace pro mikrokontroléry (jako Arduino) člověk jednou napíše, uloží a pak už je jen používá s minoritními úpravami. Tyto malé úpravy však můžou sketch jednoduše znefunkčnit, aniž byste si toho všimli. Proto jsem hledal způsob, jak pomoci CI ověřit, že je sketch validní (tedy jak zautomatizovat tlačítko Verify v Arduino IDE) - tedy budu vědět, že mi stačí použít git clone bez jakýchkoli úprav, až budu daný sketch příště potřebovat.
Volba služby
Když se dnes řekne CI, tak většinu lidí zřejmě napadne Travis CI, který je propojen s GitHubem a pro veřejné projekty je zdarma. Pro privátní repozitáře existuje nejnižší tarif v hodnotě 129$ měsíčně, což je pro soukromé nekomerční projekty nemyslitelná částka. Navíc nastavení jejich systémů má své mouchy a nemusí tedy být vhodné ani pro open-source projekty. Tudy cesta nevede...
Poslední měsíce se můžete dočíst o rostoucí konkurenci GitHubu - Gitlab (gitlab.com). Jedná se o open source systém pro hostování gitovských repozitářů, nabízející stejné funkce jako GitHub (a spoustu dalších). Jedním z hlavních tahounů Gitlabu je bezpochyby Gitlab CI, který je rovněž open-source (není tedy problém jej rozjet na vlastním serveru, případně provést inspekci kódu pro kontrolu bezpečnosti). Pro jednoduché projekty však nepouživám Gitlab hostovaný na svém serveru, ale službu gitlab.com, která nabízí hosting privatních repozitářů zdarma (stejně tak jako CI). Pokud jste s gitlabem ještě nepracovali, nebojte se ho. Zvyknete si rychle.
Konfigurace CI
Konfigurace CI je zapsána v souboru .gitlab-ci.yml. Soubor nabízí velké množství dostupných konfiguračních direktiv, my si však pro jednoduchost vystačíme s image, before_script a script.
Pomoci image definujeme, jaky Docker image má být použit pro běh námi definovaného testu. (Gitlab CI je postavený na Dockeru).
Pomocí before_script definujeme příkazy, které musí být provedeny přes spuštěním samotného testu (tedy příprava prostředí, konfigurace *env* proměnných, atd...).
Nakonec pomocí script definujeme samotné příkazy testů.
Ukázka
Zde popíši testování sketche, který vyžaduje externí knihovnu. Ukázkový gitlab-ci.yml soubor najdete zde. Celý ukázkový projekt zde.
První řádek
image: jeroenknoops/java8-groovy-chrome-xvfb
nám říká, jaký image se pro naše testy použije. Měl jsem dlouho problémy vybrat ten správný - někde nebylo xvfb, někde nebylo možné rozchodit Javu a někde byl problém s rozbalením .xz archivu (bez sudo se tyto problémy špatně řeší). Nakonec jsem však našel image jeroenknoops/java8-groovy-chrome-xvfb které vše řeší a je celkem rychlý.
V before_script máme několik příkazů, zajistí stažení a rozbalení Arduino IDE.
- sleep 3
- wget http://downloads.arduino.cc/arduino-1.6.9-linux64.tar.xz
- tar xvf arduino-1.6.9-linux64.tar.xz
Další příkazy zajistí funkční xvfb (vyžaduje jej Arduino IDE, i když jej spouštíme pouze v textovém režimu).
- export DISPLAY=:1.0
- /etc/init.d/xvfb stop; echo hola!; /etc/init.d/xvfb start; ps -eAf|grep -i xvfb
- /sbin/start-stop-daemon --start --quiet --pidfile /tmp/xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16
Poslední příkaz pro přípravu testů zajistí stažení vyžadované knihovny. Zároveň ji umístí do patřičné složky tak, aby k ní mělo Arduino IDE přístup. Pokud ve svém sketchi používáte externí knihovny, zde je prostor pro jejich stažení. Ať je stahujete pomocí čehokoli, je nutné složku se soubory knihovny umístit do složky libraries v adresáři Arduino IDE (viz příklad).
- git clone https://github.com/adafruit/Adafruit_NeoPixel.git arduino-1.6.9/libraries/Adafruit_NeoPixel
Testy se skládají z jednotlivých job-ů. Poslední část konfiguračního souboru jde pochopit celkem lehce:
jobs:
only:
- gitlab
script:
- echo Verifying
- ./arduino-1.6.9/arduino --verify --board arduino:avr:uno sketch/sketch.ino
Nejprve definujeme *job* s názvem 'jobs', který se provede pouze v branchi gitlab (defaultní je samozřejmě master). Nakonec proběhne samotné ověření sketche, které se skládá z jednoho jednoduchého příkazu. V něm definujeme pouze typ desky, pro kterou daný sketch kompilujeme a cestu ke sketchi (relativní ke kořenu repozitáře).
Výstup konzole z průběhu testů vypadá nějak takto. Pokud jste hračičkové jako já, můžete do souboru README umístit obrázek, který vás bude informovat o stavu posledního buildu :)
Toť vše. Jakmile jednou pochopíte, jak Gitlab CI funguje, konfigurace vám zabere několik desítek vteřin. Před prvním použitím tedy doporučuji alespoň lehce proběhnout rozsáhlou dokumentaci.
Add new comment