Nástroje pro podporu tvorby softwarových produktů
Sledování chyb a správa úkolů (používané nástroje, typický životní cyklus úkolu/chyby), správa a sdílení zdrojových kódů (principy řešení spolupráce, hlavní přínosy, používané nástroje).
🔄 Co je DevOps a proč vznikl
Problémy, které DevOps řeší
- Při vývoji SW je nutná spolupráce více osob v různých rolích (zákazník, analytik/vývojář, administrátor) — každé předání informací/zodpovědností přináší riziko.
- Nasazení nové verze do produkce typicky znamenalo výpadek služby — provádělo se mimo pracovní dobu.
- Nasazení prováděl administrátor manuálně na základě podkladů od vývoje → zdlouhavé, chybové.
- Příčiny chyb mohly být na straně vývoje (chybějící skripty, konfigurace) i provozu (vynechání kroků, nezajištění závislostí).
- Tyto problémy vedly k omezování četnosti nasazování (např. jen 4× za rok).
Přínosy DevOps
- Zkrácení doby pro nasazení nové verze
- Minimalizace rizika vzniku chyby při nasazení
- Častější vydávání nových verzí
- Rychlejší vytváření/obnova prostředí
📝 Sdílení informací v týmu
Pro efektivní spolupráci je nezbytné sdílet informace — ne přes e-mail, ale přes online stránky dostupné všem členům týmu.
Co sdílet
- Základní informace o projektu, kontakty
- Zápisy ze schůzek
- Popis architektury / návrhů řešení
Jaké formáty a nástroje
- Značkovací jazyky: Markdown, AsciiDoc, HTML
- Rich Text / WYSIWYG editory
- GitLab wiki — integrovaná wiki, editace online v prohlížeči i lokálně (naklonováním git repo s wiki stránkami)
- Dokumenty ve formátu Markdown/AsciiDoc přímo v repository — GitLab je automaticky zobrazuje v HTML podobě
🎯 Správa úkolů a chyb (Issue Tracking)
Pomáhá vyřešit organizaci práce v týmu — evidenci, přidělování, plánování a kontrolu plnění úkolů.
Názvosloví (není sjednocené)
Různé systémy používají různé názvy: Ticket, Issue, Bug, Task
Evidované informace u úkolu
- Identifikátor (např. #123)
- Název a popis
- Milník (Milestone) — termín, do kterého má být úkol dokončen
- Priorita: blocker, critical, major, minor, trivial
- Severita — dopad na uživatele
- Typ: defect/bug, enhancement, task
- Závislosti mezi úkoly
- Odhadovaná pracnost a skutečně strávený čas
- Stav a způsob vyřešení
Priorita = v jakém pořadí se má úkol řešit (rozhoduje PM). Severita = jak závažný je dopad na uživatele (objektivní míra). Chyba může mít vysokou severitu ale nízkou prioritu (např. vážná chyba v málo používané funkci).
Specifické informace dle typu úkolu
- Chyba v produkci: použitý prohlížeč, OS, verze aplikace, postup pro reprodukci
- Záznam o testu: testovací scénář, prostředí
Většina nástrojů umožňuje rozšiřovat množství evidovaných informací a přizpůsobit workflow.
🔁 Typický životní cyklus úkolu/chyby
Z uzavřeného se může vrátit na Znovuotevřený (Reopened).
Způsoby vyřešení
| Stav | Význam |
|---|---|
| Fixed | Chyba opravena / úkol dokončen |
| Invalid | Nejedná se o platný požadavek / chybu |
| Won't Fix | Rozhodnuto neopravovat (záměr, nízká priorita) |
| Duplicate | Duplicitní záznam — již evidováno jinde |
🦊 GitLab Issue Management
V GitLabu se úkol nazývá Issue. Životní cyklus je zjednodušen na: open → closed.
- Lze rozšířit pomocí štítků (labels): assigned, in-progress, in-test, apod.
- Board (nástěnka) — přehled tiketů a stavů, rozšiřitelný o nové sloupce dle štítků; změna stavu přetažením (drag & drop).
- Priorita řešena formou prioritních štítků.
Odhadování a vykazování času
- Vkládání komentářů:
/estimate 15m,/spend 5m,/remove_time_spent - Jednotky:
d(dny),h(hodiny),m(minuty),s(sekundy) - GitLab automaticky sčítá a zobrazuje Spent vs. Est.
Automatické zavírání Issues pomocí commitu
- Popis commitu musí obsahovat
Fix #id(např.Fix #121) - Commit musí být začleněn do default větve (push / merge)
- Odkaz na issue pomocí
#číslo
Milníky (Milestones)
Umožňují plánovat termíny dokončení úkolů. GitLab umožňuje sledovat jejich plnění — zobrazuje progress bar.
🛠️ Používané nástroje pro správu úkolů
| Nástroj | Poznámka |
|---|---|
| GitLab Issues | Integrovaný v GitLabu, jednoduché workflow, boardy |
| JIRA | Atlassian, velmi rozšířený v enterprise, komplexní workflow |
| Redmine | Open-source, flexibilní |
| Bugzilla | Mozilla, starší ale stále používaný |
| Mantis | Open-source bug tracker |
| Trac | Integruje wiki, tickety a SCM |
📂 Správa a sdílení zdrojových kódů (SCM)
Hlavní přínosy verzovacích systémů
- Sdílení souborů v rámci týmu
- Verzování — kompletní historie každého souboru, možnost se vrátit k libovolné verzi
- Omezení rizika ztráty dat — možnost obnovy; pro ochranu proti ztrátě disku je nutný vzdálený repositář
Centralizované vs. distribuované systémy
Centralizované
- Všechny revize pouze na centrálním serveru
- Lokálně jen pracovní verze (aktuální revize)
- Příklady: SVN, CVS, TFS VC
Distribuované
- Na lokálním počítači všechny revize/verze
- Velká část operací prováděna lokálně (rychlost, offline práce)
- Příklady: Git, Mercurial
Principy řešení spolupráce
| Režim | Popis | Kdy použít |
|---|---|---|
| Slučování změn (Merge) | Souběžné úpravy → ruční sloučení při konfliktech. Centralizované i distribuované systémy. | Zdrojové kódy (textové soubory) |
| Zamykací režim (Lock) | Soubor zamčen → nemůže ho upravovat více osob. Pouze centralizované systémy (SVN). | Binární soubory (obrázky, PDF…), kde nelze slučovat po částech |
🌿 Git Workflows — strategie větvení
Workflow = dohoda v rámci týmu, jakým způsobem se bude pracovat s větvemi v repository. Existují různé varianty, každá vhodná pro jiný typ projektu.
Git Flow
Velmi komplexní workflow — může přinést zbytečnou složitost pro menší projekty.
Dvě hlavní (trvalé) větve:
master/main— kód připravený k nasazení do produkce; commity se označují tagem verzedevelop— hlavní vývojová větev, integrují se nové funkčnosti pro příští verzi
Podpůrné (dočasné) větve:
- Feature — nové funkčnosti; vzniká z
develop, slučuje se zpět dodevelop; pojmenování:feature-* - Release — příprava na uvolnění do produkce; vzniká z
develop, slučuje se dodevelopimaster; pojmenování:release-* - Hotfix — opravy kritických chyb v produkci; vzniká z
master, slučuje se domasteridevelop; pojmenování:hotfix-*
GitHub Flow
Jednodušší — odstraňuje komplexitu Git Flow. Předpokládá nasazení kdykoliv.
main/master— hlavní větev, slouží pro nasazování do produkce- Feature větve — vývoj nových funkčností, slučují se zpět do main
⚠️ Neřeší problematiku více prostředí (TEST, UAT, PROD).
GitLab Flow
Snaží se řešit nedostatky GitHub Flow — nabízí řešení pro správu nasazování do více prostředí.
- Pro každé prostředí existuje stabilní větev, která nikdy nezaniká (testing, staging, production)
- Sloučením vývojové větve do těchto větví dochází k nasazení aplikace na dané prostředí
📌 Shrnutí okruhu 8
- DevOps spojuje vývoj a provoz — automatizuje celý proces od kódu po nasazení, čímž snižuje riziko chyb a zvyšuje četnost releasů.
- Issue tracking organizuje práci v týmu — evidence úkolů s identifikátorem, prioritou, severitou, milníky a životním cyklem (new → assigned → resolved → closed). Řešení: fixed, invalid, won't fix, duplicate.
- SCM zajišťuje verzování, sdílení souborů a ochranu dat. Centralizované (SVN) vs. distribuované (Git). Spolupráce: slučování změn vs. zamykání.
- Git Workflows: Git Flow (komplexní: master + develop + feature/release/hotfix), GitHub Flow (jednoduchý: main + feature branches), GitLab Flow (řeší více prostředí pomocí stabilních větví).
- Hlavní nástroje: GitLab, JIRA, Redmine, Bugzilla, Git, SVN.
❓ Kontrolní otázky k okruhu 8
DevOps je přístup spojující Development a Operations. Řeší problémy vznikající na rozhraní vývoje a provozu — manuální nasazení je chybové, pomalé, omezuje četnost releasů. DevOps automatizuje celý pipeline od integrace kódu po nasazení, minimalizuje rizika a zkracuje dobu nasazení.
Eviduje se: identifikátor, název, popis, milník, priorita (blocker–trivial), severita, typ (bug/enhancement/task), závislosti, odhad pracnosti, skutečný čas, stav. Životní cyklus: Nový → Přiřazený → Vyřešený → Uzavřený (+ Znovuotevřený). Způsoby vyřešení: Fixed, Invalid, Won't Fix, Duplicate.
Priorita určuje pořadí řešení (rozhoduje projektový manažer). Severita je objektivní míra dopadu chyby na uživatele. Chyba může mít vysokou severitu ale nízkou prioritu — např. závažná chyba v málo používané funkci.
Dva režimy spolupráce: Slučování změn (merge) — souběžné úpravy textových souborů, nutné ruční sloučení při konfliktech. Zamykání — soubor uzamčen pro jednoho uživatele, pouze u centralizovaných systémů (SVN), vhodné pro binární soubory.
Centralizované (SVN): revize jen na serveru, lokálně pouze pracovní verze. Distribuované (Git): lokálně všechny revize → rychlejší operace, offline práce, bezpečnější.
Git Flow: komplexní — master + develop (trvalé) + feature/release/hotfix (dočasné). Vhodný pro projekty s plánovanými releasy.
GitHub Flow: jednoduchý — jen main + feature branches. Vhodný pro projekty s průběžným nasazováním (CD). Neřeší více prostředí.
GitLab Flow: rozšiřuje GitHub Flow o stabilní větve pro prostředí (testing, staging, production). Sloučením do příslušné větve probíhá nasazení.
Commit musí v popisu obsahovat klíčové slovo Fix #id (např. Fix #121). Commit musí být začleněn do default větve projektu (push nebo merge). Issue se po tom automaticky zavře. Odkaz na issue se vytváří pomocí #číslo.
Zajištění kvality software
Typologie testů, black vs. white box, automatizace testů, statická analýza kódu, code review, zranitelnosti aplikací.
🧪 Typologie testů
Testování je klíčovou součástí zajištění kvality SW. Testy se dělí podle několika hledisek.
Podle úrovně / rozsahu
| Typ testu | Co testuje | Charakteristika |
|---|---|---|
| Unit testy | Nejmenší jednotku kódu (metodu, funkci) | Rychlé, izolované, bez závislostí na externích systémech. Tvoří základ testovací pyramidy. |
| Integrační testy | Spolupráci více komponent/modulů | Ověřují, že komponenty spolu fungují správně (např. aplikace + databáze). Pomalejší než unit testy. |
| Systémové testy | Celý systém jako celek | End-to-end testování, simulují reálné použití. |
| Akceptační testy | Splnění požadavků zákazníka | Prováděné zákazníkem, ověření business požadavků. |
Podle účelu
- Funkční testy — ověřují, že aplikace dělá to, co má (správnost výstupů)
- Nefunkční testy — výkonové, zátěžové, bezpečnostní, testy použitelnosti
- Regresní testy — ověřují, že nová změna „nerozbila" existující funkcionalitu
- Smoke testy — rychlá povinná sada testů v CI, ověřující základní funkčnost
- Kvalifikační testy — kombinace automatických a manuálních testů před dodávkou
Nejvíce unit testů (rychlé, levné) → méně integračních → nejméně E2E/UI testů (pomalé, drahé). Smoke testy běží v CI jako povinná krátká sada. Výkonové a manuální testy probíhají až u akceptace.
⬛⬜ Black Box vs. White Box testování
Black Box
- Tester nezná vnitřní strukturu kódu
- Testuje se pouze přes vstupy a výstupy
- Vychází ze specifikace/požadavků
- Příklady: funkční testy, akceptační testy, testy rozhraní
- Výhoda: nezávislost na implementaci
White Box
- Tester zná vnitřní strukturu kódu
- Testuje se logika, větve, cesty v kódu
- Vychází z implementace
- Příklady: unit testy, testy pokrytí kódu
- Výhoda: důkladnější pokrytí logiky
Kombinace obou přístupů — tester má částečnou znalost vnitřní struktury. Typické pro integrační testování.
🤖 Automatizace testů
Cílem je zajistit opakovatelné a spolehlivé spouštění testů bez manuálního zásahu.
Princip AAA (Arrange – Act – Assert)
- ARRANGE — příprava testovacích dat a prostředí (inicializace objektů, nastavení vstupů)
- ACT — provedení testované akce (volání metody)
- ASSERT — ověření výsledku (porovnání s očekávaným výstupem)
Příklad unit testu (Java + JUnit)
@Test
void shouldPassWhenValidPhoneWithPrefix() {
// Arrange
PhoneValidator phoneValidator = new PhoneValidator();
// Act
boolean valid = phoneValidator.validatePhone("+420 721 123 456");
// Assert
Assertions.assertTrue(valid);
}
Testovací dvojníci (Test Doubles)
Při unit testování potřebujeme izolovat testovanou jednotku od závislostí (databáze, externí služby). K tomu slouží testovací dvojníci:
- Stub — vrací předem definované odpovědi (nahrazuje skutečnou implementaci)
- Mock — kromě vracení odpovědí ověřuje, zda byla volána očekávaná metoda (verifikace interakce)
Příklad s mockem (Mockito)
@Test
void testDeliveryCreatedWhenOrderIsPaid() {
// Arrange
DeliveryService deliveryService = Mockito.mock(DeliveryService.class);
PaymentService paymentService = Mockito.mock(PaymentService.class);
OrderRepository orderRepo = Mockito.mock(OrderRepository.class);
ShoppingService service = new ShoppingService(
deliveryService, paymentService, orderRepo);
Order dummyOrder = new Order(1);
when(paymentService.isOrderPaid(1)).thenReturn(true);
when(orderRepo.findById(1)).thenReturn(dummyOrder);
// Act
service.finishOrder(1);
// Assert
verify(deliveryService).createDelivery(dummyOrder);
}
- Testy běží automaticky v CI pipeline při každé změně kódu
- Rychlá zpětná vazba pro vývojáře
- Regresní kontrola — ochrana před zanesením nových chyb
- Opakovatelnost — stejný výsledek na jakémkoliv prostředí
🔍 Statická analýza kódu
Typy problémů, které odhaluje
1. Technický dluh (Maintainability)
- Neomezuje funkcionalitu, ale prodlužuje vývoj nových funkčností
- Nepoužívané importy, zakomentovaný kód
- Literály v kódu místo konstant (magic numbers)
- Příliš složitá větvení (špatná čitelnost, zdroj chyb)
- Nedodržování jmenných konvencí
- Nejčastější důvody: časový tlak, nedostatek zkušeností
2. Duplikace kódu – DRY princip
- Don't Repeat Yourself — při změně nutno upravit na všech místech
- ⚠️ Ne vždy je stejný kód porušením DRY — pokud spolu logicky nesouvisí, nejedná se o duplicitu (každý blok má jiný důvod ke změně)
- Duplikace dat: správné uložení v DB + pojmenované konstanty místo opakování literálu
3. Problémy se spolehlivostí (Reliability)
- Použití proměnné, která může být
null - Podmínky, které se vždy vyhodnotí jako true/false
- Nepoužité proměnné
4. Problémy se zabezpečením (Security)
- SQL dotazy sestavované spojováním stringů (SQL injection)
- Hesla uložená ve zdrojovém kódu
- Připojení do databáze bez hesla
SonarQube – hlavní nástroj
- Ukazuje aktuální stav i historický vývoj kvality
- Odděluje problémy v novém kódu vs. původním kódu (motivace pro vývojáře)
- Automaticky přiřadí problém autorovi dané části kódu (přes Git)
- 4 metriky: Security, Reliability, Maintainability, Security Hotspots
Quality Gates
- Podmínky minimální kvality — lze definovat kritéria nad novým i celkovým kódem
- Kritéria: pokrytí testy, duplikace, bezpečnost, spolehlivost, udržovatelnost
- Pokud projekt nesplní Quality Gate → build selže
Řešení nalezených problémů
- Fixed — opraveno přímo v kódu, uzavře se při další analýze
- False Positive — nejedná se o skutečný problém
- Won't Fix — problém není relevantní pro daný kontext
Další nástroje
FindBugs, PMD (Java), PHPStan (PHP), ESLint (JavaScript)
Spouštění
- Jako plugin v buildovacím nástroji:
mvn sonar:sonar(Maven), Gradle, dotnet - Jako samostatný CMD nástroj
- Konfigurace:
sonar.host.url,sonar.projectKey,sonar.token
👁️ Code Review (Posouzení kódu)
Princip procesu
- Autor vytvoří Merge Request / Pull Request
- Přiřadí se reviewer (posuzovatel)
- Reviewer přidává komentáře a návrhy na změny (suggestions)
- Autor zapracuje připomínky nebo vyřeší v diskuzi
- Po vyřešení všech připomínek se provede sloučení (merge)
- Komentáře v rámci review jsou viditelné pouze autorovi — zveřejní se až po dokončení review
- Reviewer si může označovat zkontrolované části kódu
- Při změně již zkontrolovaného kódu se označení odstraní → nutno zkontrolovat znovu
- Návrhy (suggestions) lze jedním klikem aplikovat přímo
Nejdříve statická analýza (automaticky v CI) → pak teprve Code Review (manuálně). Šetří to čas reviewera — nemusí řešit problémy, které odhalí nástroj.
🛡️ Zranitelnosti aplikací
OWASP TOP 10 (2021)
| # | Název | Popis a příklad |
|---|---|---|
| A01 | Broken Access Control | Obejití kontroly přístupu úpravou URL (např. změna ID uživatele v URL → přístup k cizím datům). |
| A02 | Cryptographic Failures | Data posílána nešifrovaně (HTTP, FTP), neověřování certifikátu, ukládání citlivých dat nešifrovaně. |
| A03 | Injection | Neošetřený uživatelský vstup — SQL Injection, OS Command Injection, XSS (Cross-Site Scripting — spuštění útočníkova scriptu v prohlížeči oběti). |
| A04 | Insecure Design | Slabiny z návrhu, ne implementace — obnovení hesla přes otázky, chybějící ochrana proti robotům. |
| A05 | Security Misconfiguration | Ponechání výchozích hesel, povolení nepoužívaných služeb/portů, stack trace viditelný uživateli. |
| A06 | Vulnerable Components | Použití knihoven se známými zranitelnostmi (nejsou aktualizovány). |
| A07 | Auth. Failures | Hesla nehashovány, slabá hesla, Session ID v URL, neomezená platnost session. |
| A08 | SW & Data Integrity | Nedůvěryhodné zdroje v CI/CD, nebezpečný kód z cizích repository, chybějící řízení přístupu k pipeline. |
| A09 | Logging & Monitoring | Aplikace neloguje přihlášení (platné i neplatné), logy nejsou sledovány na podezřelé aktivity. |
| A10 | SSRF | Server-Side Request Forgery — útočník donutí server volat interní služby, ke kterým by neměl mít přístup. |
Další bezpečnostní databáze
- CWE (Common Weakness Enumeration) — obsáhlá databáze typů bezpečnostních problémů, TOP 25 zranitelností, detailnější než OWASP
- CVE (Common Vulnerabilities and Exposures) — zranitelnosti v konkrétních produktech/knihovnách
Kontrola zranitelností v knihovnách
- Bezpečnostní problém se může dostat do aplikace použitím zranitelné knihovny
- Kontrola probíhá automaticky při sestavení + v pravidelných intervalech (zranitelnost se může objevit i bez změny kódu)
- Nástroje využívají veřejné databáze známých zranitelností (CVE)
- Součástí závislosti by vždy měla být konkrétní verze — jinak nemusí být výsledek sestavení vždy stejný
NPM specifika verzování závislostí
^(caret) — zachovává MAJOR verzi (povoluje MINOR a PATCH aktualizace)~(tilde) — zachovává MAJOR.MINOR verzi (povoluje jen PATCH)package-lock.json— obsahuje přesné verze použité při sestavení, musí se verzovat v Gitu → zajišťuje totožný výsledek na všech prostředích
OWASP Dependency Check
- Stahuje aktuální seznam známých zranitelností při spuštění
- Lze spouštět jako plugin pro Maven/Gradle nebo z příkazové řádky
- V pipeline hrozí překročení limitu stahování → řešení: lokální DB zranitelností + cache
📌 Shrnutí okruhu 9
- Typologie testů: unit → integrační → systémové → akceptační (pyramida). Dále: regresní, smoke, výkonové, funkční vs. nefunkční.
- Black box (testuji přes vstupy/výstupy, neznám kód) vs. White box (testuji logiku, větve, pokrytí kódu). Grey box = kombinace.
- Automatizace testů: princip AAA (Arrange–Act–Assert), testovací dvojníci (Stub = předem definované odpovědi, Mock = verifikace volání).
- Statická analýza: kontrola bez spuštění, odhaluje technický dluh, duplikace (DRY), problémy spolehlivosti a bezpečnosti. SonarQube s Quality Gates.
- Code Review: manuální posouzení v Merge Requestu, předchází jí statická analýza. Suggestions, labeled reviewed files.
- OWASP TOP 10: A01 Broken Access Control, A03 Injection (SQL, XSS), A06 Vulnerable Components… + CWE, CVE databáze. Dependency Check pro knihovny.
❓ Kontrolní otázky k okruhu 9
Unit testy (nejmenší jednotky, nejvíce jich je, nejrychlejší) → integrační testy (spolupráce komponent) → systémové/E2E testy (celý systém) → akceptační testy (zákazník). Pyramida říká: nejvíce unit testů, nejméně E2E — protože s rostoucí úrovní roste i cena a čas.
Black box: tester nezná implementaci, testuje jen vstupy a výstupy dle specifikace. White box: tester zná kód, testuje větve, cesty, pokrytí. Black box je nezávislý na implementaci, white box pokrývá logiku důkladněji. Grey box je kombinace (částečná znalost).
AAA: Arrange (příprava dat, závislostí), Act (provedení akce), Assert (ověření výsledku). Stub nahrazuje závislost s předem definovanými odpověďmi — neověřuje interakci. Mock navíc verifikuje, že byla volána konkrétní metoda s konkrétními parametry.
Statická analýza kontroluje kód bez jeho spuštění, založena na detekci chybových vzorů. SonarQube odhaluje 4 kategorie: Security (SQL injection, hesla v kódu), Reliability (null pointer, mrtvý kód), Maintainability (technický dluh, duplikace, magic numbers) a Security Hotspots (vyžadují manuální posouzení). Quality Gates definují minimální kvalitu — pokud nesplněny, build selže.
Code Review probíhá v rámci Merge/Pull Requestu. Reviewer přidává komentáře a suggestions, autor je zapracuje. Po vyřešení se provede merge. Důležité je: sdílení znalostí v týmu, zachycení logických chyb, které statická analýza neodhalí. Statická analýza by měla proběhnout PŘED code review — šetří čas reviewera.
- A01 Broken Access Control — obejití kontroly přístupu úpravou URL/parametrů
- A03 Injection — SQL injection, XSS: neošetřený vstup interpretovaný jako kód
- A05 Security Misconfiguration — výchozí hesla, otevřené porty, stack trace na produkci
- A06 Vulnerable Components — použití knihoven se známými zranitelnostmi
- A07 Auth. Failures — nehashovná hesla, session ID v URL, neomezená platnost session
- A10 SSRF — útočník donutí server volat interní služby přes URL v požadavku
Kontrola probíhá automaticky pomocí nástrojů jako OWASP Dependency Check, které porovnávají verze knihoven s databázemi CVE. Závislosti musí mít specifikovanou konkrétní verzi. package-lock.json vzniká automaticky při úpravě závislostí NPM, obsahuje přesné verze všech knihoven a musí být verzován v Gitu — zajišťuje totožný build na všech prostředích. V NPM: ^ zachovává MAJOR, ~ zachovává MAJOR.MINOR.
Kontinuální integrace, release management a kontejnerizace
Kontinuální integrace, nástroje pro sestavení aplikace, definice pipeline, release management, sémantické verzování, nasazení aplikace, správa prostředí, přínosy kontejnerizace a používané nástroje.
🔄 CI/CD – Kontinuální integrace a nasazení
• Continuous Delivery = navazuje na CI + automatická příprava balíčku pro nasazení (ale nasazení je manuální)
• Continuous Deployment = automatizuje i vlastní nasazení do produkce
Problémy, které CI/CD řeší
- Různá vývojová prostředí → v CI probíhá sestavení na pevně definovaném prostředí → výsledek je vždy stejný
- Manuální kroky jsou zdrojem chyb → proces se popisuje skripty/konfigurací, které se verzují
- Spouštěné úlohy trvají dlouho → běží na samostatném serveru, nezatěžují počítač vývojáře
- Při problému je vývojář ihned notifikován (e-mail) a měl by problém okamžitě opravit
🏗️ Nástroje pro sestavení aplikace (Build Tools)
Umožňují připravit skripty pro automatické a opakovatelné sestavení. Odstraňují specifika prostředí každého vývojáře.
Společné vlastnosti
- Wrapper — malá binárka verzovaná se zdrojovým kódem → všichni používají stejnou verzi nástroje
- Správa závislostí — definice potřebných knihoven v konfiguračním souboru, automatické stahování z repository (veřejných i privátních)
- Stažené knihovny se ukládají lokálně (cache) — nestahují se opakovaně
- Součástí závislosti musí být specifikace konkrétní verze
Přehled nástrojů
| Nástroj | Jazyk | Konfigurace | Klíčové vlastnosti |
|---|---|---|---|
| Maven | Java | pom.xml (XML) | Konvence nad konfigurací, životní cyklus (process-resources → compile → test → package), plugin:goal systém, repository mvnrepository.com |
| Gradle | Java, Kotlin, Groovy | build.gradle (Groovy/Kotlin) | Novější, inspirovaný Mavenem, stejné repository, tasky místo fází |
| npm | JavaScript | package.json | Správa závislostí, scripty pro sestavení, npmjs.com registry |
| Make | C/C++ | Makefile | Nejstarší, pravidla a závislosti |
Dodržením konvencí (adresářová struktura, pojmenování) se velmi zjednoduší konfigurace. Konvence lze změnit, ale výchozí nastavení stačí pro většinu projektů.
⚡ Definice Pipeline
Struktura pipeline
- Skládá se z úloh (jobs/tasks/steps)
- Úlohy se seskupují do fází (stages)
- Fáze se spouštějí sekvenčně
- Úlohy v rámci jedné fáze se mohou spouštět paralelně
- Následující fáze se spustí až po dokončení předchozí
Spouštění pipeline
- Při změně kódu — repo notifikuje CI server, nebo CI server kontroluje repo v intervalech
- V pravidelných intervalech (scheduled) — např. kontrola zranitelností (CRON syntaxe)
- Automatické nebo manuální spouštění úloh (
when: manual)
Důležité koncepty
- Proměnné (variables) — nahrazují hodnoty při spuštění, zamezují duplikaci, lze skrýt (security)
- Artefakty — výstupy úloh, sdílejí se mezi úlohami (jedna vytvoří balíček, jiná ho nasadí)
- Cache — úložiště pro závislosti/knihovny, které se opakovaně používají; řízena klíčem (
$CI_COMMIT_REF_NAMEpro větev,$CI_JOB_NAMEpro úlohu). Sestavení musí fungovat i bez cache!
GitLab CI – konfigurace
- Uložena v souboru
.gitlab-ci.ymlv git repository (formát YAML) - Termíny: Pipeline → Stage → Job
- Omezení spouštění na vybrané větve:
only: [master] allow_failure— určuje, zda je dokončení úlohy vyžadováno pro úspěch pipeline- Plánovač: CRON syntaxe (5 hodnot: minuty, hodiny, den v měsíci, měsíc, den v týdnu)
Nástroje pro CI/CD
GitLab CI, Jenkins, Bitbucket Pipelines, Bamboo, Circle CI, GitHub Actions
📦 Release Management
Sémantické verzování (SemVer)
MAJOR.MINOR.PATCH
- MAJOR — změny, které nejsou zpětně kompatibilní (breaking changes)
- MINOR — přidání funkcionality se zachováním zpětné kompatibility
- PATCH — oprava chyby (při zachování kompatibility)
Předběžné verze: 1.2.0-rc, 1.2.0-SNAPSHOT (pomlčka + identifikátor)
⚠️ MAJOR verze 0 je vyhrazena pro počáteční rozvoj (před prvním oficiálním vydáním).
Plánování release
- Zahrnují se pouze dokončené a otestované funkčnosti
- Plánování pomocí systému pro správu úkolů (milníky)
- Na úrovni kódu řízeno větvemi dle workflow — nová funkčnost nesloučena, dokud nemá být dodána
Feature Flag
- Umožňuje přidat do release funkčnosti, které zatím nebudou dostupné zákazníkovi
- Dostupnost řízena přepínačem za běhu aplikace
- Strategie: dle prostředí, pouze vybraným uživatelům, určitému procentu uživatelů
- V kódu = podmínky pro zpřístupnění funkčnosti
- GitLab: Deploy → Feature Flags
🖥️ Nasazení aplikace a správa prostředí
Nasazení aplikace
- Vyžaduje často nasazení více komponent (aplikace + databáze)
- Databáze je složitější — obsahuje data, která nesmí být ztracena; skripty nejsou opakovatelně spustitelné, změny nejsou transakční
- Řešení: Flyway, Liquibase — nástroje pro migrace DB
Flyway – typy migrací
- Verzované (
V3__create_table.sql) — neopakovatelné, pro konkrétní verzi - Undo (
U3__create_table.sql) — pro návrat k předchozí verzi - Opakovatelné (
R__create_function.sql) — spouštěny vždy (procedury, funkce) - Baseline (
B2__create_database.sql) — úplné migrace pro nové prostředí - Aktuální verze DB uložena v tabulce
flyway_schema_history
Typy prostředí
| Prostředí | Účel |
|---|---|
| DEV | Vývojové — lokální počítač vývojáře |
| TEST | Testovací — automatické testy, manuální testování dodavatelem |
| UAT/PREPROD | Akceptační — co nejpodobnější produkci, akceptační testy zákazníkem, školení |
| PROD | Produkční — reální uživatelé |
Pravidla správy prostředí
- Jeden artefakt pro všechna prostředí (konfigurace je mimo aplikaci)
- Prostředí si mají být co nejpodobnější (čím blíže produkci, tím více)
- Minimalizovat manuální zásahy; neprovádět manuální změny na produkci
- Nemazat staré soubory, raději přesunout (snadný rollback)
- Izolace prostředí — zabránit přístupu testovacího prostředí k produkčním datům (emaily → MailHog, externí služby → Mocky/SoapUI)
Konfigurace specifická pro prostředí
- Zdrojové kódy nezávislé na prostředí
- Konfigurace společná = v aplikaci; specifická = mimo aplikaci (proměnné CI/CD, konfigurace nástrojů)
- Citlivé informace: šifrování, maskování, řízení přístupu
- Chráněné větve + chráněné proměnné + manuální potvrzení nasazení
Příprava testovacích dat
- Generování — náhodná/konstantní data, generátory reálných dat (Mockaroo)
- Anonymizace produkčních dat — slovníkové metody, mikroagregace; pozor na nedostatečnou anonymizaci (pole poznámka, dokumenty)
🐳 Kontejnerizace
Princip virtualizace
Technika abstrakce zdrojů počítače umožňující spuštění více kopií OS na jednom stroji. Ošetřuje: instrukční sadu, plánování procesů, správu paměti, periferie.
4 druhy virtualizace
| Typ | Princip | Příklady |
|---|---|---|
| Emulace | Efekt každé instrukce simulován v SW (libovolná architektura, pomalé) | QEMU, DosBox |
| Plná / HW akcelerovaná | Stejná architektura, privilegované instrukce přes hypervizor | VirtualBox, VMware, KVM |
| Paravirtualizace | OS upraven, aby nepotřeboval privilegované instrukce | Xen |
| Kontejnerizace | Prostředí oddělena prostředky jádra jednoho OS | Docker, LXC, CRI-O |
VM vs. Kontejner
VM (Virtual Machine)
- Hypervizor odděluje prostředky, spouští celé OS
- Větší, pomalejší start
- Fixní alokace paměti
- Silnější izolace
Kontejner
- Sdílí jádro hostitelského OS
- Menší, velmi rychlý start
- Sdílená paměť (lepší využití)
- Sdílený souborový systém (úspora disku)
Kontejnerová primitiva (Linux)
- Namespaces (jmenné prostory) — oddělují PID, UID, souborový systém, síť
- Cgroups (kontrolní skupiny) — omezují CPU, paměť, I/O
- SELinux / AppArmor — zabraňují přístupu mimo kontejner
- Seccomp & Capabilities — omezují přístup k zařízením a práva root
Systémový vs. aplikační kontejner
- Systémový — celý OS, init démon, více procesů (LXC, OpenVZ, BSD Jails)
- Aplikační — pouze 1 proces, nejznámější: Docker
Přínosy kontejnerizace (Docker)
- Formát distribuce SW — nese všechny závislosti ve správných verzích
- Běží stejně ve všech prostředích (dev/test/prod) → řeší „Works on my machine"
- Vyšší hustota na serveru (menší režie než VM)
- Lepší využití paměti a místa na disku (sdílený FS, vrstvy)
- Pro administrátora: všechny aplikace vypadají stejně (nezáleží na jazyku)
Docker – klíčové koncepty
- Dockerfile — konfigurační soubor pro sestavení obrazu (FROM, RUN, COPY, CMD, EXPOSE, VOLUME, ENV, ENTRYPOINT)
- Vrstvy — každý řádek Dockerfile = jedna vrstva; sdílení a kešování vrstev šetří místo a šířku pásma
- Registry — repozitáře obrazů (Docker Hub, Quay.io, GitLab Container Registry, Nexus, Artifactory)
- Svazky (Volumes) — perzistentní data mimo vrstvený FS, nezávislé na změně kontejneru
- Docker Compose — definice a spouštění aplikací z více kontejnerů (
compose.yaml, YAML),docker compose up/down
Integrace s CI
- Dockerfile součástí pipeline — automatické sestavení a push do registry
- Webhook na službu, která si stáhne kód a sestaví kontejner
- Pokročilé: Fabric8 plugin pro Maven, Tekton Pipelines pro Kubernetes
📌 Shrnutí okruhu 10
- CI = automatická integrace + build + testy. CD = Continuous Delivery (příprava balíčku) nebo Deployment (automatické nasazení do produkce).
- Build tools (Maven, Gradle, npm) zajišťují opakovatelné sestavení, správu závislostí a wrapper pro konzistentní verzi nástroje.
- Pipeline = stages → jobs (paralelně v rámci stage, sekvenčně mezi stages). Artefakty, cache, proměnné. GitLab CI:
.gitlab-ci.yml. - Sémantické verzování: MAJOR.MINOR.PATCH. Feature Flag umožňuje zahrnout nehotové funkčnosti do release.
- Prostředí: DEV → TEST → UAT → PROD. Jeden artefakt, konfigurace mimo aplikaci, izolace prostředí, chráněné větve/proměnné.
- Kontejnerizace (Docker): odstraňuje „works on my machine", nese závislosti, sdílení vrstev. Namespaces + Cgroups + SELinux. Docker Compose pro multi-container aplikace.
❓ Kontrolní otázky k okruhu 10
CI: integrace kódu do společného repo + automatický build a testy. Continuous Delivery: navazuje na CI, automaticky připravuje balíček pro nasazení, ale samotné nasazení je manuální. Continuous Deployment: automatizuje i nasazení do produkce — každá změna, která projde testy, se nasadí.
Pipeline je sada automatických kroků v CI/CD. Skládá se z fází (stages), které běží sekvenčně. Každá fáze obsahuje úlohy (jobs), které mohou běžet paralelně. Spouští se při změně kódu, plánovačem (CRON) nebo manuálně. Výstupy úloh (artefakty) lze sdílet mezi úlohami. V GitLabu se konfiguruje v .gitlab-ci.yml.
Zajišťují opakovatelné sestavení a správu závislostí. Maven (Java): XML konfigurace (pom.xml), konvence nad konfigurací, životní cyklus fází. Gradle (Java/Kotlin): novější, Groovy/Kotlin konfigurace (build.gradle), tasky. npm (JavaScript): package.json, scripty, npmjs.com. Všechny podporují wrappery pro konzistentní verze a lokální cache knihoven.
SemVer: MAJOR.MINOR.PATCH. MAJOR = breaking changes, MINOR = nová funkcionalita zpětně kompatibilní, PATCH = oprava chyby. Předběžné verze: pomlčka + identifikátor (1.2.0-rc). MAJOR 0 = počáteční vývoj. Feature Flag: přepínač za běhu, který řídí dostupnost funkčnosti — umožňuje zahrnout nehotové funkčnosti do release i je postupně zpřístupňovat (dle prostředí, uživatelů, procenta).
DEV (vývojové), TEST (automatické a manuální testy), UAT/PREPROD (akceptace zákazníkem, nejpodobnější produkci), PROD (produkce). Pravidla: jeden artefakt pro všechna prostředí, konfigurace specifická pro prostředí uložena mimo aplikaci, maximální izolace (MailHog pro emaily, mocky pro externí služby), žádné manuální zásahy na produkci, chráněné větve a proměnné.
Přínosy: menší režie (sdílení jádra OS), rychlejší start, lepší využití paměti a disku (sdílení vrstev), formát distribuce SW nese všechny závislostí, stejné chování ve všech prostředích.
Docker: Dockerfile definuje obraz po vrstvách (FROM, RUN, COPY, CMD…). Obrazy se ukládají v registrech (Docker Hub). Kontejner má efemerální zápisovou vrstvu — data ukládáme do svazků (volumes). Docker Compose slouží pro multi-container aplikace.
Primitiva: namespaces (izolace názvů), cgroups (limity CPU/RAM), SELinux/AppArmor (souborový přístup).
Artefakt = výstup úlohy (např. sestavený balíček), sdílí se mezi úlohami pipeline (jedna vytvoří, jiná nasadí). Lze stáhnout přes GUI. Sdílení mimo pipeline přes speciální repository. Cache = úložiště pro závislosti/knihovny stahované z internetu; řízena klíčem (per branch nebo per job); sestavení musí fungovat i bez cache.