ci: tests en las tres plataformas antes de desplegar, y una sola fuente para la version y para SHA-256 - #52
Merged
Merged
Conversation
`npm test` daba por hecho que habia un servidor escuchando en el 3000: en un clon limpio fallaba con errores de conexion que no explican nada, y en un runner de CI no hay tal servidor (por eso release.yml lo levantaba a mano antes de los tests). Ahora `test/helpers.mjs` arranca `server/index.js` en un puerto efimero y lo apaga al terminar. Ahi viven tambien el ayudante de WebSocket y `freePort`, que estaban copiados en tres ficheros. Cada fichero de tests sigue teniendo su propio servidor a proposito: las cuotas por IP son del proceso y el caso de fuerza bruta deja 127.0.0.1 limitado. `DROP_URL` se mantiene para apuntar a un servidor externo; en ese caso hay que darle un `DROP_ALLOWED_ORIGINS` que incluya el origen que prueba la suite, o pasarlo con `DROP_TEST_ORIGIN`. Cierra #23.
deploy.yml era el unico workflow que corria en un push a main y desplegaba sin ejecutar nada: el VPS hace `git reset --hard origin/main`, asi que un commit que rompiese el servidor de senializacion llegaba a produccion y solo se notaba al usarlo. Se anade ci.yml con `npm test` en Linux, macOS y Windows -- las tres plataformas donde se publica un binario, y las tres que se comportan distinto al abrir puertos y lanzar procesos --, y deploy.yml lo llama como workflow reutilizable y depende de el. En un push a main solo corre una vez: ci.yml se activa por su cuenta unicamente en las rutas que no despliegan nada (cli, test, scripts). El dominio del healthcheck sale ahora de la variable de repositorio DROP_PUBLIC_URL, no escrito en el script; si no esta, se comprueba por dentro del contenedor como hasta ahora. Cierra #22.
Estaba escrita a mano en dos sitios, `const VERSION` en cli/src/cli.js y el
package.json, y no es cosmetico: `drop update` compara la release de GitHub
contra esa constante, asi que una constante vieja deja al CLI creyendose
desactualizado para siempre -- reinstalando en bucle -- o sin enterarse nunca de
una version nueva.
Ahora sale del package.json: cli.js lo importa como JSON y esbuild mete el
fichero dentro del bundle al empaquetar, asi que el binario no lee nada en
marcha. Comprobado sobre el ejecutable ya inyectado, no solo desde el fuente.
test/version.test.mjs cae si vuelve a aparecer un literal, si `drop --version`
no coincide con el package.json o si los enlaces de descarga del README apuntan
a otra version -- lo que se quedaba atras al sacar una release con prisa. Las
menciones en prosa del README ("a partir de la v0.5.2") hablan de una version
concreta a proposito y no se tocan.
En release.yml queda solo la comprobacion del tag, y desaparece el paso que
levantaba un servidor a mano antes de los tests.
Cierra #26.
test/integrity.test.mjs copiaba las doscientas lineas de SHA-256 de public/app.js para poder probarlas. Validaba su copia: corregir un fallo en app.js habria dejado el test en verde contra el codigo viejo. La implementacion pasa a public/shared/sha256.js, junto al resto de lo que comparten navegador y tests, y los dos la importan. Sigue siendo propia porque hace falta hashear incrementalmente segun llegan los trozos, y `crypto.subtle.digest` es de un solo golpe. Verificado con una transferencia real por el navegador (el receptor comprueba el hash antes de dar el archivo por bueno). Cierra #25.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Las cuatro issues P2 que se sostienen entre ellas: la suite no podía correr en CI,
CI no existía, la versión vivía en dos sitios y el test de SHA-256 validaba una copia.
La suite arranca su propio servidor (#23)
npm testdaba por hecho un servidor escuchando en el 3000. En un clon limpio fallabacon errores de conexión que no explican nada, y en un runner no hay tal servidor: por eso
release.ymllo levantaba a mano con uncurlen bucle antes de los tests.test/helpers.mjslo arranca en un puerto efímero y lo apaga al acabar. Ahí viven tambiénel ayudante de WebSocket y
freePort, que estaban copiados en tres ficheros.Cada fichero de tests sigue teniendo el suyo a propósito: las cuotas por IP son del
proceso y el caso de fuerza bruta deja
127.0.0.1limitado durante un minuto.DROP_URLse mantiene para apuntar a un servidor externo.Tests antes de desplegar (#22)
deploy.ymlera el único workflow que corría en un push amain, y desplegaba sinejecutar nada. El VPS hace
git reset --hard origin/main, así que un commit que rompierael servidor de señalización llegaba a producción y solo se notaba al usarlo.
ci.yml:npm testen Linux, macOS y Windows. Las tres plataformas donde se publica unbinario, y las tres que se comportan distinto abriendo puertos y lanzando procesos.
deploy.ymllo llama como workflow reutilizable y depende de él.maincorre una sola vez:ci.ymlse activa por su cuenta únicamente enlas rutas que no despliegan nada (
cli/,test/,scripts/).DROP_PUBLIC_URL(yacreada). Sin ella se comprueba por dentro del contenedor, como hasta ahora.
La versión, en un solo sitio (#26)
Estaba a mano en
const VERSIONdecli/src/cli.jsy en elpackage.json. No escosmético:
drop updatecompara la release de GitHub contra esa constante, así que unaconstante vieja deja al CLI creyéndose desactualizado para siempre —reinstalando en
bucle— o sin enterarse nunca de una versión nueva.
Ahora sale del
package.json:cli.jslo importa como JSON y esbuild mete el ficherodentro del bundle al empaquetar, así que el binario no lee nada en marcha.
test/version.test.mjscae si vuelve a aparecer un literal, sidrop --versionnocoincide con el
package.json, o si los enlaces de descarga del README apuntan a otraversión —lo que se quedaba atrás al sacar una release con prisa—. Las menciones en prosa
("a partir de la v0.5.2") hablan de una versión concreta y no se tocan.
En
release.ymlqueda solo la comprobación del tag.Una sola implementación de SHA-256 (#25)
test/integrity.test.mjscopiaba las doscientas líneas depublic/app.js: validaba sucopia, no el original. Pasan a
public/shared/sha256.jsy las dos partes lo importan.Sigue siendo implementación propia porque hace falta hashear incrementalmente según llegan
los trozos, y
crypto.subtle.digestes de un solo golpe.Verificación
npm testen un árbol limpio, sin levantar nada: 104/104.npm run build:exey el ejecutable ya inyectado respondedrop v0.5.2— la inyección dela versión está probada sobre el binario real, no solo sobre el fuente.
throughput.bench.mjs, 8 MB): el receptorcomprueba el hash del archivo con el módulo compartido y lo da por bueno.
Closes #23, closes #22, closes #26, closes #25.