jueves, 6 de febrero de 2020

NodeJs en AppVeyor

Lo que parecía simple y directo al final es una odisea. Seguro que te suena...

Para poner en marcha un entorno de CI de NodeJs en AppVeyor hay que tener estas cosas en cuenta:


Actualizar la vesión de Node instalada en AppVeyor que es viejuna como ella sola. No entiendo porque no tienen actualizados los entornos a la última versión que tenga LTS; que para eso se hacen las versiones LTS señores...

environment:
  nodejs_version: "12"

Configurar toda la integración con los test (mocha en este caso) tiene su movida. Si sólo dejas "npm test" en configuración los test se ejecutan, pero simplememente salen por consola; aunque sí que detecta la salida del proceso "mocha" para fallar la build en caso de test fallidos.

test_script:
  # Output useful info for debugging.
  - node --version
  - npm --version
  # run tests
  - npm test

Para que los test se persistan y se muestren en la pestaña Test de AppVeyor hay que ejecutar un script (powershell en este caso) para que suba los test desde un fichero a través de la API rest de la plataforma:

ps: >-
    $wc = New-Object 'System.Net.WebClient'
 
    $wc.UploadFile("https://ci.appveyor.com/api/testresults/{testType}/$($env:APPVEYOR_JOB_ID)",
    (Resolve-Path .\testResultFile))

Así que tenemos que generar un fichero con mocha y además con un formato que acepte AppVeyor (testType). Escojo xunit por su naturaleza generalista y uso extendido.

"scripts": {
   "start": "node moonBot.js",
   "test": "mocha --reporter xunit > .\\xunit-results.xml"
 }

Y ya está montado... ni por asomo!! Resulta que el comando de redirección ( > ) oculta el output del proceso de test y la plataforma ya no detecta si los test han fallado, así que siempre pondrá el build en correcto.

Hay que utilizar la opción de comando de los reporter de mocha (--reporter-option) para montar el fichero de test:

"scripts": {
   "start": "node moonBot.js",
   "test": "mocha --reporter xunit --reporter-option output=.\\xunit-results.xml"
 }

Y ya sólo queda poner el script de subida en la sección after_test indicando el tipo de test y el nombre del fichero:

after_test:
ps: >-
    $wc = New-Object 'System.Net.WebClient'
 
    $wc.UploadFile("https://ci.appveyor.com/api/testresults/xunit/$($env:APPVEYOR_JOB_ID)",
    (Resolve-Path .\xunit-results.xml))

Y ya está montado... ni de cerca!! No funciona, no aparece nada en la pestaña test de la plataforma. Resulta que el formato de salida del reporter xUnit de mocha es jUnit!?!?!?! Le echas un vistazo al formato de xUnit  y no se parecen ni por casualidad. Así que toca cambiar el script de subida para indicar que estás subiendo jUnit:

ps: >-
    $wc = New-Object 'System.Net.WebClient'
 
    $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)",
    (Resolve-Path .\xunit-results.xml))


Y ahora sí que lo tenemos... ni de blás pedazo de necio!! Al parecer la sección "after_test" de la plataforma sólo se ejecuta cuando los test se han pasado correctamente... que ya le podrían haber puesto el nombre "after_test_passed" los muy mendrugos y así no hay interpretación errónea posible.

Así que hay que poner el script de subida de test en la sección "on_finish" que es la que se ejecuta tanto si ha fallado la build como si no:

on_finish:
ps: >-
    $wc = New-Object 'System.Net.WebClient'
 
    $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)",
    (Resolve-Path .\xunit-results.xml))

Arf! Ahora sí que funciona; de momento...

No hay comentarios:

Publicar un comentario