Protože už nějaký čas vyvíjíte webové aplikace, určitě jste si všimli, že se pro vás celá řada věcí rutinně opakuje, i když by nemusela. Velmi často jde o technickou správu projektů, verzování souborů, automatická kontrola kódu, zpracování různých dat, nebo třeba deploy na server a bezpečnostní věci kolem toho.
Při konzultacích ve firmách velmi často narážím na problém, kdy se velmi podceňuje prevence. Důvod bývá často ten, vývojáři vnímají některé věci jako velmi náročné a že jim to přidá práci. Pravda je ale taková, že celý setup stačí většinou nastavit jen jednou a pak jen dlouhodobě těžit z výhod, které to přináší.
CI/CD je nástroj, který umí automatizovat rutinní úkoly, které mají podobný základ a stále se v projektech opakují. Nejčastější použití CI je pro běh automatických testů, kontrolu kódu, automatické deploye (nasazení aplikace na webový server), správa projektu, nebo třeba bezpečnostní audity.
CI si představte jako virtuálně operační systém, který vykonává předem dané příkazy do Terminálu, nebo spouští konkrétní programy. Výstupem CI je buď úspěch (success), nebo chyba (fail), která se zobrazí přímo v projektu, ale také odešle správcům, kteří na to mohou reagovat. Dobrým zvykem je spouštět CI úlohy v návaznosti na určitou událost (například commit do repositáře, přijatý merge request / pull request, vydání tagu / verze / releasu, nebo spouštění v časové smyčce cronem).
Základem CI je konfigurační soubor, ve kterém definujeme jeho chování a reakci na události. V případě GitHubu stačí vytvořit pomocný adresář .github/workflows
a uvnitř vytvořit libovolný soubor s příponou .yml
. GitHub ho bude s každým commitem analyzovat a podle potřeby spouštět.
Představme si, že chceme definovat nový konfigurační soubor s konkrétní úlohou. Protože jde o úlohu, kterou bude spouštět přímo GitHub nebo jiné prostředí na virtuálním počítači, tak musíme definovat základní věci ohledně prostředí, mezi to patří:
runner
), (může jich být mnoho a víc běžet paralelně)V případě úloh (job) pak dále definujeme:
Uvedený kontejner je už první příprava na kompletní dokerizaci projektu. Základní použití CI je relativně snadné a nemusíte Dockeru vůbec rozumět, stačí znalost příkazů v Terminálu.
V rámci konkrétních kroků v úloze musíme spustit jednotlivé příkazy, které sestaví instalaci právě nainstalovaného operačního systému. V případě jazyka PHP tedy bude důležité nainstalovat právě jazyk PHP (a specifikovat verzi), naklonovat repositář s projektem do runneru, instalace projektových závislostí (nejčastěji Composerem) a spuštění samotného testu.
Obecně v IT komunitě koluje pověra, že je Microsoft ten zlý korporát, který dělá nekvalitní věci. V případě GitHub Actions to ale není vůbec pravda, protože mají naprosto objektivně suveréně nejlepší CI platformu na světě.
Zásadní výhoda GitHub CI je jednoduchost a elegance zápisu. Pomocí několika málo řádků zvládnete sami i bez předchozích znalostí nakonfigurovat vlastní testovací prostředí a to automatizovaně spravovat. Zároveň jako obrovskou výhodu vnímám rychlost zpracování konkrétních úloh. Například test na codestyle (formátování kódu) a PhpStan (kontrola datových typů, logiky a obecné správnosti) zvládne GitHub Actions na běžném projektu vyhodnotit pod 50 sekund, zatímco například GitLab stejný test vyhodnocuje téměř 8 minut! Ostatní řešení typu Travis jsou relativně drahé a většina vývojářů užitek jejich speciálních funkcí stejně nedokáže ocenit.
GitHub obsahuje velkou databázi hotových akcí a balíčků, které můžete rovnou použít. Typicky jde o operační systémy, programovací jazyky, nebo knihovny od komunity.
Databázi akcí najdete přímo v Marketplace, například moje oblíbená akce je Odeslání SMS v případě selhání přes Twillio.
Velmi mnoho příkladů zveřejňuji v rámci vlastních repositářů kde můžete transparentně vidět, jakou konkrétní konfiguraci používám.
V únoru 2021 jsem například pro kontrolu codestyle v rámci projektu používal tuto konfiguraci:
name: Coding Styleon:push:branches:- masterpull_request:types: [ assigned, opened, synchronize, reopened ]schedule:- cron: '1 * * * *'jobs:nette_cc:name: Nette Code Checkerruns-on: ubuntu-lateststeps:- uses: actions/checkout@v2- uses: shivammathur/setup-php@v2with:php-version: 7.4coverage: none- run: composer create-project nette/code-checker temp/code-checker ^3 --no-progress- run: php temp/code-checker/code-checker --strict-types --no-progressnette_cs:name: Nette Coding Standardruns-on: ubuntu-lateststeps:- uses: actions/checkout@v2- uses: shivammathur/setup-php@v2with:php-version: 8.0coverage: none- run: composer create-project nette/coding-standard temp/coding-standard ^3 --no-progress --ignore-platform-reqs- run: php temp/coding-standard/ecs check src
Tento konfigurační soubor nainstaluje nejnovější Ubuntu (runs-on: ubuntu-latest
), naklonuje repositář s projektem (uses: actions/checkout@v2
), nainstaluje PHP (uses: shivammathur/setup-php@v2
) ve verzi 7.4 (php-version: 7.4
), nainstaluje balíček s code-checkerem a poté přes PHP spustí úlohu.
Ještě pár poznámek pro uživatele, kteří nemají tolik zkušeností:
0
(nula), tak to znamená úspěch a jakékoli jiné číslo neúspěch. Stejným způsobem fungují například shellové scriptyphp soubor.php
), který se spustí a může dělat cokoli, na co má práva (pracovat se soubory, komunikovat po internetu, vypisovat na obrazovku, ...)composer.json
uveďte do sekce require-dev
, aby se neinstalovali v konkrétním projektu jako povinná závislostGitHub na rozdíl od jiných hostingů pro repositáře podporuje tzv. GitHub Apps a automatizační roboty. Jde o velkou databázi připravených robotů, kteří umí automaticky (i bez CI) provádět automatické operace s vašimi projekty a když na něco narazí, tak například založí issue nebo pošlou pull request s opravou.
Já osobně používám a vám doporučuji:
Mnoho dalších aplikací najdete v Marketplace.
Použití automatizačních úloh v GitHubu jsem si mimořádně oblíbil.
Ve všech repositářích mám nastavené automatické kontroly, proto když pošlu libovolný commit (nebo kdokoli jiný z komunity), tak mám v reálném čase zpětnou vazbu, jestli nebyla porušena kvalita kódu (codestyle a PhpStan), bezpečnost a další.
Některé testy nechávám spouštět každou hodinu automaticky. Pokud by se například objevila bezpečnostní zranitelnost nebo CVE, tak o tom budu nejpozději za hodinu vědět, a to dokonce na úrovni konkrétních projektů a co přesně se stalo.
Časem jsem po testování různých konfigurací došel k názoru, že za ideální minimální setup považuji tyto závislosti do Composeru:
phpstan/phpstan
- kontrola správnosti a logiky kódutracy/tracy
- reporting a logování chyb na vysoké úrovniphpstan/phpstan-nette
- rozšíření PhpStanu a speciality v Nettespaze/phpstan-disallowed-calls
- geniální knihovna od Michala Špačka, která ošetřuje (ne)použití nebezpečných věcí v kódu (od zapomenutých dumpů proměnných, až po možnost spustit uživatelský string jako shellový příkaz)roave/security-advisories
- kontrola instalace nebezpečných verzí balíků (pokud se objeví bezpečností zranitelnost v konkrétním balíku nebo vyjde CVE, tento balík zabrání v instalaci poškozené verze)Ideální je mít u základního bezpečnostního setupu nastavené automatické spouštění aspoň každých 8 hodin a nechávat si posílat chyby na mail. Kdykoli totiž instalace projektu selže, nebo se objeví nová zranitelnost, chci o tom vědět co nejdřív a hned reagovat.
Nezapomeňte, že všechno funguje automaticky a tak máte vždy jistotu, že i když používáte komplikované procesy pro kontrolu bezpečnosti i dalších věcí, tak vás to nestojí žádné úsilí navíc a stačí jen dobře provedená úvodní konfigurace.
V prevenci a automatizaci je totiž obrovský potenciál!
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo online.
Napište mi, pokud si nevíte rady.
Lektor: Jan Barášek
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | cs