09 Commitování a sémantické verzování
09.01 SEMVER - sémantické verzování
Vyvíjí-li se produkt, který se průběžně mění, je potřeba nějakým způsobem komunikovat jeho verze. Standardem na tomto poli je sémantické verzování.
Tím se rozumí označování verzí produktu trojčlenným číslem, které umožňuje komunikovat nejen to, že se verze mění, ale i jak.
Anatomie semver čísla
major x.0.2:. To označuje hlavní verzi. Toto číslo se mění v případě, že se produkt změní některé ze svých API - tzn., že po upgrade nějaká dosavadní funkcionalita funguje jinak, nebo je vyřazena. Upgrade většinou vyžaduje dodatečnou kontrolu a úpravu napojeného kódu.
minor 1.x.2:. Toto číslo se mění v případě, když se do produktu přidají nové funkce, aniž by to ovšem narušilo dosavadní kód. Uživatelé tedy vědí, že si novou verzi mohou nainstalovat, aniž by se jim něco dosavadního rozbilo.
patch 1.0.x:. Toto číslo se mění zpravidla kvůli drobným opravám chyb. Uživatel tedy ví, že upgradovat by měl, ideálně co nejdříve.
Detailnější informace naleznete v dokumentaci SEMVER.
09.02 Commity a SEMVER
Určovat verzi zpětně a manuálně je složité a náchylné k chybám. Mnohem vhodnější způsob vydávání verzí je napárovat ho přímo na samotné změny. Při commitování, když známe charakter změny, můžeme do message vložit příznak (např. indikovat, že spravujeme chybu). Při release nové verze se pak provede analýza commitů a automaticky se odvodí správná verze.
Jak psát správně commit message i jak určit a vložit daný příznak je rozepsáno níže.
09.03 Seskupování commitů
Ještě než se dostaneme k samotným doporučením psaním commitu, je nutné zmínit, že každá související skupina změn by měla mít svůj vlastní commit.
Změny obsažené v jednom commitu by měly být vždy logicky svázané. Ideálně by commit měl obsahovat každou změnu, která se týká operace popsané v commit message (např. úprava hlavičky) a nic dalšího. Další, nesouvisející změny kódu by měly být ve svých vlastních commitech.
Toto rozdělení dramaticky pomáhá chápat vývoj codebase nejen samotným vývojářům, ale umožňuje i snazší implementaci, přenášení změn, pozdější automatické zpracování, např. pro verzování, apod.
09.04 Commit message
Při psaní commit zpráv na MUNI frameworku bychom měli dodržovat tyto konvence:
- typ změny
- Stručné a výstižné shrnutí dané změny
- doplnění kontextu
- jednotný jazyk a styl
1. Typ změny
Na začátku předmětu commit message (tzn. první řádek) uvedeme jednu z předdefinovaných možností, kterou indikujeme charakter změny. Na tomto příznaku závisí schopnost generovat verze a changelog.
Hlavní možnosti jsou tyto:
-
feat
Přidání či rozšíření funkce, nová komponenta nebo její stav atp.
Budou-li v seznamu nových commitů při releasu některý s tímto příznakem, verze se zvýší o minor
Změna bude zaznamenána v changelogu. -
fix
Oprava chyby.
Budou-li v seznamu nových commitů při releasu některé s tímto příznakem, verze se zvýší o patch
Změna bude zaznamenána v changelogu. -
refactor
Změny kódu, které nic neopravují ani nepřinášejí novou funkcionalitu.
Verzi zvyšuje o patch
Změna bude zaznamenána v changelogu. -
improvement
rozšíření/zlepšení dosavadní funkcionality.
Verzi zvyšuje o patch
Změna bude zaznamenána v changelogu. -
perf
Změny související především s optimalizací výkonu / nároků na výpočetní výkon.
Verzi zvyšuje o patch
Změna bude zaznamenána v changelogu. -
tpl
Změny v šablonách.
Verzi zvyšuje o patch
Změna bude zaznamenána v changelogu. -
ui
Změny vzhledu.
Verzi zvyšuje o patch
Změna bude zaznamenána v changelogu. -
style
Změny kódu, jež neovlivňují jeho funkci (odsazení, doplnění středníků, formátování atp.).
Verzi nemění -
content
Úpravy ilustračních textů, obrázků. Těch věcí, které má jinak na starosti CMS.
Verzi nemění -
docs
Úprava dokumentace a ničeho dalšího.
Verzi nemění -
test
Přidání/úprava testů.
Verzi nemění -
build
Úpravy hlavně ohledně buildu projektu, např. gulp, npm atp.
Verzi nemění -
config
Úpravy konfigurací, např. eslint, gitignore, atp.
Verzi nemění -
ci
Úpravy hlavně ohledně správy projektu, např. nastavení CI atp.
Verzi nemění -
chore
Ostatní úpravy, které nemění zdrojové nebo testovací soubory
Verzi nemění -
revert
Používá se při revertu předchozího commitu.
Verzi nemění
Změna bude zaznamenána v changelogu. -
major verze je potřeba změnit ve chvíli, kdy se mění API. Tato změna může nastat při různých úpravých (např. velké refaktorování, redesign). Indikování je v tomto případě trochu odlišné od ostatních případů. Je nutné uvést
BREAKING CHANGE
na začátek těla commitu (tělo commitu je nový řádek, typicky oddělený prázdným řádkem od předmětu). Předmět se píše stejně jako běžně, commit message zvyšující verzi o major by tedy mohla vypadat takto:refactor: unify compoentA and componentB, change input data BREAKING CHANGE here can be another explanation and reasoning
2. Stručné a výstižné shrnutí dané změny
Druhá nejpodstatnější věc je výstižný předmět. Ten už slouží ostatním lidem v týmu. Na cca 70 znacích bychom měli zaznačit, co daný commit provede. Př. Zvýraznění aktivní položky v postranním menu
3. Doplnění kontextu
Pokud je to vhodné, můžeme přidat tělo zprávy. Předmět odentrujeme, vložíme prázdný řádek a pak můžeme napsat klidně i pár odstavců, kterými vysvětlíme proč se změna provedla. Pokud v budoucnu někdo narazí na problém a bude potřebovat zjistit, proč je kód takový, může si v historii najít moment, kdy vznikl. Pokud v commitu je i tělo zprávy, může lehce pochopit, proč to tak je a jak přistoupit k další editaci.
4. jednotný jazyk a styl
Jelikož se předměty commitů později propíšou do changelogu (ty, které mění verze), je vhodné dodržovat jednotný styl zápisu. Především jazyk (zde čeština), malé/velké písmena, diakritika, atp.
09.05 Commitlint
Máme nastavený commitlint, který hlídá, zda je vyplněn typ změny. Nastavení je v souboru package.json
. Používáme vlastní nastavení, které se hodí pro práci s šablonami. Dovoluje použití pouze těch klíčových slov, která jsou zapsána výše. Další možnosti nastavení jsou popsány v dokumentaci commitlintu.