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
- VirtualBox.
- Máquina virtual DAPW.
- Mozilla Firefox.
- Visual Studio Code.
- GitHub.
- Conexión a Internet.
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:
function validarDNI(dni) {
return true;
}
export default validarDNI;
Crea tamén o ficheiro tests/dni-validator.test.js co seguinte contido:
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.ymlno 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.
- O nome do workflow será
- Fai un
commite unpush.
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-validatorcon este contido:dni-validator.jsfunction 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
commite unpush.
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:
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
unitariascon é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
commite unpush. - Abre o proxecto en GitHub, vai á lapela Actions e comproba que o fluxo se executa con dous jobs:
unitariasebuild. - Realiza unha captura do estado
Passed. - Abre o job
builde realiza unha captura do seu contido. - Na parte dereita verás un apartado Artifacts. Preme en
main-executablepara descargalo. - No terminal (dunha distribución Debian/Ubuntu), vai ao directorio onde o descargaches e executa:
Realiza unha captura da execución deste comando.
./main 44556677A