10. týždeň

Nástroje pre automatizáciu procesov

Systémy Continuous Integration/Continuous Deployment

Ciele

  1. Oboznámiť sa s fungovaním CI nástrojov.
  2. 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.

Úvod do automatizácie a nástrojov CI/CD

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.