Git PUsh utáni deploy

Sziasztok

Olyan megoldást keresek - eddig nem igazán találtam - ami a saját GIT szerveremen lévő esemény/push után (Gitea - webhook-van)
valahogyan végre hajtaná a GIT PULL-t a szerveren és nem kellene SCP-vel feltöltenem a fájlokat vagy belépni és console-ban kiadni.

Próbáltam exec, shell_exec (előtte elmentettem a credentials-t) de nem működött, a "git status" lefutott.

Valami egy php fájlos megoldás lenne a jó - amit egyszer feltöltök/beállítok és utána csak meghívom a HOOK-al és - végzi a sync-et.

Bármi hasznos megoldás érdekel.

 

Köszi.

Hozzászólások

Jenkinst nézted? :) Pont ezekre van kitalálva és jól dokumentált, plusz ezt is tudod magad hostolni.

CI/CD az amit keresel. Szerveren a git pull-t, scp-t, ftp-t es hasonlo dolgokat felejtsd el. Egy letunt kor kulcsszavai.

Szerkesztve: 2021. 07. 21., sze – 16:37

Ha a git-et másik gépen hosztolod, és emiatt a hook-ot beállítani melós volna, akkor a szegény ember hook-ját is lehet használni: egyszerűen cron-ból futtatod mondjuk percenként a git pull parancsot az adott folderre és kész. Amikor nincs változás, akkor ez a művelet "szinte ingyen" van. Amikor meg kell, akkor az az egy perc az semmi. Én használok ilyet több helyen is többféle céllal, semmi baja. A git-et jelszó nélküli ssh kulcsosra kell beállítani, ezt meg tudod csinálni például githubon is, vagy saját git szerveren is nyilván.

Szerk1

Van Jenkins-es autobuild is beállítva, az is időzítő alapján nézegeti a git szervert, ott sincsen web hook beállítva.

De ha ragaszkodsz a hook-hoz, és a többiek tanácsaira sem tervezel hallgatni, miszerint Jenkins és egyebek legyenek használva, hanem sima szkriptet akarnál írni: a git hook az pont egy szkript, amit a "szerveren" (saját git szervert feltételezve pl gitosis vagy gitolite-tal megvalósítva), ahová pusholsz egyszerűen bele kell tenni a hooks folderbe, és le lesz futtatva. Ebben aztán meg kell oldani, hogy a git user tudjon szkriptet futtatni azon user nevében, akinél a PHP fut (pl egy user számára jelszó nélkül engedélyezett sudo update.sh, vagy hasonló, amibe meg beleírod, hogy su php, és azzal futtatod le a git pull-t). Tehát látható, hogy minden lépés egyszerű, de tökéletesre megcsinálni mégsem egyszerű, mert ugye egyik userről át kell menni a másikra.

Ha külön szerveren van, akkor olyat is lehet csinálni, hogy a hook-ba beírod, hogy wget https://myserver/jelszo/gitpull. A jelszó-szerű folderbe meg beteszed a gitpull.php-t, amiben lefuttatod a git pull-t. Ez már tényleg tákolás, és biztos sokan húznák rá a szájukat, de eseményvezérelt, egyszerű és működik.

Szerk2:

A fent leírtat tudja a github is, de ahogy látom csak vállalati előfizetéssel: https://docs.github.com/en/developers/webhooks-and-events/webhooks/abou…

Én még ilyet sosem csináltam, mert 1-5 perc közötti pollozás mindenre elég volt eddig nekem.

A gitea-n lehet hook-ot csinalni, amibe olyan parancsot raksz, ami jol esik.

Rossz felé indultál az úton, CI/CD a kulcsszó, például Jenkins tudja ezeket, de ha cserélsz Gitea-t Gitlab-ra, akkor abban is van komplett CI/CD, pipeline meg minden.

Én tudom, hogy CI/CD lenne a tökéletes megoldás, Bamboo-t használok céges szinten.

Sok WEB hosting-nál nincs SSH és a GIT sem biztos.
Cron általában van illetve php az alap. Ezért gondolkoztam valami egyfájlos php megoldáson.

A Gitea egy TrueNas szerveren fut otthon oda raktam fel mellé a Jenkins-t. Tegnap próbálgattam, de sem a HOOK-ot nem látja és az FTP-feltöltés is kihagy fájlokat.. de ez lehet #TooStupidUser probléma is. Még nézegetem majd.

Nos, ha nincs git, akkor a követekzőt tudod csinálni:
a Gitea-ból (megfelelő auth után persze), lehúzod a ZIP-et, ami a kódot tartalmazza, és felülírod vele az előző verziót.
De ez ugye nem fedi azt az esetet, hogy mi van, ha tröröltél egy file-t (a törlés ténye nem hajtódik végre), így én az alábbit csinálnám, ha tényleg egy PHP-s buta webhostingon kéne ezt megoldani:

  • verziózottan, mappánként tárolni az egyes kiadásokat
  • a legfrisebb mappára egy symlink mutat
  • amikor meghívódik a webhook, akkor:
  1. letöltöd a ZIP-et
  2. létrehozol egy új mappát és oda kicsomagolod
  3. a kicsomagolt mappára állítod a symlinket
  4. Ha kell tárhely, akkor a régi mappát törlöd

Nem olyan bonyolult ezt leprogramozni.

Ha a web szerveren nincsen SSH, akkor hogyan mennek rá a fájlok? (Nem ismerem a web hoszting szcénát, hallottam hogy régen a titkosítatlan FTP ment, de azt hittem mára ez már kikopott. Hogy nem törik rommá ezeket?)

Szerk: ezt visszaszívom, mivel pont a web szolgáltató oldal a buta, és pont a git szerver a sajátod, tehát pont a saját cuccodra kell az észt tenni. Ezt írtam előtte, ami hülyeség így utólag: (A hook-ot én elsőre elengedném és helyette időzített folyamatot csinálnék, ami kliens oldalon triggerelve folyton csekkolgatja, hogy van-e frissítés. Aztán ha úgy már megy, akkor esetleg megcsinálnám a hook-ot is. A git hook-nál a fájlt futtathatóvá tetted, ami a hook-ot futtatná? Ez volna az első ötletem, hogy miért nem fut le. Ha ez a saját szervereden fut, akkor tuti hogy meg lehet oldani a problémát, csak nagyon kell akarni és próbálgatni kell.)

 

Én elgondolkodnék ezen a ponton, hogy pure web hosztolás helyett mondjuk VPS-re költöztetnék mindent, és ott olyan git klienst telepíthetsz, amilyet csak akarsz. Aztán simán cron jobból indíthatod a git pull-t percenként, oszt kalap kabát.

A git hook (ami a git szerveren fut), meg a webhook (ami egy HTTP hívás egy másik szerverre) két tök külön dolog. Ő webhookot csinál, és ez teljesen járható út - mondjuk amikor a fő branchbe érkezik egy merge, akkor triggerelődik a webhook, ami elvégzi a frissítést.

Én így tákoltam össze, tudom hogy vannak erre kész toolok (CI/CD) meg minden, de nekem gyorsan kellett "ideiglenesen".
Cronból fut percenként

if git remote show origin |grep -q "local out of date";then
  echo "$(date) - Changed"
  git pull
fi

Persze ennek már több mint egy éve és azóta is így fut hiba nélkül :D

Kicsit ugyan elborult, de esetleg ilyesmi (nem használtam még): https://github.com/czproject/git-php? :)

Ahogy látom, git kliens ugyan kell neki, de ha a git status lefutott, akkor talán az van. Ezt ő proc_open-nel indítja, nyilván ha az le van tiltva, akkor nem lesz jó.