Saltar al contenido principal

Práctica 206. CI/CD en GitHub

Nesta práctica imos traballar dúas das etapas fundamentais no desenvolvemento de software: as probas e a distribución dunha aplicación.

Nos primeiros apartados centrarémonos en comprobar que o programa funciona correctamente empregando tests unitarios. Estes tests permítennos automatizar a verificación do comportamento do código, asegurándonos de que responde como debe ante diferentes situacións e entradas. Traballaremos cun módulo en JavaScript e executaremos os tests definidos para detectar posibles erros ou comportamentos inesperados.

Unha vez validado o funcionamento correcto do programa, nos últimos apartados imos preparar o código para ser empaquetado, é dicir, organizalo de xeito que poida ser descargado e executado noutros contornos.


Requisitos


Apartado 1

Realiza os seguintes pasos:

  • Crea un novo repositorio baleiro en GitHub chamado dapw-206. Realiza unha captura da interface web co repositorio en GitHub.
  • Clona o repositorio no teu equipo.

Apartado 2

Dentro do repositorio crea o seguinte ficheiro dni-validator.js co seguinte contido:

dni-validator.js
function validarDNI(dni) {
return true;
}

export default validarDNI;

Crea tamén o ficheiro tests/dni-validator.test.js co seguinte contido:

tests/dni-validator.test.js
import validarDNI from '../dni-validator.js';

test("Comprobar DNIs válidos", () => {
expect(validarDNI("12345678Z")).toBe(true);
expect(validarDNI("00000000T")).toBe(true);
expect(validarDNI("98765432M")).toBe(true);
expect(validarDNI("99999999R")).toBe(true);
});

test("Comprobar DNIs no válidos", () => {
expect(validarDNI("12345678A")).toBe(false);
expect(validarDNI("1234567Z")).toBe(false);
expect(validarDNI("123456789Z")).toBe(false);
expect(validarDNI("ABCDEFGHZ")).toBe(false);
expect(validarDNI("12345678")).toBe(false);
expect(validarDNI("")).toBe(false);
});

Inicializa o proxecto:

npm init -y

Modifica a propiedade type do package.json polo seguinte valor (para empregar ES Modules):

"type": "module"

Instala os paquetes Jest e cross-env como paquetes de desenvolvemento:

npm install --save-dev jest cross-env

Modifica a seguinte liña package.json:

"scripts": {
"test": "cross-env NODE_ENV=test NODE_OPTIONS=--experimental-vm-modules jest --verbose"
}

Crea un .gitignore que exclúa do repositorio o directorio node_modules.

Fai un commit e un push.

Xa temos o noso repositorio con dous ficheiros JavaScript: un cunha función que valida o DNI (de momento sen implantar) e outro cos tests para comprobar o seu funcionamento.


Apartado 3

A continuación, imos ver como utilizando CI/CD podemos realizar os tests automaticamente en canto se suba unha nova versión a GitHub.

Realiza os seguintes pasos:

  • Crea un ficheiro ci-cd.yml no directorio correspondente que conterá un workflow para GitHub Actions. Este ficheiro deberá cumprir os seguintes requisitos:
    • O nome do workflow será Probas.
    • Os eventos que lanzan este workflow serán os push e pull requests á rama main.
    • O workflow terá un job chamado testing.
    • Este job correrá sobre ubuntu-latest.
    • Os pasos serán do job serán:
      • Descargar o código.
      • Instalar Node.js na súa versión 20.
      • Instalar as dependencias do proxecto Node.js.
      • Executar os tests.
  • Fai un commit e un push.

Apartado 4

Unha vez subida a nova versión xa debería lanzarse automaticamente o fluxo de traballo (workflow) en GitHub.

Realiza os seguintes pasos:

  • Abre o proxecto en GitHub.
  • Vai á lapela Actions. Realiza unha captura dos workflows lanzados.
  • Deberías ver que o estado é Failed. Preme nel e realiza unha captura do contido que se mostra.
  • Dentro do fluxo, selecciona o paso Executar tests para ver o erro. Realiza unha captura da execución.
  • É normal que os tests fallen, xa que a función non está implantada. Imos corrixilo. Modifica o ficheiro dni-validator con este contido:
    dni-validator.js
    function validarDNI(dni) {
    dni = dni.toUpperCase();
    const patron = /^\d{8}[A-Z]$/;

    if (!patron.test(dni)) return false;

    const letras = "TRWAGMYFPDXBNJZSQVHLCKE";
    const numero = parseInt(dni.slice(0, 8), 10);
    const letraCorrecta = letras[numero % 23];

    return dni.endsWith(letraCorrecta);
    }

    export default validarDNI;
  • Fai un commit e un push.

Apartado 5

Volta á lapela Actions.

  • Deberías ver que o novo fluxo se executa automaticamente.
  • Realiza unha captura do workflow en estado Passed.
  • Abre o fluxo e realiza unha captura da execución do paso Executar tests.

Agora a función pasa todos os tests correctamente.


Apartado 6

Neste momento, sabemos que a nosa función funciona correctamente porque pasa todas as probas. Poderíamos utilizala nun programa principal que reciba o DNI como argumento e indique se é válido.

Crea o ficheiro main.js co seguinte contido:

main.js
import validarDNI from './dni-validator.js';

function main() {
const args = process.argv.slice(2);
if (args.length !== 1) {
console.log("Uso: node main.js <o_teu_DNI>");
process.exit(1);
}

const dni = args[0];
if (validarDNI(dni)) {
console.log(`O DNI '${dni}' é válido.`);
} else {
console.log(`O DNI '${dni}' NON é válido.`);
}
}

main();

Executa o seguinte comando para comprobar que funciona:

node main.js 44556677A

Realiza unha captura da execución do comando.

Fai un commit e un push.


Apartado 7

Podemos agora automatizar o empaquetado do noso programa unha vez que pasa as probas. Para iso engadiremos un novo job no workflow.

Modifica o ficheiro ci-cd.yml engadindo un novo job chamado build que cumpra os seguintes requisitos:

  • Este job correrá sobre ubuntu-latest.
  • Necesitará que se comprete o job unitarias con éxito.
  • Os pasos serán do job serán:
    • Descargar o código.
    • Instalar a última versión de Bun. Para iso, hai que usar oven-sh/setup-bun@v2.
    • Empaquetar o programa como un binario co comando bun build main.js --compile --outfile dni.
    • Gardar o binario como artefacto co nome dni-linux.

A continuación, realiza os seguintes pasos:

  • Fai un commit e un push.
  • Abre o proxecto en GitHub, vai á lapela Actions e comproba que o fluxo se executa con dous jobs: unitarias e build.
  • Realiza unha captura do estado Passed.
  • Abre o job build e realiza unha captura do seu contido.
  • Na parte dereita verás un apartado Artifacts. Preme en main-executable para descargalo.
  • No terminal (dunha distribución Debian/Ubuntu), vai ao directorio onde o descargaches e executa:
    ./main 44556677A
    Realiza unha captura da execución deste comando.