eloipuertas / ES2015A

VideoJoc Curs Enginyeria Software 2015
GNU General Public License v3.0
14 stars 7 forks source link

Travis - Builds per commit #109

Open gpascualg opened 8 years ago

gpascualg commented 8 years ago

Bones a tots,

Amb la intenció d'ajudar una mica en les integracions, hem cregut bona idea ajudar-nos del servei Travis CI. De forma totalment transparent a l'usuari (nosaltres) a cada commit que es puja a GitHub es fa, automàticament, un build del projecte per Windows, Linux i OSX.

Solament si tots 3 builds són satisfactoris, Travis dirà que el projecte passa la compilació. Això no afecta al commit en sí, aquest hi serà sí o sí a GitHub.

Limitiacions

  1. El build tarda aproximadament 5-20 minuts a generarse, estic en procés d'optimitzar-ho però, per ara, Unity per linux no acaba d'anar bé. Es basa en Unity per OSX de moment.
  2. Compili o no, el commit hi serà. No refieu de que Travis borrarà el commit si no està bé o quelcom per l'estil. És una eina per meres consultes, en tot cas s'ha de comprobar abans de fer el push de forma local en Unity.
  3. Solament comprova que compili, no pas que executi correctament. Teòricament parlant seria possible comprobar que executi correctament, però de moment és quelcom que està pendent. No descarto fer-ho en breus però se n'ha d'estudiar la viabiltiat. Això implica que Travis solament dirà si compila, i no si executa, i per tant no si "funciona" en el sentit estricte.

    Objectius

Principalment facilitar les integracions i que no s'allarguin més del compte. Si una branca/commit no compila a la deadline d'integració, es pot evitar introduir mils de problemes en la integració.

Això serà molt més útil un cop Travis sigui capaç de comprobar que l'execució sigui correcta.

Conclusió

Això està pendent de que @eloipuertas ho activi en el seu Travis. En principi un cop activat començarà a funcionar per cada commit, independentment de la branca.

Si no funcionés, feu un toc per aquí i ho reviso.

Qualsevol pregunta o suggerència serà benvinguda!

Acceptance Criteria

Estimated time effort: 4h

gpascualg commented 8 years ago

Bones noticies! Ja tenim Travis funcionant. Faig una explcicació de nou de com funciona i que avalua:

Travis es una eina per comprobar la continuous integration d'un projecte, és a dir que els nous canvis no trenquin el funcionament actual del projecte. Això ho fa de forma 100% automàtica i transparent a l'usuari quan aquest fa un commit.

Què avalua?

  1. Que el projecte compili satisfactòriament, és a dir, que el "Build" que faries des de l'editor funcioni sense problemes.
  2. Que el joc executi sense problemes: s'executa el joc durant 15 segons. Sense problemes vol dir que no hi hagi cap excepció. Es fa de dues formes diferents:

    i. Jugant com a MEN ii. Jugant com a ELVES

  3. S'executen tests unitaris. Per ara són els següents:

    i. Cap entitat pot acabar després dels 15 segons amb una coordenada Y negativa ii. El nombre d'entitats del player al final han de ser 2 (STRONHOLD + HERO)

Per ara el player no realitza cap acció, es manté inmòbil, pero la idea es simular clicks, arrossegaments, selecció i multiselecció en un punt no molt llunyà.

S'aniran afegint més tests unitaris, com ara proves de colisions, proves d'animators, proves de confidència de la IA, proves de gestió de recursos, proves d'estrés...

Quina finalitat té?

En primer lloc, no s'ha de confondre Travis amb una eina per mirar si el nostre codi/models funcionen o no. Això s'ha de fer abans de fer el commit, de forma local i quant més depurat millor.

Travis serveix per detectar errors que passin per alt durant aquest test en local i, sobretot, per comprobar que després d'una integració tot segueix funcionant com abans (ie. Test unitaris, execució).

A més ha d'ajudar a realitzar integracions més netes, es podrà saber amb un cop d'ull si una branca passa els tests de Travis i per tant si és integrable o no. Com també manté un històric de totes les compilacions anterior, facilita trobar bugs mirant quin és l'últim commit que passa els tests.

Limitacions actuals

A part de l'evident manca de tests, se n'haurien de fer més, ara mateix el temps de compilació i testeig dura uns 30 minuts (5 per descarregar i instalar Unity 5.1, 25 per compilar, 1 per testejar).

Que tardi 30 minuts és quelcom temporal i és degut a la gran quantitat de textures i materials i, sobretot, a que no es guardi d'un compilat a l'altre. Ho solucionaré en breus, fent servir un servidor a mode de cache pels arxius aquests de compilat.

Travis limita les compilacions concurrents en funció de la càrrega global que té en aquell moment. Per tant, si en el lapse de 30 mins que triga en compilar actualment algú fa un commit, aquest commit quedarà en una cua i s'executarà tan pont punt Travis consideri que pot.

Si feu un commit per error, o en feu un altre després, per favor aneu a Travis (link abaix) i canceleu la compilació del commit antic! Així evitem fer cues inacables de commits que realment no volem.

Com puc aplicar-ho a la meva branca?

Com puc visualtizar l'estat actual?

Com crear UnitTests

Realment és molt sencill, tot i que vull fer uns canvis i per això de moment ho deixo en blanc i ho explicaré més tard en un altre comentari.

Us animo a que us feu tests unitaris propis, així si mai hi ha una integració podreu saber si el vostre codi/model segueix fent el que hauria de fer ;)

gpascualg commented 8 years ago

Si algú vol evitar que un commit passi per Travis (a risc seu si després no se'n fa un altre per saber si compila o no) pot afegir [ci skip] en el missatge del commit.

Pot ser convenient en cas de saber que farem més d'un commit seguit i solament volem que es compili l'últim d'aquests.

gpascualg commented 8 years ago

Bueno, per ara està bastant estable i s'ha millorat força el temps de compilació, que ronda els 10-15 minuts. Encara es podria forçar més i fer-l'ho més ràpid, però això si de cas és algo que podem comentar el pròxim dimecres.

Ara són uns 8 minuts de descarregar Unity i les carpetes de cache (que es podria reduir a 3-5, però ja en un futur) i instalar Unity. Més 5-10 de compilar i executar.

Dit això, els UnitTest també han canviat un pel i ara és més fàcil fer-los, així que tot animant-vos a que feu els vostres propis tests unitaris, explico que s'ha de fer:

UnitTests

Per començar, tots els tests unitaris aniran en la carpeta Assets/Scripts/Utils/UnitTests. Podeu fer servir el TestEntityYCoord.cs com a exemple.

Bàsicament, un test unitaria és simplement una classe que hereda de la classe abstracte UnitTest i que es situa en el namespace Utils.UnitTests.

La classe, que pot tenir qualsevol nom, ha de sobrecarregar:

En cas de trobar un error o excepció, es pot cridar al mètode LogError per fer-l'ho constar. Aquest, permet passar dos paràmetres, titol i descripció de l'error, en aquest ordre.

Alternativament, també seria vàlid llençar una excepció, que seria automàticament recollida pel sistema de testeig.

I ja està, no cal fer res més. La classe ja es detectarà automàticament sense necessitat de la nostra interacció.

gpascualg commented 8 years ago

Me n'oblidava, el cache no s'actualitza sempre! Ara mateix està en el commit, aproximadament, 0dc2f7fc01747856edd2bae607e4deb8e8f10ead. Per tant, el temps de compilació es de uns 10-15 minuts en cas de que no es mofiqui cap asset (assets sense incloure scripts, referent a textures i materials principalment) respecte aquest commit.

Si entre aquest commit i el que compila Travis hi ha algun asset modificat, Unity l'ha de reimportar, incrementant pertant lleugerament (de 20ms a 40000ms) el temps per a cada modificat.

Bàsicament, el servidor que fa servir de caché és un meu propi, i actualitzar a cada commit el caché seria massa càrrega. Per tant, solament s'actualitza quan el commit es fa específic a la branca devel-travis_cache. Si algú creu que realment s'ha d'actualitzar el caché, per exemple perquè la compilació està un altre cop a l'ordre de 30+ minuts, que faci un merge de la seva branca a devel-travis_cache.

Ara bé, demano comprensió i que no s'abusi d'això, que sinó se'm colapsa i no puc accedir-hi. D'altra banda, tranquils que el bandwidth és ilimitat, tant de pujada com de baixada. De quan en quan aniré fent jo merges perquè s'actualitzi de totes formes ;)

I ara sí, això es tot crec :sweat_smile:

gpascualg commented 8 years ago

Canvis en UnitTests

De moment encara no està pujat, i ja que en breus farem la integració a master, amb la intenció de no trencar-ho tot a l'últim moment, faré el merge el dimecres passada la demo.

Canvis importants: Els tests poden correr en qualsevol fase del joc (menu principal, menu de races, pre-game, in-game, post-game, killing). Per tal de fer això s'ha de sobrecarregar la propietat RunAt.

S'afegeixen nous tests:

Les classes marcades amb * no són noves, solament canvia la fase

A més ara els tests es poden mantenir executats en el temps (no ho han de fer tot en un sol Run). La classe TestRightClickMoveUnit n'és un bon exemple.

La simulació de clicks es fa a través de la classe UserInput. Per evitar fer public mètodes que no ho haurien de ser, s'abusa de Reflection. Pels tests crec que és acceptable, però en general són males costums, perjudiquen la performance greument.

Això es tot!

gpascualg commented 8 years ago

Trec la referència del milestone, ja que Travis ja funciona, però no tanco la issue per futures referències a nous UnitTests.

gpascualg commented 8 years ago

Travis ara avisa quan un commit no compila mitjançant un comentari a la issue: https://github.com/eloipuertas/ES2015A/issues/193

A més anomena a qui a fet el commit (si té ben configurat el user.name quan fa el commit) i per tant rep un mail :+1:

hermetico commented 8 years ago

Perfecte! Es molt practic aixo!