Backend FastAPI de LaborIA con SQLAlchemy, Alembic, pruebas unitarias y gate de seguridad con Sentinel en CI.
- Python 3.11
- pip
- Docker (requerido para escaneo de imagen local en Sentinel)
- Git
- Crear virtual environment:
python -m venv venv- Activar venv:
.\venv\Scripts\Activate.ps1- Instalar dependencias:
python run.py install- Instalar dependencias:
python run.py install- Ejecutar pruebas unitarias:
python run.py test- Generar reporte de cobertura (HTML en
htmlcov/index.html):
python run.py coverage- Ejecutar API:
python run.py run- Ejecutar flujo completo (install + test + coverage + run):
python run.py all- Limpiar archivos cache y temporales:
python run.py clean- API local:
http://localhost:8000/ - Docs automaticas:
http://localhost:8000/docs
Antes de poblar catalogos, asegurate de tener migraciones aplicadas:
alembic upgrade headSe incluye un script para poblar tablas job_roles, technologies y role_skills desde catalogo JSON.
- Simulacion (recomendado):
python scripts/seed_roles_from_catalog.py --dry-run- Carga real:
python scripts/seed_roles_from_catalog.py- Archivo personalizado:
python scripts/seed_roles_from_catalog.py --file .\ruta\mi_catalogo.jsonNotas importantes:
- Si existe
roles_dialog.json, el script lo usa primero; si no, usaroles_catalog.json. - El proceso es idempotente por nombre de rol: crea roles nuevos y actualiza existentes.
- Para cada rol, reemplaza sus
role_skillsen cada ejecucion para mantener consistencia con el JSON. - Tecnologias existentes no se duplican; se reutilizan por nombre.
El repositorio usa un solo workflow: .github/workflows/ci.yml.
- Corre en todo
pushypull_request. - Ejecuta pruebas con cobertura minima del 80%.
- Usa variables CI para pruebas:
DATABASE_URL=sqlite:///./test.dbJWT_SECRET=ci-secret
- Corre despues de
test. - Corre solo para:
pushamainodeveloppull_requestcuya rama base seamainodevelop
- Flujo:
- Checkout del backend.
- Checkout de Sentinel desde
JuanDiegoRV/Sentinel-AI-CD(feature/Laboria_compatibility). - Build de imagen Docker del backend (
laboria-backend:${GITHUB_SHA}). - Escaneo Trivy (
reports/trivy-image.json). - Levanta Sentinel local en el runner (
127.0.0.1:8000). - Envia reporte via
pipeline/trivy_to_gate.py. - Publica resumen del gate en
GITHUB_STEP_SUMMARYy sube artifacts.
Decision del gate:
ALLOW/PASS: continua CI.WARNING: continua CI con riesgo reportado.BLOCKo exit code distinto de 0: falla CI.
Artifacts generados:
reports/trivy-image.jsonreports/sentinel.logreports/sentinel-gate.log
- Corre solo en
pushamain. - Requiere que
testysentinelpasen. - Dispara deploy hook de Render.
En CI se usa GATE_URL=http://127.0.0.1:8000 porque Sentinel se ejecuta dentro del mismo runner de GitHub Actions. No es una URL externa.
Si en logs aparece una linea inicial como:
curl: (7) Failed to connect to 127.0.0.1 port 8000
generalmente es un intento temprano mientras el servicio arranca. Si luego aparece GATE DECISION y respuestas 200 del gate, la evaluacion si ocurrio correctamente.
Para replicar el gate localmente con dos repos separados:
-
Tener ambos repos en paralelo:
...\LaborIABackend...\Sentinel-AI-CD
-
En Sentinel, iniciar API del gate:
cd ..\Sentinel-AI-CD
$env:AI_DISABLED="true"
python -m uvicorn --app-dir app main:app --host 127.0.0.1 --port 8000- En backend, construir imagen y generar reporte Trivy:
cd ..\LaborIABackend
docker build -t laboria-backend:local .
trivy image --format json --output reports/trivy-image.json laboria-backend:local- Enviar reporte al gate:
python ..\Sentinel-AI-CD\pipeline\trivy_to_gate.py `
--report reports/trivy-image.json `
--image laboria-backend:local `
--gate http://127.0.0.1:8000 `
--dockerfile .\DockerfileDockerfile usa python:3.11-slim, instala dependencias desde requirements.txt, copia el proyecto y ejecuta uvicorn main:app en puerto 8000.