Úvod

CI je zkratkou continuous integration - česky průběžná integrace. Využívá se u systémů správy verzí (Git, Subversion, ...) hlavně pro automatické testování kódu. Obecně lze CI využít k provedení jakýhkoliv příkazů či skriptů na daném projektu, po nahrání nových změn do repozitáře. Například když spravujete větší projekt, do kterého přispívá několik vývojářů, tak díky CI vidíte na první pohled, jestli začleňované změny fungují a jestli celý projekt nerozbijí. Více informací na wiki.

GitLab

Gitlab je komplexní aplikace, která od verze 8 plně integruje CI (dříve se jednalo o samostatnou aplikaci). Každý projekt má standardně CI povolené. Pokud ho u daného projektu nepotřebujeme, tak je dobré jít do nastavení projektu a CI zakázat.

Při správně nastaveném CI dojde po pushnutí nových commitů k jejich buildu (sestavení) - provedou se akce, které jsou definovány v souboru .gitlab-ci.yml. V záložce build poté můžeme sledovat, zda build proběhl správně nebo jestli se vyskytla chyba.

Výpis buidů

GitLab Runner

Jedná se o program, který vykonává samotný build pro projekt. Může být na vzdáleném serveru nebo i na Vašem počítači. Více informací + návod na instalaci.

.gitlab-ci.yml

Tímto souborem se nastavují akce, které se provádí při buildu. Soubor je součástí projektu, což sebou přináší řadu výhod - verzování, ostatní se mohou inspirovat a další.

Jedná se o soubor ve formátu YAML takže je důležité, aby se pro odsazování používaly 4 mezery, protože tabulátor není podporovaný!

Pro kontrolu syntaxe je výhodné použít CI lint.

Úplně základní .gitlab-ci.yml může vypadat takto:

before_script:
  - avr-gcc --version
  - which avr-gcc
  - find /usr/share/cmake/Modules -name "Findavr.cmake"

build-hex:
  script:
    - mkdir build
    - cd build
    - cmake ..
    - make

  artifacts:
    paths:
      - build/program.hex
  • before_script: - určuje, co se má vykonat před buildem - tady je dobré otestovat/nainstalovat balíčky, které jsou potřebné pro další operace
  • build-hex: - akce, kterou jsem pojmenoval build-hex
    • script: - určuje příkazy, které se mají vykonat - tedy v tomto případě se zkompiluje program pro mikroprocesor z rodiny AVR
    • artifacts: - určuje soubory nebo i celé složky, které se nahrají do GitLabu a budou dostupné pro stažení - tedy zde se nahraje výsledný HEX soubor
    • těchto akcí může být víc, například pro více typů mikroprocesorů, mohou se provést testy a podobně - tyto akce poté běží paralelně a nezávisle na sobě

Více informací o možnostech nastavení naleznete přehledně zde.

Závěr

Po pushnutí .gitlab-ci.yml se provede první build, který můžete sledovat v záložce Builds. Po kliknutí na status daného commitu se dostanete do podrobností a uvidíte výpis z průběhu buildu, což je užitečné pro hledání chyb.

gitlab-ci-multi-runner 1.0.4 (014aa8c)
Using Shell executor...
Running on tesla.ok1kvk.cz...
Fetching changes...
HEAD is now at 04020a5 Add .gitlab-ci.yml
From https://git.ok1kvk.cz/namespace/program
   04020a5..bb086a9  main     -> origin/main
Checking out bb086a97 as main...
Previous HEAD position was 04020a5... Add .gitlab-ci.yml
HEAD is now at bb086a9... Removed installation of dependecies
$ avr-gcc --version
avr-gcc (Fedora 4.9.3-1.fc23) 4.9.3
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ which avr-gcc
/usr/lib64/ccache/avr-gcc
$ find /usr/share/cmake/Modules -name "Findavr.cmake"
/usr/share/cmake/Modules/Findavr.cmake
$ mkdir build
$ cd build
$ cmake ..
-- The C compiler identification is GNU 5.3.1
-- The CXX compiler identification is GNU 5.3.1
-- Check for working C compiler: /usr/lib64/ccache/cc
-- Check for working C compiler: /usr/lib64/ccache/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Current uploadtool is: avrdude
-- Current programmer is: usbasp
-- Current upload port is: usb
-- Current uploadtool options are:
-- Current MCU is set to: atmega32
-- Current H_FUSE is set to: 0xC8
-- Current L_FUSE is set to: 0x1F
-- Set CMAKE_FIND_ROOT_PATH to /usr/avr
-- Set CMAKE_SYSTEM_INCLUDE_PATH to /usr/avr/include
-- Set CMAKE_SYSTEM_LIBRARY_PATH to /usr/avr/lib
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gitlab-runner/builds/bb8725f4/0/namespace/program/build
$ make
Scanning dependencies of target program.elf
[ 11%] Building CXX object CMakeFiles/program.elf.dir/main.cpp.o
[ 22%] Building CXX object CMakeFiles/program.elf.dir/bootloader.cpp.o
/home/gitlab-runner/builds/bb8725f4/0/namespace/program/bootloader.cpp: In member function 'void bootloader::send_all_programmed_memory_back()':
/home/gitlab-runner/builds/bb8725f4/0/namespace/program/bootloader.cpp:148:59: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (uint16_t address = current_page*SPM_PAGESIZE; address < (current_page+1)*SPM_PAGESIZE; address++)
                                                           ^
[ 33%] Building CXX object CMakeFiles/program.elf.dir/spisimple.cpp.o
[ 44%] Building CXX object CMakeFiles/program.elf.dir/MCP2515.cpp.o
[ 55%] Building CXX object CMakeFiles/program.elf.dir/wait.cpp.o
[ 66%] Building CXX object CMakeFiles/program.elf.dir/cplusplus.cpp.o
[ 77%] Linking CXX executable program.elf
[ 77%] Built target program.elf
Scanning dependencies of target program
[ 88%] Generating program.hex
AVR Memory Usage
----------------
Device: atmega32

Program:    2904 bytes (8.9% Full)
(.text + .data + .bootloader)

Data:        135 bytes (6.6% Full)
(.data + .bss + .noinit)


[100%] Generating program-eeprom.hex
[100%] Built target program
Archiving artifacts...
build/program.hex: found 1 matching files
Creating archive artifacts.zip ...
Done!
Uploading artifacts...
Uploading artifacts to coordinator... ok            id=19 token=wYfG9wtk

Build succeeded.

Pokud chcete někam umístit status posledníhu buidu, tak ho naleznete na této adrese: https://git.ok1kvk.cz/namespace/project/badges/branch/build.svg

Zdroje

Dejte nám vědět!

Napište nám na naše fórum.