Az első Go projektem: envcheck

Ez a poszt a werkstatt sorozat első része – kilenc Go projekt, mindegyik egy valódi rendszergazda problémára.

Az első Go projektem: envcheck

Botcsinálta rendszergazdaként napi szinten dolgozom .env fájlokkal. Minden compose stack, minden szerviz konfigurációja ezekben a kis szövegfájlokban lakik. És minden rendszergazda ismeri azt a pillanatot, amikor egy deploy után kiderül, hogy valaki elfelejtette kitölteni a DB_PASSWORD-öt, vagy a .env.example-ben már van egy REDIS_URL, de a szerveren lévő .env-ből kimaradt.

Az envcheck egy parancssori eszköz, ami automatikusan ellenőrzi a .env fájlokat. Összehasonlítja a .env.example-lel, megkeresi a duplikált kulcsokat, az üres értékeket és a szintaxis hibákat.

Ez volt az első Go projekt, amit nem tutorialból, hanem saját igényből írtam.

Miért Go?

A kérdés jogos – bash-ben is meg tudtam volna oldani. De a Go-nál három dolog győzött meg.

Az első: egyetlen bináris. go build után kapsz egy futtatható fájlt, amit átmásolsz a szerverre és kész. Nincs Python virtualenv, nincs Node modules mappa, nincs dependency. Ez egy rendszergazda álma.

A második: a hibakezelés kultúrája. Go-ban minden függvény visszaadhatja a hibát, és a nyelv arra kényszerít, hogy foglalkozz vele. Bash-ben egy elrontott $? ellenőrzés csendben továbbmegy – Go-ban nem.

A harmadik: olvashatóság. Hat hónap múlva is érteni fogom mit csinál a kód, mert a Go nem enged “okos” megoldásokat. Nincs mágia, nincs öröklődés, nincs dekorátor. Csak függvények, struct-ok és explicit logika.

Hogyan működik?

Az envcheck három dolgot csinál.

Először beolvassa a .env fájlt soronként. Minden sort kettévág a = jelnél – bal oldal a kulcs, jobb oldal az érték. A kommenteket (#) és üres sorokat átugorja. Ha egy sorban nincs = jel, az szintaxis hiba.

Másodszor ellenőrzi a konzisztenciát. Egy map[string]int szótárba jegyzi, melyik kulcsot melyik sorban látta először. Ha ugyanaz a kulcs újra előjön, az duplikátum. Ha az érték üres string, az figyelmeztetés.

Harmadszor összehasonlítja a .env.example-lel. Két szótárat épít – egyet a .env kulcsaiból, egyet az example-ből – és összenézi őket. Ami az example-ben van de a .env-ből hiányzik, az hiba. Ami a .env-ben van de az example-ben nincs, az figyelmeztetés.

Két fájl, két szótár, összevetés.

Ami meglepett

A Go bufio.Scanner pontosan úgy működik mint a bash while read -r line. A defer file.Close() pedig mint a trap "cleanup" EXIT. A párhuzamok a bash-sel végig segítettek – nem egy új világot tanultam, hanem egy rendezettebb nyelvet ugyanazokra a feladatokra.

A flag csomag is meglepően egyszerű. Három sor és van -f, -e, -q flag, automatikus --help kimenettel. Bash-ben egy getopts blokk ennél háromszor hosszabb.

A tesztelés volt a legnagyobb ugrás. Go-ban a teszteket a forráskód mellé rakod (main_test.go), és a go test automatikusan megtalálja és lefuttatja őket. Table-driven tesztek – egy tömb, benne az összes eset, egy ciklus ami végigmegy rajtuk. Nincs külön framework, nincs telepítés, nincs konfiguráció.

Mit tanultam belőle?

Technikailag: fájl I/O, string kezelés, map adatstruktúra, struct-ok, error handling, CLI flag-ek és Go tesztelés. Ezek mind az első projektben jöttek össze.

De a fontosabb tanulság az volt, hogy a legjobb tanulási projekt az, ami valódi problémát old meg. Nem egy todo app, nem egy számológép – hanem valami, amit holnap is fogok használni a munkámban.

Az envcheck azóta minden compose stack mappájában ott van a CI pipeline-ban. Push előtt lefut, és ha valami hibás, a deploy meg sem indul.

Hogyan próbáld ki?

git clone https://github.com/brtkcs/werkstatt-tools.git
cd werkstatt-tools/envcheck
go build -o envcheck
./envcheck

Vagy ha van Go a gépeden:

go run main.go

A -q flag-gel quiet módban fut – csak a hibákat írja ki, figyelmeztetéseket nem. CI-ben ez a hasznos.

A teljes forráskód és a többi eszköz a werkstatt-tools repóban.

Ez a bejegyzés egy sorozat nyitánya. Kilenc Go projekt, mindegyik egy valódi rendszergazda problémát old meg – a .env validálástól a hálózat scanneren át a compose stack kezelésig. A sorozat végére egy komplett, tesztelt, dokumentált eszköztár áll össze.