Ciele
- Oboznámiť sa s fungovaním CI nástrojov.
- Prakticky si vyskúšať fungovanie automatického overovanie pomocou CI nástrojov.
Úvod
Mnohé kontroly a opakujúce sa úlohy je možné uskutočniť automaticky. Jedným zo spôsobov ako to realizovať je využitie tzv. CI servera, ktorý môže špúšťať zadané príkazy po každom nahratí zmien do hlavného repozitára.
Postup
Krok 1: Automatizované zostavovanie a testovanie
Našou snahou je automatizovať všetky časti vývoja, pri ktorých je to možné. Jednou z takýchto vecí je zostavovanie projektu (kompilácia), spúšťanie rôznych nástrojov na kontrolu kódu a testov. Na tento účel sa zvyknú používať nástroje Continuous Integration (CI), ktoré sledujú všetky zmeny v centrálnom repozitári a spúšťaju kontroly na nich.
Poznámka
Continuous Integration je praktika, ktorá predpokladá častú integráciu práce všetkých členov tímu do jedného celku a automatické testovanie výsledku integrácie. V praxi sa však nástroje pre automatické overovanie vytvorené pre CI používajú univerzálne a nezávisle od toho, ako často integrujeme náš kód.
Gitlab poskytuje integrovanú službu CI, ktorá umožňuje definovať úlohy, ktoré sa budú automaticky spúšťať na serveri pri zmenách v repozitári. Na konfiguráciu tohto nástroja je potrebné vytvoriť súbor .gitlab-ci.yml
v hlavnom adresári projektu. Ako príklad si môžeme pozrieť konfiguráciu projektu Míny, ktorý bude základom pre zadanie 2.
default:
image: gcc:9
build:
stage: build
script:
- make
lint:
stage: test
before_script:
- apt-get -qq update
- apt-get -qq install -y cppcheck
script:
- cppcheck --error-exitcode=2 *.c
test:
stage: test
before_script:
- apt-get -qq update
- apt-get -qq install -y gcovr
script:
- make test
- gcovr -e tests
Konfiguračný súbor používa formát YAML. V sekcii default
je definované, že všetky úlohy budú spúšťané v kontajneri vytvorenom z obrazu gcc, ktorý je založený na Debiane a má pripravené nástroje pre kompiláciu. Ďalej sú definované tri úlohy a skripty, ktoré sa pre ich vykonania majú spustiť. V našom prípade je to
- build — preklad programu pomocou
make
, - lint — kontrola kódu programu pomocou Cppcheck,
- test — spustenie testov a výpočet pokrytia kódu testami.
Poznámka
Kontajner je v podstate odľahčený virtuálny stroj, v ktorom je využitá virtualizácia na úrovni jadra OS namiesto vytvárania virtuálneho hardvéru. Na vytváranie kontajnerov sa väčšinou používa nástroj Docker.
Rozšírením continuous integration je continuous delivery and deployment (CD), kedy sa automatizuje nielen zostavovanie a testovanie, ale aj nasadenie novej verzie do produkčného prostredia.
Úloha 1.1
Preskúmajte detaily automaticky spúšťaných úloh v projekte Míny. Pozrite si tiež výstup jednotlivých spúšťaných úloh.
Krok 2: Vyskúšanie automatického testovania
Úloha 2.1
Vytvorte si fork projektu notwork z minulého cvičenia. Naklonujte si repozitár na svoj počítač a upravte kód tak, aby v ňom bola chyba.
Napríklad zmeňte operátor <=
vo funkcii get_post
na <
:
post_t *get_post(wall_t *wall, int number) {
if (number > 0 && number < wall->num_posts)
return wall->posts[number - 1];
else
return NULL;
}
Predstavte si, že túto zmenu ste urobili omylom a zabudli spustiť testy.
Úloha 2.2
Zaznamenajte túto zmenu a odošlite ju na server pomocou git push
.
Po niekoľkých minútach by ste mali dostať email informujúci vás o zlyhaní testov. Túto informáciu tiež môžete nájsť na stránke vášho projektu v GitLabe.
Úloha 2.3
Preskúmajte informácie o zlyhaní. Prezrite si výpis spúšťaných príkazov.
Úloha 2.4
Opravte chybu a znovu nahrajte zmeny na server. Sledujte ako budete informovaní o výsledku.