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.