Skip to content
Sebastian Mihalache edited this page Jan 30, 2025 · 30 revisions

Scop

Scopul implementării unui pipeline de Continuous Integration (CI) și Continuous Deployment/Delivery (CD) este de a asigura:

  • Build automat și constant al proiectului (pe fiecare commit sau pull request)
  • Testare automată (testele unitare și eventual teste funcționale/integrare)
  • Deployment facil (după ce build-ul și testele au trecut cu succes)

Tehnologii folosite pentru CI/CD

  • Sistemul de versionare (Git): pentru gestionarea codului sursă
  • Platforma CI/CD: GitHub Actions
  • Masini de testare: Windows GitHub-Hosted Runners
  • Scripturi de build & test: MSBuild + MSTest din Visual Studio 2022

Etape

Avem un workflow GitHub Actions care rulează un pipeline de CI/CD pentru un proiectul nostru dezvoltat exclusiv pentru Windows. Workflow-ul gestioneaza procesul de build, testare și publicare a versiunilor. Principalele etape sunt:

  1. Configurarea jobului
  • Rulează pe Windows (windows-latest)
  • Utilizează o matrice pentru a compila atât în Debug, cât și în Release pentru platforma x64
  1. Obținerea codului sursă
  • Clonează repository-ul împreună cu toate submodulele.
  1. Setarea mediului de build
  • Adaugă MSBuild și VSTest în PATH
  • Instalează 7zip pentru manipularea arhivelor
  1. Generarea fișierelor de proiect
  • Rulează generate_project.bat pentru configurarea inițială
  1. Compilarea codului
  • Compileaza soluția folosind MSBuild, la care avem parametrii din matricea pentru Configuration și Platform
  1. Instalarea și configurarea Mesa (OpenGL software renderer)
  • Descarcă Mesa și extrage fișierele necesare pentru a putea simula aplicatiile care necesita un GPU pe procesor
  • Windows GitHub-Hosted Runners sunt masini care nu au placi video dedicate
  • Creează symlinks pentru librăriile OpenGL
  1. Rularea Unit-Tests
  • Rulează VSTest.console.exe pentru a executa testele unitare
  • Generează un raport .trx pentru fiecare configurație
  1. Publicarea rezultatelor testelor
  • Utilizează EnricoMi/publish-unit-test-result-action pentru a încărca rezultatele testelor pe GitHub
  1. Pregătirea artifactelor pentru release (doar pentru tag-urile Release)
  • Copiază fișierele .exe și .dll într-un folder destinat release-ului
  • Copiază resursele necesare (resources, shaders, maps, config)
  1. Gestionarea versiunilor
  • Extrage numele tag-ului din GitHub
  • Adaugă numele tag-ului la folderul rezultat
  1. Arhivarea și publicarea release-ului
  • Creează o arhiva .zip cu tot continutul
  • Încarcă arhiva pe GitHub Releases folosind softprops/action-gh-release

Descrierea Environment-urilor

În dezvoltarea acestui proiect, folosirea unor medii separate a ajutat la izolarea diferitelor etape de lucru și la minimizarea riscurilor când apar modificări majore.

1. Development (Dev)

  • Scop: Dezvoltare și testare locală/inițială a codului.

  • Caracteristici:

    • Codul este în stadiu incipient, cu funcționalități noi sau netestate suficient.
    • Build de tip Debug.
    • Logare extinsă pentru a diagnostica probleme (log-uri detaliate, mesaje de eroare, assert-uri etc.).
    • În Visual Studio 2022, se folosește configurația Debug și se poate rula direct din IDE.
    • Se lucrează pe ramuri de feature separate (branch-uri), iar la final se face un Pull Request către ramura principală (main).
    • Fiecare branch are un nume sugestiv și implementează un anumit feature sau un bug fix legat de modul de funcționare/logica al jocului
    • menu se ocupă de desenarea interfeței UI a jocului.
    • client-server-architecture se ocupă cu developarea unui sistem de conexiune între mai mulți jucători pentru a putea dezvolta mai multe moduri de joc de tip multiplyer.
    • gamemodes se ocupă cu depanarea funcționalităților developate pe branch-ul client-server-architecture
  • Configurări specifice:

    • Fișiere de tip config
    • config/game.json se ocupă de gestionarea conexiunilor dintre entități și texturi
    • config/input.json se ocupă de maparea tastelor într-un joc. Fiecare acțiune (deplasare, interacțiune, tragere, schimbarea armelor, pauză etc.) este asociată cu un cod de tastă specific.

2. Staging

  • Scop: Mediu intermediar pentru testare înainte de lansarea oficială.

  • Caracteristici:

    • Cod considerat relativ stabil, dar încă în faza de validare.
    • Build de tip Release.
    • Teste unitare.
    • Generare de hartă:
      • Folosim algoritmul Perlin Noise pe baza dimensiunilor hartei (width, height) pentru a genera harta într-un mod procedural. Astfel la fiecare rulare se generează o mapă nouă conţinând:
        • celule libere
        • pereţi
        • uşi
        • obstacole
        • shop
    • Configurarea logicii modurilor de joc
      • Crearea unui server si stabilirea arhitecturii modurilor de joc, în corespondenţă cu acesta.
        • Zombie Survival
        • Team Deathmatch

Configurari specifice

  • config/save.json

3. Production

  • Scop: Mediu final, pentru utilizatorii/jucătorii reali.

  • Caracteristici:

    • Build de tip Release.
    • Stabilitate maximă, testată în prealabil în staging.
    • În pipeline-ul CI/CD, avem un tag care este released pe ramura main.
  • Config specific:

    • La sectiunea de Releases este adaugat produsul final, impreuna cu toate dependențele, in varianta cea mai optimizata. Utilizatorul trebuie doar sa descarce arhiva windows-x64-vX.X.X.zip, unde este prezent executabilul jocului.
Clone this wiki locally