From 49f4ffc380a7aade5c8951c94dcc296002c3d219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Mon, 3 Nov 2025 18:41:29 +0100 Subject: [PATCH 01/30] Document system requirements for chess application Added system requirements and specifications for a two-player chess application, detailing functional, client-side, server-side, non-functional requirements, and components. --- Docs/kovspec.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 Docs/kovspec.md diff --git a/Docs/kovspec.md b/Docs/kovspec.md new file mode 100644 index 0000000..d7d7bc5 --- /dev/null +++ b/Docs/kovspec.md @@ -0,0 +1,101 @@ +## 4. Rendszer követelmények + +A rendszer célja egy kétjátékos sakkalkalmazás megvalósítása, amely alapvetően hálózati kapcsolat (LAN vagy internet) segítségével biztosítja a valós idejű játékot. A rendszer kliens–szerver architektúrán alapul, ahol az egyes komponensek jól elkülönülten, meghatározott feladatokat látnak el. + +### 4.1 Kötelező funkcionális követelmények + +A rendszernek az alábbi alapvető funkciókat mindenképpen biztosítania kell: +- Két játékos közötti sakkjátszma lebonyolítása, a hivatalos sakk szabályai alapján. +- A játékosok felváltva tehetnek lépéseket, a lépések érvényességét a kliens oldali logika ellenőrzi. +- A rendszer valós időben szinkronizálja a két kliens állapotát (mindkét fél ugyanazt a táblát látja). +- A játék vége (sakkmatt, patt, idő lejárta) automatikusan felismerésre kerül. +- A szerver egyidejűleg több játékot is képes kezelni (külön szobákban vagy sessionökben). +- A játékosok elindíthatnak új meccset, illetve befejezett játék után visszatérhetnek a főmenübe. +- A rendszer minden játékban egyedi azonosítót (Game ID) használ a játékállapot nyomon követéséhez. +- A kliens értesítéseket kap az ellenfél lépéseiről és a játék állapotváltozásairól. + +### 4.2 Kliens oldali követelmények + +A kliens felelős a játékos felhasználói élményéért, a grafikus megjelenítésért és a játéklogika helyi működéséért. + +A kliensnek tudnia kell: +- A sakk tábla és a figurák megjelenítése, lépések kezelése (egérkattintás vagy billentyűparancsok). +- Lépések érvényesítése és elküldése a szervernek. +- A szervertől érkező események (ellenfél lépése, állapotváltozás) feldolgozása és megjelenítése. +- Hibák és megszakadt kapcsolat kezelése (újracsatlakozási lehetőség). +- Saját IP vagy szerver cím megadása LAN esetén. +- Alapvető menürendszer (csatlakozás, szerverindítás, új játék, kilépés). +- A hálózati kommunikáció egységes formátumban történjen (pl. JSON alapú üzenetek). + +### 4.3 Szerver oldali követelmények + +A szerver feladata a kliensek közti kommunikáció kezelése, az állapotok szinkronizálása és a játék logikai integritásának megőrzése. + +A szervernek tudnia kell: +- Kapcsolatok fogadása és kezelése több kliens esetén is. +- Új játék (session) létrehozása és azonosító kiosztása. +- Üzenetek továbbítása a kliensek között (pl. lépés, visszajelzés, játék vége). +- A játékállapot naprakészen tartása és küldése mindkét félnek. +- Kapcsolat megszakadása esetén az érintett játék szüneteltetése vagy lezárása. +- Üzenetformátumok ellenőrzése és hibás adatok elutasítása. +- Kliensazonosítás és egyszerű hitelesítés (pl. játékosnév alapján). +- A kommunikáció biztonságos kezelése (üzenetduplikáció, szinkronizációs hibák elkerülése). + +### 4.4 A komponensek közti kommunikáció (szerződések) + +A rendszer komponensei egy meghatározott üzenetprotokollon keresztül kommunikálnak egymással. +A kommunikáció kétirányú, valós idejű, és az alábbi szerződések szerint zajlik: + +A kliens minden lépést csak akkor hajt végre a felhasználói felületen, ha a szervertől visszaigazolást kapott az érvényességéről. +A szerver az üzeneteket sorosítva, FIFO-elv szerint dolgozza fel, és broadcastolja a változásokat az adott játékhoz tartozó összes kliensnek. + +### 4.5 Nem funkcionális követelmények + +- Megbízhatóság: a rendszernek stabilan kell működnie hálózati késleltetés és csomagvesztés esetén is. +- Teljesítmény: a szerver legalább 10 párhuzamos játékot képes kezelni érezhető lassulás nélkül. +- Biztonság: a kliens csak a szerver által engedélyezett parancsokat hajthatja végre. +- Bővíthetőség: a rendszer felépítése moduláris legyen, hogy később könnyen kiterjeszthető legyen (pl. online matchmaking). +- Platformfüggetlenség: a kliens és a szerver futtatható legyen Windows, Linux és esetleg webes környezetben. +- Karbantarthatóság: kódmodulok (logika, hálózat, UI) elkülönítése, jól dokumentált interfészekkel. + +### 4.6 Minimális technikai elvárások + +- Programozási nyelv: Rust, C#, Python vagy más, hálózati alkalmazásokra alkalmas nyelv. +- Kommunikációs protokoll: TCP vagy WebSocket alapú kapcsolat. +- Adatcsere formátum: JSON. +- Grafikus felület: desktop GUI (pl. egérvezérlés, drag & drop lépés). +- Követelmény kliensoldalon: legalább 4 GB RAM, modern operációs rendszer. +- Követelmény szerveroldalon: 1 CPU mag, 512 MB RAM, állandó hálózati kapcsolat. + +## 5. Követelménylista + +### Szerver +| Név | Verzió | Leírás | +| --- | ------ | ------ | +| **WebSocket** | 1.0 | A szerver és a kliens között folyamatos kétirányú kommunikációt biztosít. A kapcsolat létrejötte után a szerver valós időben képes fogadni és továbbítani az eseményeket (pl. lépés végrehajtása, állapotfrissítés). Hiba esetén a kapcsolat automatikusan újraépül. | +| **Kapcsolatok csoportosítása** | 1.0 | A szerver figyeli az elérhető, szabad klienseket, majd két szabad kapcsolatot automatikusan összerendel egy meccsbe. A csoportosítás után a játékosok azonos „room”-ba kerülnek, és a szerver biztosítja az egymás közötti adatkommunikációt. | +| **Kommunikáció az engine-nel** | 1.0 | A szerver a játékosoktól érkező lépéseket és játékinformációkat továbbítja az engine-nek feldolgozásra. Az engine válasza után a szerver visszaküldi az eredményt a klienseknek (pl. érvényes lépés, matt, patt). A kommunikáció aszinkron módon zajlik, válaszidő-ellenőrzéssel. | +| **Kommunikáció a UI-al** | 1.0 | A szerver WebSocket-en keresztül adatokat továbbít a felhasználói felület és az engine között. A UI által kért műveletek (pl. új meccs létrehozása, állapotlekérés) feldolgozását a szerver közvetíti.| +### Engine +| Név | Verzió | Leírás | +| --- | ------ | ------ | +| **Bitboard** | 1.0 | A játék táblaállapotát bitműveletekkel reprezentálja a hatékonyság érdekében. Minden bábu típus és szín külön bitmask-on kerül tárolásra, lehetővé téve a gyors lekérdezéseket és lépésellenőrzéseket. | +| **Lépésgenerálás LUT** | 1.0 | Előre kiszámított lookup táblák segítségével gyorsítja a lépésgenerálást és szabályellenőrzést. Ez csökkenti a számítási időt, és optimalizálja az engine teljesítményét. | +| **Lépésgenerálás** | 1.0 | A különböző bábutípusok (gyalog, bástya, futó, stb.) lépési logikáját valósítja meg. A függvények ellenőrzik a lépés érvényességét, figyelembe véve az aktuális állást, sakkhelyzetet és speciális szabályokat (pl. sáncolás, en passant). | +| **Util függvények** | 1.0 | Segédfüggvények az engine belső működéséhez, például raycast műveletek, bitműveleti maszkok kezelése, valamint logikai ellenőrzések a lépések és ütések számításához. | + +### UI +| Név | Verzió | Leírás | +| --- | ------ | ------ | +| **Belépés** | 1.0 | A felhasználó a kezdőképernyőn keresztül adhatja meg a nevét lokális játékhoz, vagy hitelesítheti magát online játékmód esetén. Hibás adatok esetén a rendszer figyelmeztetést küld. | +| **Főmenü** | 1.0 | Az alkalmazás központi navigációs felülete, ahol a felhasználó meccset kereshet, új játékot indíthat lokálisan, vagy beállításokat módosíthat. A menü megjeleníti az aktuális státuszt (online/offline). | +| **Játék** | 1.0 | A játékfelület megjeleníti a táblát, bábukat, lépéseket, és az aktuális játékállást. Támogatja mind az online, mind a lokális módot. A felület kezeli az interakciókat (lépéskattintás, visszavonás, végeredmény kijelzés). | +| **Kommunikáció a szerverrel** | 1.0 | A kliens a szerveren keresztül kommunikál az engine-nel. A UI felel az üzenetek küldéséért (lépés, új játék, visszajelzés), valamint a szervertől kapott események vizuális megjelenítéséért. | + + +### GitHub Actions (CI/CD) +| Név | Leírás | +| --- | ------ | +| Folyamatos tesztelés | A projekt minden commit után automatikusan tesztelődik. A pipeline lefuttatja a teszteket, és értesítést küld hibás build esetén. | +| Folyamatos integráció | Az új funkciók beolvadásakor a rendszer automatikusan integrálja a változtatásokat, új buildet hoz létre, és frissíti a fejlesztői környezetet. | +| Tesztadatok | A tesztadatok legyenek elérhetőek egy táblázatban, dátummal ellátva. (Google Sheets) | -- 2.49.1 From 8818b12fa5d1e23e9656b86f0a1c38daa1ca1304 Mon Sep 17 00:00:00 2001 From: htom Date: Mon, 3 Nov 2025 18:52:06 +0100 Subject: [PATCH 02/30] =?UTF-8?q?k=C3=B6vetelm=C3=A9ny=20lista=20hozz?= =?UTF-8?q?=C3=A1ad=C3=A1sa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/funk_spec.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Docs/funk_spec.md diff --git a/Docs/funk_spec.md b/Docs/funk_spec.md new file mode 100644 index 0000000..dcb6ec2 --- /dev/null +++ b/Docs/funk_spec.md @@ -0,0 +1,32 @@ +## 5. Követelménylista + +### Szerver +| Név | Verzió | Leírás | +| --- | ------ | ------ | +| **WebSocket** | 1.0 | A szerver és a kliens között folyamatos kétirányú kommunikációt biztosít. A kapcsolat létrejötte után a szerver valós időben képes fogadni és továbbítani az eseményeket (pl. lépés végrehajtása, állapotfrissítés). Hiba esetén a kapcsolat automatikusan újraépül. | +| **Kapcsolatok csoportosítása** | 1.0 | A szerver figyeli az elérhető, szabad klienseket, majd két szabad kapcsolatot automatikusan összerendel egy meccsbe. A csoportosítás után a játékosok azonos „room”-ba kerülnek, és a szerver biztosítja az egymás közötti adatkommunikációt. | +| **Kommunikáció az engine-nel** | 1.0 | A szerver a játékosoktól érkező lépéseket és játékinformációkat továbbítja az engine-nek feldolgozásra. Az engine válasza után a szerver visszaküldi az eredményt a klienseknek (pl. érvényes lépés, matt, patt). A kommunikáció aszinkron módon zajlik, válaszidő-ellenőrzéssel. | +| **Kommunikáció a UI-al** | 1.0 | A szerver WebSocket-en keresztül adatokat továbbít a felhasználói felület és az engine között. A UI által kért műveletek (pl. új meccs létrehozása, állapotlekérés) feldolgozását a szerver közvetíti.| +### Engine +| Név | Verzió | Leírás | +| --- | ------ | ------ | +| **Bitboard** | 1.0 | A játék táblaállapotát bitműveletekkel reprezentálja a hatékonyság érdekében. Minden bábu típus és szín külön bitmask-on kerül tárolásra, lehetővé téve a gyors lekérdezéseket és lépésellenőrzéseket. | +| **Lépésgenerálás LUT** | 1.0 | Előre kiszámított lookup táblák segítségével gyorsítja a lépésgenerálást és szabályellenőrzést. Ez csökkenti a számítási időt, és optimalizálja az engine teljesítményét. | +| **Lépésgenerálás** | 1.0 | A különböző bábutípusok (gyalog, bástya, futó, stb.) lépési logikáját valósítja meg. A függvények ellenőrzik a lépés érvényességét, figyelembe véve az aktuális állást, sakkhelyzetet és speciális szabályokat (pl. sáncolás, en passant). | +| **Util függvények** | 1.0 | Segédfüggvények az engine belső működéséhez, például raycast műveletek, bitműveleti maszkok kezelése, valamint logikai ellenőrzések a lépések és ütések számításához. | + +### UI +| Név | Verzió | Leírás | +| --- | ------ | ------ | +| **Belépés** | 1.0 | A felhasználó a kezdőképernyőn keresztül adhatja meg a nevét lokális játékhoz, vagy hitelesítheti magát online játékmód esetén. Hibás adatok esetén a rendszer figyelmeztetést küld. | +| **Főmenü** | 1.0 | Az alkalmazás központi navigációs felülete, ahol a felhasználó meccset kereshet, új játékot indíthat lokálisan, vagy beállításokat módosíthat. A menü megjeleníti az aktuális státuszt (online/offline). | +| **Játék** | 1.0 | A játékfelület megjeleníti a táblát, bábukat, lépéseket, és az aktuális játékállást. Támogatja mind az online, mind a lokális módot. A felület kezeli az interakciókat (lépéskattintás, visszavonás, végeredmény kijelzés). | +| **Kommunikáció a szerverrel** | 1.0 | A kliens a szerveren keresztül kommunikál az engine-nel. A UI felel az üzenetek küldéséért (lépés, új játék, visszajelzés), valamint a szervertől kapott események vizuális megjelenítéséért. | + + +### GitHub Actions (CI/CD) +| Név | Leírás | +| --- | ------ | +| Folyamatos tesztelés | A projekt minden commit után automatikusan tesztelődik. A pipeline lefuttatja a teszteket, és értesítést küld hibás build esetén. | +| Folyamatos integráció | Az új funkciók beolvadásakor a rendszer automatikusan integrálja a változtatásokat, új buildet hoz létre, és frissíti a fejlesztői környezetet. | +| Tesztadatok | A tesztadatok legyenek elérhetőek egy táblázatban, dátummal ellátva. (Google Sheets) | -- 2.49.1 From 1788cce42ddf75d00a0a16244d1a953a3d6d4770 Mon Sep 17 00:00:00 2001 From: Bence <76205860+kbence04@users.noreply.github.com> Date: Tue, 4 Nov 2025 12:01:25 +0100 Subject: [PATCH 03/30] =?UTF-8?q?K=C3=B6vspec=20=C3=A1ttekint=C3=A9s,=20v?= =?UTF-8?q?=C3=A1gy=C3=A1lom=20rendszer=20hozz=C3=A1ad=C3=A1sa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/kovspec.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Docs/kovspec.md b/Docs/kovspec.md index d7d7bc5..a90794f 100644 --- a/Docs/kovspec.md +++ b/Docs/kovspec.md @@ -1,3 +1,27 @@ +# Követelmény-specifikáció + +## 1. Áttekintés + +A jelen dokumentum célja, hogy bemutassa a CastlingCreations megrendelésére készülő Knightly nevű alkalmazás alapvető céljait, funkcionális és nem funkcionális követelményeinek áttekintését, valamint a fejlesztés kontextusát. + +A Knightly egy modern, digitális sakkalkalmazás, amely kezdetben helyi hálózaton (LAN) keresztül teszi lehetővé két játékos számára, hogy valós időben mérkőzzenek meg egymással. A rendszer egy grafikus felhasználói felületen keresztül biztosítja a játék indítását, a szerver futtatását és a másik félhez történő csatlakozást. + +A projekt hosszú távú célja, hogy a Knightly egy online platformmá fejlődjön, amely hasonló módon működik, mint a népszerű sakkportálok (pl. chess.com): a felhasználók fiókot hozhatnak létre, bejelentkezhetnek, és egy központi szerveren keresztül kereshetnek, illetve indíthatnak mérkőzéseket. + +A fejlesztés első szakasza azonban a LAN-alapú verzió megvalósítására koncentrál, amely a sakkjátszma logikai alapjainak, a játékállapot kezelésének és a hálózati kommunikáció modelljének megvalósítását célozza. A későbbi online verzió ezekre az alapokra építkezve bővíthető tovább. + +## 2. Vágyálom rendszer +A vágyálom rendszer célja egy teljes körű, modern online sakkplatform létrehozása, amely nemcsak a klasszikus sakkjáték digitális megvalósítását kínálja, hanem egy közösségi, versenyképes és kényelmes felhasználói élményt is biztosít. A hosszú távú cél, hogy a rendszer működése és felépítése a nagyobb nemzetközi sakkoldalakhoz (például a chess.com-hoz vagy a lichess.org-hoz) hasonló legyen, de saját, könnyen kezelhető és letisztult felülettel. + +A felhasználók a rendszerben saját profilt hozhatnak létre, amellyel be tudnak jelentkezni, és részt vehetnek online mérkőzéseken más játékosok ellen. A rendszer automatikusan párosítaná őket ellenfelekkel, de lehetőséget adna arra is, hogy barátokat hívjanak meg privát meccsekre. A lejátszott mérkőzések mentésre kerülnének, így a játékosok bármikor visszanézhetnék vagy elemezhetnék azokat. + +A játék mellett a felhasználók statisztikákat is láthatnának magukról, például nyerési arányt, aktuális értékszámot (rating), leggyakoribb megnyitásokat, illetve fejlődési tendenciát az idő során. A rendszer ezen felül egy egyszerű chat funkciót is tartalmazna, hogy a játékosok kommunikálhassanak egymással a játszmák közben vagy akár azokon kívül is. + +A vágyálom rendszer alapját egy központi szerver képezné, amely kezeli a felhasználói fiókokat, a bejelentkezéseket, a matchmaking folyamatot, valamint a játékok futását és szinkronizálását. A szerver a kliensalkalmazásokkal valós idejű adatkapcsolatot tartana fenn, így a játék során minden lépés azonnal megjelenne a másik játékosnál is. + +A platform célja a megbízható és folyamatos működés, akár nagyobb terhelés mellett is. A rendszer fejlesztése során kiemelt szempont lenne a biztonság (adatvédelem, csalás elleni védelem), a stabil hálózati kommunikáció, valamint a bővíthetőség – például ranglisták, versenyek vagy mobilalkalmazás későbbi integrálásának lehetősége. + +Összességében a vágyálom rendszer egy minden szempontból teljes értékű, közösségorientált sakkalkalmazás lenne, amely a mostani, helyi hálózaton működő változatból fejlődne tovább egy interneten keresztül bárhonnan elérhető platformmá. ## 4. Rendszer követelmények A rendszer célja egy kétjátékos sakkalkalmazás megvalósítása, amely alapvetően hálózati kapcsolat (LAN vagy internet) segítségével biztosítja a valós idejű játékot. A rendszer kliens–szerver architektúrán alapul, ahol az egyes komponensek jól elkülönülten, meghatározott feladatokat látnak el. -- 2.49.1 From d819368962ff0007b021d328cdb4de81296f74f9 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 12:36:30 +0100 Subject: [PATCH 04/30] Expand GitHub workflow documentation Detailed the GitHub workflow process for automated testing and releases, including branch naming conventions and test result logging. --- Docs/funk_spec.md | 19 +++++++++++++++++++ Docs/placeholder.md | 0 2 files changed, 19 insertions(+) delete mode 100644 Docs/placeholder.md diff --git a/Docs/funk_spec.md b/Docs/funk_spec.md index dcb6ec2..ac59ed9 100644 --- a/Docs/funk_spec.md +++ b/Docs/funk_spec.md @@ -30,3 +30,22 @@ | Folyamatos tesztelés | A projekt minden commit után automatikusan tesztelődik. A pipeline lefuttatja a teszteket, és értesítést küld hibás build esetén. | | Folyamatos integráció | Az új funkciók beolvadásakor a rendszer automatikusan integrálja a változtatásokat, új buildet hoz létre, és frissíti a fejlesztői környezetet. | | Tesztadatok | A tesztadatok legyenek elérhetőek egy táblázatban, dátummal ellátva. (Google Sheets) | + +## A github workflow folyamata: + +A githubon tárolt kód minden feltöltésnél a kód mindig automatikus tesztelve van, egy workflow által. Ennek a működése: +1. A brancheket a következő képpen kell elnevezni: Projekt/task_neve (a task neve a kanban tablabol jon). +2. 3 projekt van a github repository-ban: Engine, Server és a UI. Ennek megfelelően a következőképpen kell kinézniük a brancheknek: + - Engine/task_1 + - Server/task_1 + - UI/task_1 + Erre azért van szükség mert a github workflow ezek alapján az elnevezések alapján fogja eldönteni melyik teszteket futtassa. Ha az Engine projekthez lett feltöltve kód, akkor csak az ahhoz tartozó teszteket futtassa. +3. A workflow folyamat a következő: + Amikor feltöltődik a három projekt közül valamelyikére egy új commit. A github workflow megnézni mi a branch neve. Ezután letölti a projektet githubról, és lefuttatja azon projekt teszteit. A tesztek eredményét feltölti egy google táblazat fájlba, ahonnan bármikor visszenézhető. Minden teszt eredmény az annak megfelően elnevezett munkalapra kerül be (Engine, Server, UI), egymás alá táblázatos elrendezésben. Az oszlopok a következőek: Dátum, függvény neve, teszt bemenet, teszt kimenet, sikeres-e. + Amikor a main/master branchre kerül fel kód. A teszt az előbbiek alapján ugyanúgy lefut, csak itt mind a 3 projekt tesztje le fog futni és az eredmény egy main/master nevű munkalapra fog feltöltődni a táblázatban. Amint sikeresen lefut a tesztelés, elindul egy automatikus build, ami le fogja build-elni a projekteket. Ezután létrehoz egy új Release-t githubon, ahol beállítja a verzió számot a rust projektben beállított verzió számra, majd feltölti oda a fájlokat amiket a build hozott létre, és kiteszi ezt a buildet. + + +A workflow 3 külön fáljba van bontva: +1. A dispatcher (dispatch.yml). Ez indítja el a workflow-t ami teszteli a kódot a megfelelő branchen, elindítja a release workflow-t ami feltölti a master branchről buildelt projekt fájlokat. +2. A teszter (tests.yml). Ez a workflow bele fog lépni a megfelelő projekt mappába és lefutattja a megírt teszteket, és feltölti az eredményt egy google spreadsheet-be. +3. A release (release.yml). Amint sikeresek a tesztek elindul ez a workflow és lefordítja a kódot majd feltölti github-ra egy új release-ként diff --git a/Docs/placeholder.md b/Docs/placeholder.md deleted file mode 100644 index e69de29..0000000 -- 2.49.1 From 7625eecbd968fa9341a2b9d80223b620184631ea Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 13:26:23 +0100 Subject: [PATCH 05/30] Workflow: Dispatch and Test runner workflow test #1 Testing the dispatcher and engine_test workflow for any bugs, the changes on these files always need to be uploaded to github to test if it is working correctly --- .github/workflows/dispatcher.yml | 65 +++++++++++++++++++++++++++++++ .github/workflows/engine_test.yml | 22 +++++++++++ .gitub/workflows/placeholder.txt | 0 3 files changed, 87 insertions(+) create mode 100644 .github/workflows/dispatcher.yml create mode 100644 .github/workflows/engine_test.yml delete mode 100644 .gitub/workflows/placeholder.txt diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml new file mode 100644 index 0000000..10e64fd --- /dev/null +++ b/.github/workflows/dispatcher.yml @@ -0,0 +1,65 @@ +name: Dispatcher + +on: + push: + branches: + - '**' # minden branchre lefut + +jobs: + detect-and-dispatch: + runs-on: self-hosted # (sajat rpi-on fusson) + + steps: + - name: Detect project from branch name + id: detect + run: | + BRANCH_NAME=${GITHUB_REF##*/} + echo "Branch name: $BRANCH_NAME" + + if [[ "$BRANCH_NAME" == Engine/* ]]; then + echo "project=Engine" >> $GITHUB_OUTPUT + elif [[ "$BRANCH_NAME" == Server/* ]]; then + echo "project=Server" >> $GITHUB_OUTPUT + elif [[ "$BRANCH_NAME" == UI/* ]]; then + echo "project=UI" >> $GITHUB_OUTPUT + else + echo "project=unknown" >> $GITHUB_OUTPUT + fi + + - name: Trigger Engine tests + if: steps.detect.outputs.project == 'Engine' + uses: peter-evans/workflow-dispatch@v2 + with: + workflow: "engine_test.yml" + ref: ${{ github.ref }} + + - name: Trigger Server tests + if: steps.detect.outputs.project == 'Server' + uses: peter-evans/workflow-dispatch@v2 + with: + workflow: "server_test.yml" + ref: ${{ github.ref }} + + - name: Trigger UI tests + if: steps.detect.outputs.project == 'UI' + uses: peter-evans/workflow-dispatch@v2 + with: + workflow: "ui_test.yml" + ref: ${{ github.ref }} + + - name: Trigger all tests (main/master) + if: github.ref_name == 'main' || github.ref_name == 'master' + uses: peter-evans/workflow-dispatch@v2 + with: + workflow: "engine_test.yml" + ref: ${{ github.ref }} + - uses: peter-evans/workflow-dispatch@v2 + if: github.ref_name == 'main' || github.ref_name == 'master' + with: + workflow: "server_test.yml" + ref: ${{ github.ref }} + - uses: peter-evans/workflow-dispatch@v2 + if: github.ref_name == 'main' || github.ref_name == 'master' + with: + workflow: "ui_test.yml" + ref: ${{ github.ref }} diff --git a/.github/workflows/engine_test.yml b/.github/workflows/engine_test.yml new file mode 100644 index 0000000..d9b5b6f --- /dev/null +++ b/.github/workflows/engine_test.yml @@ -0,0 +1,22 @@ +name: Engine Tests + +on: + workflow_dispatch: + +jobs: + engine-tests: + runs-on: self-hosted + + steps: + - uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions/setup-rust@v1 + with: + rust-version: stable + + - name: Run Engine tests + run: | + cd engine + ls + cargo test --verbose diff --git a/.gitub/workflows/placeholder.txt b/.gitub/workflows/placeholder.txt deleted file mode 100644 index e69de29..0000000 -- 2.49.1 From a19e0bf9220670d43cb08840818f2e8f8c130e59 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 13:30:58 +0100 Subject: [PATCH 06/30] Workflow: added missing repository checkout Repository checkout was missing from the dispatch workflow --- .github/workflows/dispatcher.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 10e64fd..61ccc0f 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -5,6 +5,9 @@ on: branches: - '**' # minden branchre lefut +permissions: + contents: write + jobs: detect-and-dispatch: runs-on: self-hosted # (sajat rpi-on fusson) @@ -26,6 +29,10 @@ jobs: echo "project=unknown" >> $GITHUB_OUTPUT fi + + - name: Checkout repository + uses: actions/checkout@v4 + - name: Trigger Engine tests if: steps.detect.outputs.project == 'Engine' uses: peter-evans/workflow-dispatch@v2 -- 2.49.1 From 300b3cde34400219f57c8375bc0ec12082de18eb Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 13:46:29 +0100 Subject: [PATCH 07/30] Workflow: Triggering the workflow a different way with gh script --- .github/workflows/dispatcher.yml | 127 ++++++++++++++++++------------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 61ccc0f..c5d91fe 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -3,70 +3,91 @@ name: Dispatcher on: push: branches: - - '**' # minden branchre lefut - -permissions: - contents: write + - '**' jobs: - detect-and-dispatch: - runs-on: self-hosted # (sajat rpi-on fusson) - + dispatch: + runs-on: self-hosted + outputs: + engine: ${{ steps.check.outputs.engine }} + server: ${{ steps.check.outputs.server }} + ui: ${{ steps.check.outputs.ui }} steps: - - name: Detect project from branch name - id: detect + - name: Determine which tests to run + id: check run: | - BRANCH_NAME=${GITHUB_REF##*/} - echo "Branch name: $BRANCH_NAME" + BRANCH="${{ github.ref_name }}" + echo "Branch: $BRANCH" - if [[ "$BRANCH_NAME" == Engine/* ]]; then - echo "project=Engine" >> $GITHUB_OUTPUT - elif [[ "$BRANCH_NAME" == Server/* ]]; then - echo "project=Server" >> $GITHUB_OUTPUT - elif [[ "$BRANCH_NAME" == UI/* ]]; then - echo "project=UI" >> $GITHUB_OUTPUT - else - echo "project=unknown" >> $GITHUB_OUTPUT + ENGINE=false + SERVER=false + UI=false + + if [[ "$BRANCH" == *"Engine"* ]]; then + ENGINE=true + fi + if [[ "$BRANCH" == *"Server"* ]]; then + SERVER=true + fi + if [[ "$BRANCH" == *"UI"* ]]; then + UI=true fi + # Run all on master + if [[ "$BRANCH" == "master" ]]; then + ENGINE=true + SERVER=true + UI=true + fi - - name: Checkout repository - uses: actions/checkout@v4 + echo "engine=$ENGINE" >> $GITHUB_OUTPUT + echo "server=$SERVER" >> $GITHUB_OUTPUT + echo "ui=$UI" >> $GITHUB_OUTPUT - - name: Trigger Engine tests - if: steps.detect.outputs.project == 'Engine' - uses: peter-evans/workflow-dispatch@v2 + - name: Trigger Engine Test + if: steps.check.outputs.engine == 'true' + uses: actions/github-script@v7 with: - workflow: "engine_test.yml" - ref: ${{ github.ref }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'engine_test.yml', + ref: '${{ github.ref }}', + inputs: { + triggered_by: 'dispatch.yml', + branch: '${{ github.ref_name }}' + } + }) - - name: Trigger Server tests - if: steps.detect.outputs.project == 'Server' - uses: peter-evans/workflow-dispatch@v2 + - name: Trigger Server Test + if: steps.check.outputs.server == 'true' + uses: actions/github-script@v7 with: - workflow: "server_test.yml" - ref: ${{ github.ref }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'server_test.yml', + ref: '${{ github.ref }}', + inputs: { + triggered_by: 'dispatch.yml', + branch: '${{ github.ref_name }}' + } + }) - - name: Trigger UI tests - if: steps.detect.outputs.project == 'UI' - uses: peter-evans/workflow-dispatch@v2 + - name: Trigger UI Test + if: steps.check.outputs.ui == 'true' + uses: actions/github-script@v7 with: - workflow: "ui_test.yml" - ref: ${{ github.ref }} - - - name: Trigger all tests (main/master) - if: github.ref_name == 'main' || github.ref_name == 'master' - uses: peter-evans/workflow-dispatch@v2 - with: - workflow: "engine_test.yml" - ref: ${{ github.ref }} - - uses: peter-evans/workflow-dispatch@v2 - if: github.ref_name == 'main' || github.ref_name == 'master' - with: - workflow: "server_test.yml" - ref: ${{ github.ref }} - - uses: peter-evans/workflow-dispatch@v2 - if: github.ref_name == 'main' || github.ref_name == 'master' - with: - workflow: "ui_test.yml" - ref: ${{ github.ref }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'ui_test.yml', + ref: '${{ github.ref }}', + inputs: { + triggered_by: 'dispatch.yml', + branch: '${{ github.ref_name }}' + } + }) -- 2.49.1 From 3df33093edd6a0a387a2a25fe7679af82712bc96 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 14:47:50 +0100 Subject: [PATCH 08/30] Workflow: Added the workflow files, changed ls to pwd in tests --- .github/workflows/engine_test.yml | 2 +- .github/workflows/server_test.yml | 22 ++++++++++++++++++++++ .github/workflows/ui_test.yml | 22 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/server_test.yml create mode 100644 .github/workflows/ui_test.yml diff --git a/.github/workflows/engine_test.yml b/.github/workflows/engine_test.yml index d9b5b6f..84d187d 100644 --- a/.github/workflows/engine_test.yml +++ b/.github/workflows/engine_test.yml @@ -18,5 +18,5 @@ jobs: - name: Run Engine tests run: | cd engine - ls + pwd cargo test --verbose diff --git a/.github/workflows/server_test.yml b/.github/workflows/server_test.yml new file mode 100644 index 0000000..6a5cfb6 --- /dev/null +++ b/.github/workflows/server_test.yml @@ -0,0 +1,22 @@ +name: Server Tests + +on: + workflow_dispatch: + +jobs: + server-tests: + runs-on: self-hosted + + steps: + - uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions/setup-rust@v1 + with: + rust-version: stable + + - name: Run Server tests + run: | + cd server + pwd + cargo test --verbose diff --git a/.github/workflows/ui_test.yml b/.github/workflows/ui_test.yml new file mode 100644 index 0000000..4c0bda1 --- /dev/null +++ b/.github/workflows/ui_test.yml @@ -0,0 +1,22 @@ +name: UI Tests + +on: + workflow_dispatch: + +jobs: + ui-tests: + runs-on: self-hosted + + steps: + - uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions/setup-rust@v1 + with: + rust-version: stable + + - name: Run UI tests + run: | + cd ui + pwd + cargo test --verbose -- 2.49.1 From 76a1c18b56fb4769159dfd5b62846107e9958aa6 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 14:58:08 +0100 Subject: [PATCH 09/30] Workflow: dispatching workflow with 'uses' --- .github/workflows/dispatcher.yml | 70 ++++++++++++-------------------- 1 file changed, 25 insertions(+), 45 deletions(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index c5d91fe..7111a69 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -44,50 +44,30 @@ jobs: echo "server=$SERVER" >> $GITHUB_OUTPUT echo "ui=$UI" >> $GITHUB_OUTPUT - - name: Trigger Engine Test - if: steps.check.outputs.engine == 'true' - uses: actions/github-script@v7 - with: - script: | - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'engine_test.yml', - ref: '${{ github.ref }}', - inputs: { - triggered_by: 'dispatch.yml', - branch: '${{ github.ref_name }}' - } - }) + engine: + needs: dispatch + if: needs.determine.outputs.engine == 'true' + uses: ./engine_test.yml + with: + branch: ${{ github.ref_name }} + secrets: inherit + + server: + needs: dispatch + if: needs.determine.outputs.server == 'true' + uses: ./server_test.yml + with: + branch: ${{ github.ref_name }} + secrets: inherit + + ui: + needs: dispatch + if: needs.determine.outputs.ui == 'true' + uses: ./ui_test.yml + with: + branch: ${{ github.ref_name }} + secrets: inherit + + - - name: Trigger Server Test - if: steps.check.outputs.server == 'true' - uses: actions/github-script@v7 - with: - script: | - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'server_test.yml', - ref: '${{ github.ref }}', - inputs: { - triggered_by: 'dispatch.yml', - branch: '${{ github.ref_name }}' - } - }) - - name: Trigger UI Test - if: steps.check.outputs.ui == 'true' - uses: actions/github-script@v7 - with: - script: | - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'ui_test.yml', - ref: '${{ github.ref }}', - inputs: { - triggered_by: 'dispatch.yml', - branch: '${{ github.ref_name }}' - } - }) -- 2.49.1 From 7ef9855016114f1fdc0de3ceec9dafbb49ae4764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Wed, 5 Nov 2025 15:00:42 +0100 Subject: [PATCH 10/30] Update workflow paths and conditions in dispatcher.yml --- .github/workflows/dispatcher.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 7111a69..636eb69 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -46,24 +46,24 @@ jobs: engine: needs: dispatch - if: needs.determine.outputs.engine == 'true' - uses: ./engine_test.yml + if: needs.dispatch.outputs.engine == 'true' + uses: ./.github/workflows/engine_test.yml with: branch: ${{ github.ref_name }} secrets: inherit server: needs: dispatch - if: needs.determine.outputs.server == 'true' - uses: ./server_test.yml + if: needs.dispatch.outputs.server == 'true' + uses: ./.github/workflows/server_test.yml with: branch: ${{ github.ref_name }} secrets: inherit ui: needs: dispatch - if: needs.determine.outputs.ui == 'true' - uses: ./ui_test.yml + if: needs.dispatch.outputs.ui == 'true' + uses: ./.github/workflows/ui_test.yml with: branch: ${{ github.ref_name }} secrets: inherit -- 2.49.1 From 39da1be9deb6b99256f24eb94bc430d1ca07f914 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 15:08:33 +0100 Subject: [PATCH 11/30] Workflow: added new triggers for running test workflows --- .github/workflows/engine_test.yml | 2 ++ .github/workflows/server_test.yml | 2 ++ .github/workflows/ui_test.yml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/.github/workflows/engine_test.yml b/.github/workflows/engine_test.yml index 84d187d..e88bc83 100644 --- a/.github/workflows/engine_test.yml +++ b/.github/workflows/engine_test.yml @@ -1,7 +1,9 @@ name: Engine Tests on: + pull_request: workflow_dispatch: + workflow_call: jobs: engine-tests: diff --git a/.github/workflows/server_test.yml b/.github/workflows/server_test.yml index 6a5cfb6..f4db291 100644 --- a/.github/workflows/server_test.yml +++ b/.github/workflows/server_test.yml @@ -1,7 +1,9 @@ name: Server Tests on: + pull_request: workflow_dispatch: + workflow_call: jobs: server-tests: diff --git a/.github/workflows/ui_test.yml b/.github/workflows/ui_test.yml index 4c0bda1..c65886d 100644 --- a/.github/workflows/ui_test.yml +++ b/.github/workflows/ui_test.yml @@ -1,7 +1,9 @@ name: UI Tests on: + pull_request: workflow_dispatch: + workflow_call: jobs: ui-tests: -- 2.49.1 From 785e40f53881576138ff53855c4f7441b0e38c36 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 15:24:35 +0100 Subject: [PATCH 12/30] Workflow: removed branch from tests call --- .github/workflows/dispatcher.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 636eb69..1555641 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -48,24 +48,18 @@ jobs: needs: dispatch if: needs.dispatch.outputs.engine == 'true' uses: ./.github/workflows/engine_test.yml - with: - branch: ${{ github.ref_name }} secrets: inherit server: needs: dispatch if: needs.dispatch.outputs.server == 'true' uses: ./.github/workflows/server_test.yml - with: - branch: ${{ github.ref_name }} secrets: inherit ui: needs: dispatch if: needs.dispatch.outputs.ui == 'true' uses: ./.github/workflows/ui_test.yml - with: - branch: ${{ github.ref_name }} secrets: inherit -- 2.49.1 From 86ceab10adb33f40492add1c06f0832161a03749 Mon Sep 17 00:00:00 2001 From: htom Date: Wed, 5 Nov 2025 15:27:47 +0100 Subject: [PATCH 13/30] Workflow: removed rust setup from the tests, as it is installed on device --- .github/workflows/engine_test.yml | 5 ----- .github/workflows/server_test.yml | 5 ----- .github/workflows/ui_test.yml | 5 ----- 3 files changed, 15 deletions(-) diff --git a/.github/workflows/engine_test.yml b/.github/workflows/engine_test.yml index e88bc83..8abc162 100644 --- a/.github/workflows/engine_test.yml +++ b/.github/workflows/engine_test.yml @@ -12,11 +12,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Rust - uses: actions/setup-rust@v1 - with: - rust-version: stable - - name: Run Engine tests run: | cd engine diff --git a/.github/workflows/server_test.yml b/.github/workflows/server_test.yml index f4db291..3c5f8ab 100644 --- a/.github/workflows/server_test.yml +++ b/.github/workflows/server_test.yml @@ -12,11 +12,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Rust - uses: actions/setup-rust@v1 - with: - rust-version: stable - - name: Run Server tests run: | cd server diff --git a/.github/workflows/ui_test.yml b/.github/workflows/ui_test.yml index c65886d..37ada00 100644 --- a/.github/workflows/ui_test.yml +++ b/.github/workflows/ui_test.yml @@ -12,11 +12,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Rust - uses: actions/setup-rust@v1 - with: - rust-version: stable - - name: Run UI tests run: | cd ui -- 2.49.1 From bc2eca7eac8d0aaf630ed128c7b7e436f3898ff3 Mon Sep 17 00:00:00 2001 From: htom Date: Fri, 7 Nov 2025 12:54:11 +0100 Subject: [PATCH 14/30] added new test.sh script The test.sh script will run the cargo test and save a formatted output from each project and then append them to a final log file which will be the data to be uploaded to the spreadsheet --- .github/workflows/engine_test.yml | 4 +--- .github/workflows/server_test.yml | 4 +--- .github/workflows/test.sh | 37 +++++++++++++++++++++++++++++++ .github/workflows/ui_test.yml | 4 +--- 4 files changed, 40 insertions(+), 9 deletions(-) create mode 100755 .github/workflows/test.sh diff --git a/.github/workflows/engine_test.yml b/.github/workflows/engine_test.yml index 8abc162..4590631 100644 --- a/.github/workflows/engine_test.yml +++ b/.github/workflows/engine_test.yml @@ -14,6 +14,4 @@ jobs: - name: Run Engine tests run: | - cd engine - pwd - cargo test --verbose + bash .github/workflows/test.sh engine/ diff --git a/.github/workflows/server_test.yml b/.github/workflows/server_test.yml index 3c5f8ab..f39eae5 100644 --- a/.github/workflows/server_test.yml +++ b/.github/workflows/server_test.yml @@ -14,6 +14,4 @@ jobs: - name: Run Server tests run: | - cd server - pwd - cargo test --verbose + bash .github/workflows/test.sh server/ diff --git a/.github/workflows/test.sh b/.github/workflows/test.sh new file mode 100755 index 0000000..1191005 --- /dev/null +++ b/.github/workflows/test.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -e + +# --- ARGUMENT CHECK --- +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +# --- SETUP VARIABLES --- +PROJECT_PATH="$1" +PROJECT_NAME=$(basename "$PROJECT_PATH") +ROOT_DIR=$(git rev-parse --show-toplevel) + +LOG_FILE="${PROJECT_NAME}_test.log" +FINAL_LOG="${ROOT_DIR}/test_data.log" + +# --- MOVE TO PROJECT DIRECTORY --- +echo ">>> Running tests for project: $PROJECT_NAME" +cd "$PROJECT_PATH" || { echo "Error: Could not cd into $PROJECT_PATH"; exit 1; } + +# --- RUN TESTS --- +cargo test --verbose | tee full_test_output.log + +# --- EXTRACT TEST SECTION --- +# Create the log file with the project name as the first line +echo "$PROJECT_NAME" > "$LOG_FILE" + +# Then append only the lines between "running X test(s)" and the first empty line +awk '/^running [0-9]+ test[s]?$/,/^$/' full_test_output.log >> "$LOG_FILE" + +# --- APPEND TO GLOBAL LOG (in repo root) --- +cat "$LOG_FILE" >> "$FINAL_LOG" + +# --- SUMMARY --- +echo ">>> Test output extracted to $PROJECT_PATH/$LOG_FILE" +echo ">>> Appended to $FINAL_LOG" diff --git a/.github/workflows/ui_test.yml b/.github/workflows/ui_test.yml index 37ada00..114283a 100644 --- a/.github/workflows/ui_test.yml +++ b/.github/workflows/ui_test.yml @@ -14,6 +14,4 @@ jobs: - name: Run UI tests run: | - cd ui - pwd - cargo test --verbose + bash .github/workflows/test.sh ui/ -- 2.49.1 From c6c2e27d34cf8bba9156d4eb93f6b184a549e634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Fri, 7 Nov 2025 13:19:40 +0100 Subject: [PATCH 15/30] Add cleanup job to dispatcher workflow Add a cleanup job to the workflow for final cleanup. --- .github/workflows/dispatcher.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 1555641..7efbf6f 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -61,7 +61,18 @@ jobs: if: needs.dispatch.outputs.ui == 'true' uses: ./.github/workflows/ui_test.yml secrets: inherit - + + cleanup: + runs-on: self-hosted + needs: [engine, server, ui] + if: always() + steps: + - name: Final cleanup + run: | + echo "Final cleanup on self-hosted runner..." + cd "$GITHUB_WORKSPACE" + git clean -fdx + git reset --hard -- 2.49.1 From 596828e8271d7003431f954b0c177b228d843512 Mon Sep 17 00:00:00 2001 From: htom Date: Sun, 9 Nov 2025 12:29:46 +0100 Subject: [PATCH 16/30] Added release workflow, started work on the upload to spreadsheet --- .github/workflows/dispatcher.yml | 15 ++++- .github/workflows/release.yml | 97 +++++++++++++++++++++++++++++++ .github/workflows/upload_data.yml | 57 ++++++++++++++++++ 3 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/upload_data.yml diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 7efbf6f..efdf84d 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -62,9 +62,22 @@ jobs: uses: ./.github/workflows/ui_test.yml secrets: inherit + + #test-data-upload: + #needs: [engine, server, ui] + #if: always() + #uses: ./.github/workflows/upload_data.yml + #secrets: inherit + + release: + needs: test-data-upload + if: github.ref == 'refs/heads/master' + uses: ./.github/workflows/release.yml + secrets: inherit + cleanup: runs-on: self-hosted - needs: [engine, server, ui] + needs: [engine, server, ui, test-data-upload] if: always() steps: - name: Final cleanup diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..9fea580 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,97 @@ +name: Release build + +on: + pull_request: + workflow_dispatch: + workflow_call: + +permissions: + contents: write + +jobs: + release: + name: Build and release (master only) + runs-on: self-hosted + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build Engine for Linux + run: | + cd $(git rev-parse --show-toplevel) + pwd + mkdir release/linux -p + cd engine/ + rustup target add x86_64-unknown-linux-gnu + cargo build --release --target x86_64-unknown-linux-gnu + pwd + cp target/x86_64-unknown-linux-gnu/release/engine $(git rev-parse --show-toplevel)/release/linux/engine + + - name: Build Server for Linux + run: | + cd $(git rev-parse --show-toplevel) + pwd + mkdir release/linux -p + cd server/ + rustup target add x86_64-unknown-linux-gnu + cargo build --release --target x86_64-unknown-linux-gnu + pwd + cp target/x86_64-unknown-linux-gnu/release/server $(git rev-parse --show-toplevel)/release/linux/server + + - name: Build UI for Linux + run: | + cd $(git rev-parse --show-toplevel) + pwd + mkdir release/linux -p + cd ui/ + rustup target add x86_64-unknown-linux-gnu + cargo build --release --target x86_64-unknown-linux-gnu + pwd + cp target/x86_64-unknown-linux-gnu/release/ui $(git rev-parse --show-toplevel)/release/linux/ui + + + - name: Build Engine for Windows + run: | + cd $(git rev-parse --show-toplevel) + pwd + mkdir release/windows -p + cd engine/ + rustup target add x86_64-pc-windows-gnu + cargo build --release --target x86_64-pc-windows-gnu + pwd + cp target/x86_64-pc-windows-gnu/release/engine.exe $(git rev-parse --show-toplevel)/release/windows/engine.exe + + - name: Build Server for Windows + run: | + cd $(git rev-parse --show-toplevel) + pwd + mkdir release/windows -p + cd server/ + rustup target add x86_64-pc-windows-gnu + cargo build --release --target x86_64-pc-windows-gnu + pwd + cp target/x86_64-pc-windows-gnu/release/server.exe $(git rev-parse --show-toplevel)/release/windows/server.exe + + - name: Build UI for Windows + run: | + cd $(git rev-parse --show-toplevel) + pwd + mkdir release/windows -p + cd ui/ + rustup target add x86_64-pc-windows-gnu + cargo build --release --target x86_64-pc-windows-gnu + pwd + cp target/x86_64-pc-windows-gnu/release/ui.exe $(git rev-parse --show-toplevel)/release/windows/ui.exe + + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: "v${{ github.run_number }}" + name: "Release v${{ github.run_number }}" + files: | + release/* + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml new file mode 100644 index 0000000..f8768ef --- /dev/null +++ b/.github/workflows/upload_data.yml @@ -0,0 +1,57 @@ +name: Upload Test Results to Google Sheets + +on: + workflow_dispatch: + +jobs: + upload: + runs-on: self-hosted + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Python (for Google Sheets API) + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + pip install gspread google-auth + + - name: Upload test_data.log to Google Sheets + env: + GOOGLE_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_JSON }} + SPREADSHEET_ID: ${{ secrets.SPREADSHEET_ID }} + run: | + echo "$GOOGLE_SERVICE_ACCOUNT_JSON" > service_account.json + + python <<'PYCODE' + import gspread, json, time + + # credentials + creds = json.load(open("service_account.json")) + gc = gspread.service_account_from_dict(creds) + sh = gc.open_by_key("${{ secrets.SPREADSHEET_ID }}") + + with open("test_data.log", "r") as f: + lines = [line.strip() for line in f if line.strip()] + + project = lines[0].lower() + worksheet = sh.worksheet(project) + + # project name + data = lines[1:] + + #blank rows + existing_rows = len(worksheet.get_all_values()) + start_row = existing_rows + 3 + + # Split data into columns (by spaces) + rows_to_append = [row.split() for row in data] + + for i, row in enumerate(rows_to_append): + worksheet.insert_row(row, start_row + i) + + print(f"Uploaded {len(rows_to_append)} rows to '{project}' tab.") + PYCODE -- 2.49.1 From 92532839533f4c816fe202328ed58b42ca0ae174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:34:45 +0100 Subject: [PATCH 17/30] Workflow: re enabled test-data-upload with temp commands --- .github/workflows/dispatcher.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index efdf84d..1244d70 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -63,11 +63,15 @@ jobs: secrets: inherit - #test-data-upload: - #needs: [engine, server, ui] - #if: always() + test-data-upload: + needs: [engine, server, ui] + runs-on: self-hosted + if: always() #uses: ./.github/workflows/upload_data.yml - #secrets: inherit + steps: + - name: Temp turn off + run: | + echo "Uploading data to table" release: needs: test-data-upload -- 2.49.1 From 4763cbed95e132de14fff583dcbff5202e699df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:36:33 +0100 Subject: [PATCH 18/30] Update dispatcher.yml to include permissions Add permissions for write access to contents --- .github/workflows/dispatcher.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 1244d70..fad6701 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -5,6 +5,9 @@ on: branches: - '**' +permissions: + contents: write + jobs: dispatch: runs-on: self-hosted -- 2.49.1 From 1b4194ee7d8863b392c4838be508ebc3af480875 Mon Sep 17 00:00:00 2001 From: htom Date: Sun, 9 Nov 2025 12:44:33 +0100 Subject: [PATCH 19/30] Cleanup job depend on release, added missing .cargo folder to fix cc error on workflow build --- .github/workflows/dispatcher.yml | 2 +- engine/.cargo/config.toml | 4 ++++ server/.cargo/config.toml | 4 ++++ ui/.cargo/config.toml | 4 ++++ 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 engine/.cargo/config.toml create mode 100644 server/.cargo/config.toml create mode 100644 ui/.cargo/config.toml diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index fad6701..c776f7c 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -84,7 +84,7 @@ jobs: cleanup: runs-on: self-hosted - needs: [engine, server, ui, test-data-upload] + needs: [engine, server, ui, test-data-upload, release] if: always() steps: - name: Final cleanup diff --git a/engine/.cargo/config.toml b/engine/.cargo/config.toml new file mode 100644 index 0000000..fb748c5 --- /dev/null +++ b/engine/.cargo/config.toml @@ -0,0 +1,4 @@ +[target.x86_64-unknown-linux-gnu] +linker = "x86_64-linux-gnu-gcc" +[target.x86_64-pc-windows-gnu] +linker = "x86_64-w64-mingw32-gcc" diff --git a/server/.cargo/config.toml b/server/.cargo/config.toml new file mode 100644 index 0000000..fb748c5 --- /dev/null +++ b/server/.cargo/config.toml @@ -0,0 +1,4 @@ +[target.x86_64-unknown-linux-gnu] +linker = "x86_64-linux-gnu-gcc" +[target.x86_64-pc-windows-gnu] +linker = "x86_64-w64-mingw32-gcc" diff --git a/ui/.cargo/config.toml b/ui/.cargo/config.toml new file mode 100644 index 0000000..fb748c5 --- /dev/null +++ b/ui/.cargo/config.toml @@ -0,0 +1,4 @@ +[target.x86_64-unknown-linux-gnu] +linker = "x86_64-linux-gnu-gcc" +[target.x86_64-pc-windows-gnu] +linker = "x86_64-w64-mingw32-gcc" -- 2.49.1 From e41be61321d5e0ca86c43805b5637b10808e9132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:55:14 +0100 Subject: [PATCH 20/30] Modify release files to target linux and windows Update release workflow to include specific OS directories. --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9fea580..c932dd6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,8 @@ jobs: tag_name: "v${{ github.run_number }}" name: "Release v${{ github.run_number }}" files: | - release/* + release/linux/ + release/windows/ env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -- 2.49.1 From a6966e055db446769cd295006786b90a10fd757b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 13:05:23 +0100 Subject: [PATCH 21/30] Compress build folders for upload Added compression step for build folders before release. --- .github/workflows/release.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c932dd6..24e27a6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,16 +82,24 @@ jobs: cargo build --release --target x86_64-pc-windows-gnu pwd cp target/x86_64-pc-windows-gnu/release/ui.exe $(git rev-parse --show-toplevel)/release/windows/ui.exe - + + - name: Compress build folders for upload + run: | + cd $(git rev-parse --show-toplevel) + pwd + cd release/ + zip linux.zip linux/ + zip windows.zip windows/ - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: "v${{ github.run_number }}" name: "Release v${{ github.run_number }}" + generate_release_notes: true files: | - release/linux/ - release/windows/ + release/linux.zip + release/windows.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -- 2.49.1 From 3515703a9068d85bf7458f006a0b58393767e5be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 13:12:27 +0100 Subject: [PATCH 22/30] Modify zip commands in release workflow to include files in the folder with the wildcard Update zip commands to include all files in the directories. --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 24e27a6..b3044b9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -88,8 +88,8 @@ jobs: cd $(git rev-parse --show-toplevel) pwd cd release/ - zip linux.zip linux/ - zip windows.zip windows/ + zip linux.zip linux/* + zip windows.zip windows/* - name: Create GitHub Release uses: softprops/action-gh-release@v2 -- 2.49.1 From e19a5aac9a99860085f891cc20136883cdebe892 Mon Sep 17 00:00:00 2001 From: htom Date: Sun, 9 Nov 2025 14:23:13 +0100 Subject: [PATCH 23/30] Workflow: Re added test-upload job, added workflow_call trigger --- .github/workflows/dispatcher.yml | 8 +++----- .github/workflows/upload_data.yml | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index c776f7c..78d48f9 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -70,11 +70,9 @@ jobs: needs: [engine, server, ui] runs-on: self-hosted if: always() - #uses: ./.github/workflows/upload_data.yml - steps: - - name: Temp turn off - run: | - echo "Uploading data to table" + uses: ./.github/workflows/upload_data.yml + secrets: inherit + release: needs: test-data-upload diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index f8768ef..ef9b745 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -2,6 +2,7 @@ name: Upload Test Results to Google Sheets on: workflow_dispatch: + workflow_call: jobs: upload: -- 2.49.1 From 5443002c5f8224cd2a8995c7241c954116c63312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:26:28 +0100 Subject: [PATCH 24/30] Workflow: removed runs-on: self-hosted from test upload job --- .github/workflows/dispatcher.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/dispatcher.yml b/.github/workflows/dispatcher.yml index 78d48f9..fed6504 100644 --- a/.github/workflows/dispatcher.yml +++ b/.github/workflows/dispatcher.yml @@ -68,7 +68,6 @@ jobs: test-data-upload: needs: [engine, server, ui] - runs-on: self-hosted if: always() uses: ./.github/workflows/upload_data.yml secrets: inherit -- 2.49.1 From cf2edab29759f39de17d906230e603302840ad98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:31:18 +0100 Subject: [PATCH 25/30] Remove Python setup from upload_data workflow Removed Python setup step for Google Sheets API. --- .github/workflows/upload_data.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index ef9b745..982cea6 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -10,12 +10,7 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@v4 - - - name: Setup Python (for Google Sheets API) - uses: actions/setup-python@v5 - with: - python-version: '3.x' - + - name: Install dependencies run: | pip install gspread google-auth -- 2.49.1 From 8a01bba6440a5a65e0cababa91eff3edbb0d9300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:34:18 +0100 Subject: [PATCH 26/30] Update pip install command to break system packages --- .github/workflows/upload_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index 982cea6..6d9069c 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -13,7 +13,7 @@ jobs: - name: Install dependencies run: | - pip install gspread google-auth + pip install gspread google-auth --break-system-packages - name: Upload test_data.log to Google Sheets env: -- 2.49.1 From 1bf4d875afd2e0b8d2565da2efa1a3fa359a5580 Mon Sep 17 00:00:00 2001 From: htom Date: Sun, 9 Nov 2025 14:48:04 +0100 Subject: [PATCH 27/30] Workflow: added subprocess run to have the correct path for the test log file --- .github/workflows/upload_data.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index 6d9069c..3d6118b 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -23,14 +23,16 @@ jobs: echo "$GOOGLE_SERVICE_ACCOUNT_JSON" > service_account.json python <<'PYCODE' - import gspread, json, time + import gspread, json, time, subprocess # credentials creds = json.load(open("service_account.json")) gc = gspread.service_account_from_dict(creds) sh = gc.open_by_key("${{ secrets.SPREADSHEET_ID }}") + v = subprocess.run(['git rev-parse --show-toplevel'], capture_output=True).stdout.decode() + print(v) - with open("test_data.log", "r") as f: + with open(f"{v}/test_data.log", "r") as f: lines = [line.strip() for line in f if line.strip()] project = lines[0].lower() -- 2.49.1 From 7cd4bb6b09377537e100cc89663711496b635d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:55:23 +0100 Subject: [PATCH 28/30] Refactor subprocess call and print statement Updated subprocess command to use list format and modified print statement for clarity. --- .github/workflows/upload_data.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index 3d6118b..c46a507 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -29,8 +29,8 @@ jobs: creds = json.load(open("service_account.json")) gc = gspread.service_account_from_dict(creds) sh = gc.open_by_key("${{ secrets.SPREADSHEET_ID }}") - v = subprocess.run(['git rev-parse --show-toplevel'], capture_output=True).stdout.decode() - print(v) + v = subprocess.run(['git','rev-parse','--show-toplevel'], capture_output=True).stdout.strip() + print(f"{v}/test_data.log") with open(f"{v}/test_data.log", "r") as f: lines = [line.strip() for line in f if line.strip()] -- 2.49.1 From 2ac2f17d1ae47f8ed5b2b88e4a16ea0a2923e2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 15:01:42 +0100 Subject: [PATCH 29/30] Fix subprocess by adding decode to file path in upload_data.yml --- .github/workflows/upload_data.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index c46a507..7176f97 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -29,7 +29,7 @@ jobs: creds = json.load(open("service_account.json")) gc = gspread.service_account_from_dict(creds) sh = gc.open_by_key("${{ secrets.SPREADSHEET_ID }}") - v = subprocess.run(['git','rev-parse','--show-toplevel'], capture_output=True).stdout.strip() + v = subprocess.run(['git','rev-parse','--show-toplevel'], capture_output=True).stdout.decode().strip() print(f"{v}/test_data.log") with open(f"{v}/test_data.log", "r") as f: -- 2.49.1 From 85f7c6e690320689b2cefad7e0dfe4d3d8278bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= <75033623+htamas1210@users.noreply.github.com> Date: Sun, 9 Nov 2025 15:05:10 +0100 Subject: [PATCH 30/30] Remove checkout step from upload_data workflow Removed checkout step from upload job in workflow. --- .github/workflows/upload_data.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/upload_data.yml b/.github/workflows/upload_data.yml index 7176f97..6cfe426 100644 --- a/.github/workflows/upload_data.yml +++ b/.github/workflows/upload_data.yml @@ -7,10 +7,7 @@ on: jobs: upload: runs-on: self-hosted - steps: - - name: Checkout repo - uses: actions/checkout@v4 - + steps: - name: Install dependencies run: | pip install gspread google-auth --break-system-packages -- 2.49.1