====== Szemantikus verziókezelés (Semantic Versioning) ======
===== Bevezetés =====
A modern informatikai rendszerekben – különösen mikroszolgáltatásos architektúrák, API-k és könyvtárak esetén – kiemelten fontos, hogy a különböző komponensek egymással kompatibilisek maradjanak.
A szemantikus verziókezelés (Semantic Versioning, röviden SemVer) egy olyan szabványos megközelítés, amely a verziószámokon keresztül információt hordoz a változások természetéről.
A SemVer célja:
* a függőségek kezelhetőségének javítása
* a kompatibilitási problémák csökkentése
* az integráció megkönnyítése
===== Alapelvek =====
A szemantikus verzió formátuma:
MAJOR.MINOR.PATCH
ahol:
^ Elem ^ Jelentés ^ Mikor növeljük? ^
| MAJOR | főverzió | inkompatibilis változás esetén |
| MINOR | alverzió | új, kompatibilis funkció esetén |
| PATCH | javítás | hibajavítás esetén |
A verziószám minden eleme nemnegatív egész szám, és növekvő sorrendben változik.
===== A verziószám mögötti logika =====
A SemVer egyik legfontosabb gondolata, hogy a verziószám kommunikációs eszköz a fejlesztők között.
Példa:
1.2.3 -> stabil API
1.2.4 -> ugyanaz az API, csak hibajavítás
1.3.0 -> új funkciók, de régi kód továbbra is működik
2.0.0 -> fő verzió váltás -> régi kód eltörhet
===== Verziónövelés döntési folyamata =====
A verzió növelése nem véletlenszerű, hanem szabályalapú döntés.
flowchart TD
A["Változás történt"] --> B{"Kompatibilis?"}
B -- "Nem" --> C["MAJOR növelése"]
B -- "Igen" --> D{"Új funkció?"}
D -- "Igen" --> E["MINOR növelése"]
D -- "Nem" --> F["PATCH növelése"]
===== A három verziószint részletesen =====
==== MAJOR verzió ====
A MAJOR verzió növelése azt jelenti, hogy a rendszerben olyan változás történt, amely nem kompatibilis visszafelé.
Példák:
* függvény paraméterlistájának megváltoztatása
* API endpoint törlése
* adatstruktúra módosítása
Ez a legkritikusabb változás, mert:
* a kliensek frissítés nélkül hibásan működhetnek
* integrációs hibák jelenhetnek meg
==== MINOR verzió ====
A MINOR verzió növelése új funkciók bevezetését jelenti, amelyek nem törik el a meglévő működést.
Példák:
* új API endpoint hozzáadása
* opcionális paraméter bevezetése
* új szolgáltatás modul
Fontos:
* a régi kliensek továbbra is működnek
* a PATCH érték ilyenkor nullázódik
==== PATCH verzió ====
A PATCH verzió növelése kizárólag hibajavításokra szolgál.
Példák:
* bug fix
* teljesítmény javítás
* dokumentáció pontosítása (ha nem érinti az API-t)
Ez a legbiztonságosabb frissítés típus.
===== Verziók életciklusa =====
==== 0.x.x – fejlesztési fázis ====
* nincs stabil API
* bármilyen változás történhet
* nem ajánlott éles rendszerben használni
==== 1.0.0 – stabil kiadás ====
Ez az a pont, ahol:
* az API stabilnak tekinthető
* a SemVer szabályokat kötelező betartani
===== Előkiadások és metaadatok =====
==== Előkiadás (pre-release) ====
1.0.0-alpha
1.0.0-beta.1
1.0.0-rc.1
Jelentés:
* még nem stabil verzió
* tesztelésre szolgál
* alacsonyabb prioritású, mint a végleges verzió
==== Build metaadat ====
1.0.0+build.123
Jellemzők:
* csak információ (pl. build szám)
* nem befolyásolja a verziók sorrendjét
===== Verziók összehasonlítása =====
A verziók sorrendje a következő logika szerint történik:
- MAJOR → MINOR → PATCH
- majd pre-release
Fontos:
* a build metaadat nem számít
* az előkiadás mindig "gyengébb", mint a normál verzió
===== Fontos szabályok =====
* Egy kiadott verzió nem módosítható
* Minden változtatás új verziót igényel
* Kötelező a publikus API definiálása
* A verziószámok növekedése monoton
===== Gyakorlati jelentőség az integrációban =====
A szemantikus verziókezelés különösen fontos az alábbi esetekben:
* mikroszolgáltatások közötti kommunikáció
* REST / GraphQL API-k használata
* külső könyvtárak integrációja
* CI/CD pipeline-ok
Előnyök:
* automatikus dependency frissítés biztonságosan
* kompatibilitási hibák csökkentése
* jobb verziókövethetőség
===== Példa verziók alakulására =====
1.2.3 → bugfix → 1.2.4 1.2.3 → új feature → 1.3.0 1.2.3 → breaking change → 2.0.0
===== Összefoglalás =====
A szemantikus verziókezelés egy egyszerű, de rendkívül hatékony módszer arra, hogy a szoftverek fejlődését strukturáltan és érthetően kövessük, miközben minimalizáljuk az integrációs kockázatokat és növeljük a rendszerek megbízhatóságát.