Newer
Older
```
title = "Úvod do GitLab CI"
perex = "Stručný úvod do nástroje continuous integration, který je integrován do GitLabu. Zaměříme se na základní používání a nastavení."
image = "ci-lead.png"
lang = "yaml"
```
# Ú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](https://cs.wikipedia.org/wiki/Pr%C5%AFb%C4%9B%C5%BEn%C3%A1_integrace).
# 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.

# 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í](https://about.gitlab.com/gitlab-ci/#gitlab-runner) + [návod na instalaci](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner#install-gitlab-runner).
# .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ší](https://about.gitlab.com/2015/05/06/why-were-replacing-gitlab-ci-jobs-with-gitlab-ci-dot-yml/).
Jedná se o soubor ve formátu [YAML](https://cs.wikipedia.org/wiki/YAML) takže je důležité, aby se pro odsazování používaly 4 mezery, protože tabulátor není podporovaný!
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Pro kontrolu syntaxe je výhodné použít [CI lint](https://git.ok1kvk.cz/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](http://doc.gitlab.com/ce/ci/yaml/README.html).
# 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 master -> origin/master
Checking out bb086a97 as master...
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
- https://about.gitlab.com/gitlab-ci/
- http://doc.gitlab.com/ce/ci/quick_start/
- https://about.gitlab.com/2015/12/14/getting-started-with-gitlab-and-gitlab-ci/
- http://doc.gitlab.com/ce/ci/yaml/README.html
- https://gitlab.com/groups/gitlab-examples
- http://doc.gitlab.com/ce/ci/
# Dejte nám vědět!
Napište nám na naše [fórum](http://forum.ok1kvk.cz/).