📘 BI-IDO – Úvod do DevOps

Státnicové poznámky · Bakalářské státní zkoušky · FIT ČVUT

BI-WI.21-8 BI-WI.21-9 BI-WI.21-10
Okruh BI-WI.21-8

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

DevOps = spojení slov Development (vývoj) a Operations (provoz). Jde o přístup k tvorbě SW produktů, který spojuje znalosti, role a lidi z vývoje a provozu s cílem minimalizovat rizika a maximalizovat automatizaci.

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í
🔑 Klíčový princip
Maximální možná automatizace všech kroků od vývoje přes testování po nasazení. K tomu je nutné využívat nástroje, které automatizaci usnadňují.

📝 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í
Rozdíl: Priorita vs. Severita

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

Nový (New) Přiřazený (Assigned) Vyřešený (Resolved) Uzavřený (Closed)

Z uzavřeného se může vrátit na Znovuotevřený (Reopened).

Způsoby vyřešení

StavVýznam
FixedChyba opravena / úkol dokončen
InvalidNejedná se o platný požadavek / chybu
Won't FixRozhodnuto neopravovat (záměr, nízká priorita)
DuplicateDuplicitní záznam — již evidováno jinde

🦊 GitLab Issue Management

V GitLabu se úkol nazývá Issue. Životní cyklus je zjednodušen na: openclosed.

  • 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ástrojPoznámka
GitLab IssuesIntegrovaný v GitLabu, jednoduché workflow, boardy
JIRAAtlassian, velmi rozšířený v enterprise, komplexní workflow
RedmineOpen-source, flexibilní
BugzillaMozilla, starší ale stále používaný
MantisOpen-source bug tracker
TracIntegruje 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žimPopisKdy 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 verze
  • develop — 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 do develop; pojmenování: feature-*
  • Release — příprava na uvolnění do produkce; vzniká z develop, slučuje se do develop i master; pojmenování: release-*
  • Hotfix — opravy kritických chyb v produkci; vzniká z master, slučuje se do master i develop; 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

Co je DevOps a jaké problémy řeší?

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í.

Jaké informace se evidují u úkolu/chyby a jaký je typický životní cyklus?

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.

Jaký je rozdíl mezi prioritou a severitou?

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.

Jaké jsou principy řešení spolupráce v SCM? Jaký je rozdíl mezi centralizovaným a distribuovaným systémem?

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ší.

Popište Git Flow, GitHub Flow a GitLab Flow — kdy který použít?

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í.

Jak funguje automatické zavírání issues v GitLabu?

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.

Okruh BI-WI.21-9

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 testuCo testujeCharakteristika
Unit testyNejmenší jednotku kódu (metodu, funkci)Rychlé, izolované, bez závislostí na externích systémech. Tvoří základ testovací pyramidy.
Integrační testySpolupráci více komponent/modulůOvěřují, že komponenty spolu fungují správně (např. aplikace + databáze). Pomalejší než unit testy.
Systémové testyCelý systém jako celekEnd-to-end testování, simulují reálné použití.
Akceptační testySplnění požadavků zákazníkaPrová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
Testovací pyramida

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
Grey Box

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)

  1. ARRANGE — příprava testovacích dat a prostředí (inicializace objektů, nastavení vstupů)
  2. ACT — provedení testované akce (volání metody)
  3. 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);
}
Proč automatizovat?
  • 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

Statická analýza = kontrola zdrojového kódu bez jeho spuštění. Je založena na detekci chybových vzorů a umožňuje odhalit problémy ještě před testováním.

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)

Code Review = manuální proces, při kterém jiný vývojář než autor prohlédne zdrojový kód. Umožňuje sdílet znalosti v týmu a zachytit problémy, které statická analýza neodhalí.

Princip procesu

  1. Autor vytvoří Merge Request / Pull Request
  2. Přiřadí se reviewer (posuzovatel)
  3. Reviewer přidává komentáře a návrhy na změny (suggestions)
  4. Autor zapracuje připomínky nebo vyřeší v diskuzi
  5. Po vyřešení všech připomínek se provede sloučení (merge)
Důležité detaily (GitLab)
  • 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
Pořadí kontrol kvality

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)

OWASP = Open Web Application Security Project. Udržuje seznam 10 nejzávažnějších bezpečnostních chyb ve webových aplikacích. Pořadí se mění, ale většina chyb se opakuje stále.
#NázevPopis a příklad
A01Broken Access ControlObejití kontroly přístupu úpravou URL (např. změna ID uživatele v URL → přístup k cizím datům).
A02Cryptographic FailuresData posílána nešifrovaně (HTTP, FTP), neověřování certifikátu, ukládání citlivých dat nešifrovaně.
A03InjectionNeoš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).
A04Insecure DesignSlabiny z návrhu, ne implementace — obnovení hesla přes otázky, chybějící ochrana proti robotům.
A05Security MisconfigurationPonechání výchozích hesel, povolení nepoužívaných služeb/portů, stack trace viditelný uživateli.
A06Vulnerable ComponentsPoužití knihoven se známými zranitelnostmi (nejsou aktualizovány).
A07Auth. FailuresHesla nehashovány, slabá hesla, Session ID v URL, neomezená platnost session.
A08SW & Data IntegrityNedůvěryhodné zdroje v CI/CD, nebezpečný kód z cizích repository, chybějící řízení přístupu k pipeline.
A09Logging & MonitoringAplikace neloguje přihlášení (platné i neplatné), logy nejsou sledovány na podezřelé aktivity.
A10SSRFServer-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

Jaké existují úrovně testů a jak tvoří testovací pyramidu?

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.

Jaký je rozdíl mezi Black Box a White Box testováním?

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).

Vysvětlete princip AAA a rozdíl mezi stub a mock.

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.

Co je statická analýza kódu a jaké problémy odhaluje SonarQube?

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.

Jak probíhá Code Review a proč je důležité?

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.

Vyjmenujte a popište alespoň 5 položek z OWASP TOP 10.
  • 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
Jak se řeší kontrola zranitelností v knihovnách? Co je package-lock.json?

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.

Okruh BI-WI.21-10

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í

CI (Continuous Integration) = integrace kódu od vývojářů do společného úložiště, zahrnuje automatické sestavení a testování.
CD má dva významy:
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ástrojJazykKonfiguraceKlíčové vlastnosti
MavenJavapom.xml (XML)Konvence nad konfigurací, životní cyklus (process-resources → compile → test → package), plugin:goal systém, repository mvnrepository.com
GradleJava, Kotlin, Groovybuild.gradle (Groovy/Kotlin)Novější, inspirovaný Mavenem, stejné repository, tasky místo fází
npmJavaScriptpackage.jsonSpráva závislostí, scripty pro sestavení, npmjs.com registry
MakeC/C++MakefileNejstarší, pravidla a závislosti
Maven – princip Convention over Configuration

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

Pipeline = sada automatických kroků prováděných v rámci CI/CD. Automaticky spustitelný „popis" celého procesu od nahrání kódu po nasazení.

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_NAME pro větev, $CI_JOB_NAME pro úlohu). Sestavení musí fungovat i bez cache!

GitLab CI – konfigurace

  • Uložena v souboru .gitlab-ci.yml v 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

Release = uvolnění nové verze produktu. Aplikace musí vždy obsahovat jednoznačnou identifikaci verze. Vždy musíme vědět, jaké zdrojové kódy byly použity → tvorba tagu v SCM.

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
DEVVývojové — lokální počítač vývojáře
TESTTestovací — automatické testy, manuální testování dodavatelem
UAT/PREPRODAkceptační — co nejpodobnější produkci, akceptační testy zákazníkem, školení
PRODProdukč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

TypPrincipPříklady
EmulaceEfekt každé instrukce simulován v SW (libovolná architektura, pomalé)QEMU, DosBox
Plná / HW akcelerovanáStejná architektura, privilegované instrukce přes hypervizorVirtualBox, VMware, KVM
ParavirtualizaceOS upraven, aby nepotřeboval privilegované instrukceXen
KontejnerizaceProstředí oddělena prostředky jádra jednoho OSDocker, 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

Vysvětlete pojmy CI, Continuous Delivery a Continuous Deployment.

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í.

Co je pipeline a jak je strukturována?

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.

Co řeší nástroje pro sestavení aplikace? Porovnejte Maven, Gradle a npm.

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.

Vysvětlete sémantické verzování a co je Feature Flag.

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).

Jaké typy prostředí existují a jaká jsou pravidla pro jejich správu?

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é.

Jaké jsou přínosy kontejnerizace oproti VM? Jak funguje Docker?

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).

Co je artefakt a cache v kontextu CI/CD pipeline?

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.