- A hozzászóláshoz be kell jelentkezni
- 1152 megtekintés
Hozzászólások
Ez nem programozás, csak egy példa a git hook használatára
- A hozzászóláshoz be kell jelentkezni
Nem, mert fejlesztői gépről minden esetben olyan [feature] branch-be commitolunk, ami törlésre kerül - CI-ben pedig transzparens a commit javitandó dolgai.
- A hozzászóláshoz be kell jelentkezni
Nem, mert a CI dolga ez.
- A hozzászóláshoz be kell jelentkezni
Lehet, de minek? A saját gépeden másodpercek alatt is lefutnak az ilyen hookok, cserébe a CI meg fókuszálhat az erőforrás igényesebb dolgokra. Mondhatnád, hogy "de hát a CI-ban ez ugyan annyi időt venne igénybe", de amikor van egy projected amin >1000 programozó dolgozik, akkor ezek a kis hookok nem csak sok erőforrást tudnak bezabálni, de sok időt is (executor lock).
Ez fölött szerintem minden programozótól elvárható, hogy valamilyen szinten tesztelje a saját kódját is mielőtt azt beküldené merge-re - ebből a szempontból ezen hookok futtatása tényleg az a minimális effort amit én minden fejlesztőtől elvárnék..
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
Lehet, de minek? A saját gépeden másodpercek alatt is lefutnak az ilyen hookok
Kérlek, csak a magad nevében beszélj. Van olyan servicenk, aminek a tesljes integrációs tesztje 10-20+ perc és egy 20 GB-s image is kell a teszthez.
Hadd döntsem már el én, hogy akarom-e futtatni a tesztet a helyi gépen vagy sem. CI-n amúgy is kell, anélkül nem mehet a merge, hogy ott ne futna le (meg nincs approve a PR-en, stb.). Viszont sok esetben nincs szükségem arra, hogy lefuttassa nekem a teljes integrációs tesztet, mert olyan helyre nyúlok hozzá, amit már az unit tesztek is kihoznak (pl. bugfix) vagy azért, mert egyébként is felhúzom a környezetet a fejlesztéshez, és akkor bazi zavaró lenne, ha egy commit hook még ott nekem elkezdené felhúzni majd a végén lezúzni a teszt környezethez tartozó docker imageket.
- A hozzászóláshoz be kell jelentkezni
A kérdés inkább az, pl a unittesztek lefutását megkövetelje-e a hook, nem az, hogy az integrációsakét is. Annak nyilván nem sok értelme van, hogy a teljes CI minden szara le kelljen fusson.
- A hozzászóláshoz be kell jelentkezni
A post-merge hookokat ne vedd ide.. A kérdés inkább azokra a hookokra vonatkozott amik még a commit pusholása előtt meghívódnak lokálisan (nálam ezekből van most kb 25 darab, 3 mp se kell, hogy lefussanak mielőtt a rebase/push megtörténik)
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
Értem én, de 3 mp alatt még a projekt sem fordul le sokszor :)
- A hozzászóláshoz be kell jelentkezni
És? Nem is kell neki.. Ebben a scope-ban csak static checkerek (tipikusan linterek) vannak, amik egy nyamvadt compiler-t sem hívnak.. Run-time checker oda valóban nem való, azt tényleg csinálja inkább a CI
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
Na jó, adok konkrét példákat:
Linters:
# Ezeknél a logika tipikusan az, hogy a hook megvizsgálja, hogy a commitban milyen típusú file-ok változtak, majd arra ráhívja a megfelelő linter(eket)
Ansible Lint (https://ansible-lint.readthedocs.io/en/latest/)
bandit (https://github.com/PyCQA/bandit)
flake8 (https://github.com/PyCQA/flake8)
Jenkinsfile lint (házi script, ami Jenkins Development Tools-ra épít: https://www.jenkins.io/doc/book/pipeline/development/ )
Hadolint (https://hadolint.github.io/hadolint/)
pylint (https://pylint.org/)
shellcheck (https://www.shellcheck.net/)
Buildifier (Bazel projectekhez: https://github.com/bazelbuild/buildtools/tree/master/buildifier )
gofmt (https://pkg.go.dev/cmd/gofmt)
yamllint (https://github.com/adrienverge/yamllint)
helm lint (https://github.com/helm/helm)
pmd (https://pmd.github.io/ - tipikusan java projectekhez használjuk)
Perlcritic (https://metacpan.org/dist/Perl-Critic/view/bin/perlcritic)
Robot linter (https://github.com/boakley/robotframework-lint)
További checkek, formatter-ek)
ClangFormat (https://clang.llvm.org/docs/ClangFormat.html)
jsonnetfmt (https://github.com/google/jsonnet)
Black (https://github.com/psf/black)
Binary check (lehetőleg bináris file-t ne merge-eljünk be)
Commit message check (van e Commit-ID a commit message-ben)
CRLF check (sorvége karakterek legyenek egységesek)
Whitespace checker (sor végén ne legyen whitespace, illetve tab/szóköz indentáció egységes legyen)
Python version checker (házi script, sokan nem tudták Python2-őt elengedni)
Restricted filenames checker (con/con ugyan vicces, de nem minden rendszer díjazza)
Symbolic link checker (symlink lehet, de git repo-n kívülre nem mutathat, mert az erős security risk)
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
Milyen projecten kell ennyi nyelv specifikus dolog
Jenkins - Ansible - Perl - Python ?
Vagy ez egy generikus, amint minden project-re használsz?
- A hozzászóláshoz be kell jelentkezni
Utóbbi..
Van több nagy monorepo, amikben több microservice-t is fejlesztünk (más-más nyelvekben: C++, Python, Go, Java), plusz a project specifikus infra automation is azokban lakik (IaaC - Jenkins, Ansible, belső scriptek (python, bash, perl)).
És míg a nagyobb projectek (monorepok) egymástól szeparáltan el tudnak lenni, a CI oldalt simán lehetett centralizálni, ezért is lett ennyi minden berángatva local hookokba is.
// Aminek egyik nagy előnye pont az volt, hogy amikor 1 project elkezd valami teljesen új dolgot (microservice) 0ról fejleszteni, akkor az esetleges új csapatnak megvan a lehetősége, hogy több nyelvből válogasson, és az azokhoz használható lintereket nyomban megkapja 0 befektetéssel
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
En a szemlelettel nem ertek egyet. Haromszor eltorik a branchen a CI es rajon, hogy jol felfogott sajat erdeke, hogy figyeljen a kodjara. Ettol fuggetlenul szive joga, hogy pre* hookokat allitson be, de nem jellemzo, inkabb az IDE-t pimpelik, hogy betegye a copyright headert, normalisan formazza a kodot stb. Ezernel joval tobb fejelsztorol beszelek.
- A hozzászóláshoz be kell jelentkezni
Ha már el tudta törni a CI-t (mondjuk egy LF / CRLF beállítás miatt), akkor az már régen rossz.. Inkább az szokott lenni, hogy a fejlesztők szidják a CI-t, mint a bokrot, amikor X idő után adja a commitjukra a -1-et, aztán meg nekik kell megérteniük, hogy melyik job, melyik outputját (file / console) kell néznie, hogy lássa mi nem tetszik a CI-nak..
Ez viszont mind idő.. Betolni a jobot az executor queue-ba, megvárni amíg felszabadul egy executor, lefuttatni, feedbacket adni, megvárni amíg a fejlesztő ezt észre is veszi, aztán amíg utánamegy a hibának, és amíg javítja..
Localban megfuttatot hook esetén a feedback viszont szinte azonnali, és a fejlesztő közben nem mással (kávézás?) baxa el az idejét..
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
Ilyen alap problémákra mint CRLF stb szerintem jobb egy .editorconfig, akkor ott van a kodban is az elvart formatting.
Ertem amit mondasz, ti ugy szerettek dolgozni (vagy erre neveltetedk a fejlesztoket), de ez nalunk marginalis problema.
CI reszhez: build executor mindig van, mert dinamikusan skalazodik es ephemeral a build kornyezet, hogy biztosan idempotens legyen.
- A hozzászóláshoz be kell jelentkezni
Az biztos, hogy a CI is csinálja (legalábbis normális helyen :) ), a kérdés nálunk az volt (végül le lett szavazva), hogy a hook is validálja már push előtt vagy sem.
- A hozzászóláshoz be kell jelentkezni
Nem teljesen.
Pre-commit kód formázást és code smell ellenőrzést csinál.
Nyilván a CI is megcsinálja ezt, de az már bukni fog, ha olyat talál, aminek nem lenne szabad bent lennie a kódbázisban
- A hozzászóláshoz be kell jelentkezni
ruby-hoz van egy overcommit nevű cucc, ami kiaknázza a git hook-okban rejlő lehetőséget, egy darabig node -os környezetben is ezt használtuk, aztán a javascript huszárok kieszközölték a husky -t. Summázva tehát: igen, használtom.
- A hozzászóláshoz be kell jelentkezni
LibreOffice: használjuk, kb. 25 dolgot ellenőriz. https://cgit.freedesktop.org/libreoffice/core/tree/.git-hooks
Szerintem jó, hogy nem CI-t terheljük ezekkel.
Egy másik hasznos funkció, hogy minden commit message-hez hozzáad egy ChangeId-t, amivel azonosítható a commit, amikor különböző release branch-ekbe kell portolni.
- A hozzászóláshoz be kell jelentkezni
A composer ki van hagyva ebbol, az IDE tudja azokat a (php cs fixer, phpmd), amik szuksegesek fejlesztesz kozben. A CI feladata az, hogy ezeket be is tartassa.
- A hozzászóláshoz be kell jelentkezni
Commit message ellenőrzésére, hogy pl. benne van-e a ticket number, teljesen ok. Minden másra ott van a CI, van pull request, van code review. A fejlesztői kultúra része kell legyen az (meg ideális esetben a builddé), hogy pull requestet már eleve úgy nyitunk, hogy a statikus kódelemző toolokat lefuttatuk előtte.
Egyébként meg mindenki azt rak be hooknak, amit akar, de ezeket standardizálni és előírni egy projekten, az baromság. Úgyse lehet betartatni.
- A hozzászóláshoz be kell jelentkezni
Kényszerítve vagyok-voltam a használatukra, de a pokol tüzére kéne vetni mindet.
- A hozzászóláshoz be kell jelentkezni
Kifejted?
- A hozzászóláshoz be kell jelentkezni
utamban van.
akadalyoz.
semmi haszna.
stb
- A hozzászóláshoz be kell jelentkezni
static analyzer-ek is haszontalanok?
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Ülj le és kuss legyen!"..
- A hozzászóláshoz be kell jelentkezni
azok leginkabb. juniornak adhat nemi tamaszt/tippet, masra nem jo. senior/expert szinten nem tud hozzaadni semmit a fejlesztonek (ha igen, az nem senior/expert szinten van), ellenben frankon akadalyoz, amikor okossagokkal bombaz.
nalunk is volt, egyhangu szavazassal kivagtuk a gitlab-ci.yaml -bol.
- A hozzászóláshoz be kell jelentkezni
A static analyzer jó ha realtimeban szinez dolgokat az IDE -ben, de engem is zavarna ha egy git hookban elkezdene dolgokat beakasztani.
Nem oda való szerintem ez a lépés.
- A hozzászóláshoz be kell jelentkezni
Akkor szarul van konfigurálva az analyzer. Én simán finomhangolom úgy, hogy amit gyakran elkövetek hibát figyelje, de ami tudom, hogy miért van, azt hagyja ki. Az első tíz futtatás agyzsibbasztó, de utána meg segít, hogy ha figyelmetlen voltam valahol, azért szóljon.
Tipikusan ilyeneket bökök el, hogy JSON-ban vessző, ERB template-ben if-else/do-end lezárások sorrendje, shellben régi berögződések... ezeknél nagyon hasznos. De igen, kell bele effortot tenni, hogy ne legyen útban, hanem hasznos legyen.
- A hozzászóláshoz be kell jelentkezni
Hoznál példákat is? Nem basztatás, tényleg szeretném megérteni, hogy miért nincs haszna, és hogyan akadályoz. Nem ott kéne legyen, ami történik, vagy meg se kéne történjen, ilyesmi.
- A hozzászóláshoz be kell jelentkezni
Nálunk git commit hook adja hozzá a gerrit change id-t.
// Hocus Pocus, grab the focus
winSetFocus(...)
http://c2.com/cgi/wiki?FunnyThingsSeenInSourceCodeAndDocumentation
- A hozzászóláshoz be kell jelentkezni
Frontend fejlesztőként eddig majdnem minden projekten használtuk az elmúlt pár évben, pl kódot előformáztuk, lokálisan lefuttattuk a lintert, illetve a céges copyright headert is beraktuk, de szerintem bőven használtuk ki a lehetőségeket.
---
hack the planet
- A hozzászóláshoz be kell jelentkezni
-
- A hozzászóláshoz be kell jelentkezni
A kérdés csak kliens oldali hook-okra vonatkozik vagy minden git hook-ra?
- A hozzászóláshoz be kell jelentkezni
Itt elsődlegesen a kliens oldali hookokra gondoltam.
- A hozzászóláshoz be kell jelentkezni
Szervezetileg van néhány. Mondjuk csak szól, hogy gond van és tudod ignorálni, ha kell (pl. trailing whitespace check-et ignorálni kell patchfileokon.). Az, hogy belenyúljon a kódba szvsz hülye ötlet.
- A hozzászóláshoz be kell jelentkezni
igen; sajat; node.js alapu projektekhez.
https://github.com/balazs4/dotfiles/blob/286961d2f70c4420679c123e5acdcf42aa1e8a3a/.hooks/pre-push
Ha egy feature branchen meg nem szamit a LINT, akkor
git push --no-verify
- A hozzászóláshoz be kell jelentkezni
pl configok vannak vezetve gitben. bizonyos időközönként pull (=fetch+merge) van, itt egy post-merge hook van beállítva, hogy reloadolja a megfelelő service-eket
4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.
- A hozzászóláshoz be kell jelentkezni
Mondjuk ez szerintem nem egy SCM feladata lenne, hanem a deployment toolé.
- A hozzászóláshoz be kell jelentkezni
Mindhárom. Repótól függ.
- A hozzászóláshoz be kell jelentkezni
Commit elott, kozben: forraskod lint check, project build (2.5s, TS microservice) es commit subject test. Husky.
Elsore zavart, 4 ora alatt megszoktam, azota tetszik. Ennyi idosen szeretek szabalykoveto lenni.
- A hozzászóláshoz be kell jelentkezni
Én elkezdtem használni a pre-commit nevű projektet, és rohadt jó. Sok mindent kijavít futásidőben, RuboCop/CookStyle checkek, szól ha valamit elböktem. Unit/Integ teszteket nem itt futtatnék, azért fejlesztünk branchen, de a statik analizáció teljesen jó.
- A hozzászóláshoz be kell jelentkezni