Ir al contenido

Validación estructural en CI

validateArchiModel es un gate de pipeline natural: ejecútalo en un hook de pre-commit o en un paso de CI y deja que el código de salida bloquee los merges.

scripts/validate-model.mts
import { readFile } from 'node:fs/promises';
import { parseArchiModel, validateArchiModel } from '@cda/archi-semantic-core';
import { extractArchiModelXml } from '@cda/archi-semantic-core/archive';
const filePath = process.argv[2];
if (!filePath) {
console.error('usage: node validate-model.mts <model.archimate>');
process.exit(2);
}
const bytes = await readFile(filePath);
const model = parseArchiModel(extractArchiModelXml(bytes));
const { valid, errors } = validateArchiModel(model);
for (const issue of errors) {
console.error(`[${issue.code}] ${issue.path}${issue.message}`);
}
if (!valid) {
console.error(`Model is not valid: ${errors.length} issue(s).`);
process.exit(1);
}
console.log(`Model OK: ${model.elements.length} elements, ` +
`${model.relationships.length} relationships, ${model.views.length} views.`);

Hook de pre-commit (p. ej. mediante lefthook, husky o un hook de git simple):

Ventana de terminal
node scripts/validate-model.mts "models/CoreModel.archimate"

Paso de CI (ejemplo con GitHub Actions):

- name: Validate architecture model
run: node scripts/validate-model.mts models/CoreModel.archimate

El archivo .archimate puede ser un archivo zip (consulta Trabajo con archivos .archimate); leer los bytes crudos y pasarlos por extractArchiModelXml cubre ambas formas antes de analizar. La importación del subpath /archive es correcta aquí — CI se ejecuta en Node.

Usa el código de salida para el gate y el informe para los humanos: cada ArchiValidationIssue ya lleva un localizador path dentro del modelo (p. ej. relationships[rel-3].sourceId) además de un code con el que puedes hacer coincidencias (broken-relationship-source, duplicate-id, …). Imprímelos todos — el pipeline puede fallar, pero el desarrollador debe saber exactamente qué corregir.