El proyecto usa GitHub Actions para separar validacion, exportacion, documentacion y despliegue de base de datos. La regla principal es que el CI ordinario nunca escribe en PostgreSQL: la carga real queda aislada en un workflow manual protegido.
Workflows
| Workflow | Disparador | Proposito |
|---|---|---|
CI | Pull requests y pushes a main | Restaura renv, comprueba scripts R, carga el manifiesto de {targets}, ejecuta lint no bloqueante y construye Hugo. |
ETL Export | Manual, semanal y cambios relevantes en main | Restaura data-raw/ desde cache exacta o lo descarga desde R2, ejecuta run_export() y run_export_calidad(), valida ZIPs, sube artefactos y publica en R2 las ejecuciones completas. |
Deploy Docs | Manual y cambios en docs-site/ en main | Construye el sitio Hugo y lo publica en GitHub Pages. |
Deploy DB | Manual | Valida o descarga datos en la maquina remota, ejecuta targets pesados en procesos R separados y carga PostgreSQL con staging transaccional. |
Reproducibilidad
La fuente canonica de dependencias es renv.lock:
renv::restore(prompt = FALSE)
El script install_deps.R se mantiene como bootstrap secundario para entornos sin renv, pero no sustituye al lockfile.
Cache de data-raw/
Los datos maestros viven en Cloudflare R2 bajo eleccionesdb-etl/data-raw/ y no se versionan en Git. El archivo data-manifest.csv es la fuente de verdad para descarga, validacion e invalidacion de cache.
ETL Export usa actions/cache@v5 con una clave exacta:
data-raw-${{ runner.os }}-${{ hashFiles('data-manifest.csv') }}
No se usan restore-keys para evitar recuperar datos obsoletos. Si cambian objetos en R2, hay que regenerar y commitear data-manifest.csv; ese cambio fuerza una nueva cache.
Deploy DB no usa esa cache porque se ejecuta por SSH en la maquina remota. Alli valida data-raw/ y descarga solo los ficheros ausentes o con tamano distinto.
Artefactos de exportacion
ETL Export genera y valida:
descargas/eleccionesdb_parquet.zipdescargas/eleccionesdb_sqlite.zipdescargas/eleccionesdb_csv.zipci-summary.md, con metricas basicas de tablas finales, diagnosticos y tamaños de artefactos.
La validacion abre el SQLite y ejecuta PRAGMA integrity_check, comprueba tablas obligatorias, extrae los ZIP y lee muestras de Parquet y CSV.
Publicacion de descargas
Cada ejecucion completa de ETL Export publica automaticamente las descargas validadas en Cloudflare R2. Las ejecuciones con smoke_test se excluyen porque contienen un subconjunto de los datos. El destino es:
s3://$CF_S3_BUCKET/eleccionesdb-etl/descargas/
Secretos requeridos:
CF_S3_ACCESS_KEYCF_S3_SECRET_KEYCF_S3_ENDPOINTCF_S3_BUCKETCF_S3_PUBLIC_BASE_URL
Carga PostgreSQL
Deploy DB usa el environment protegido production-db y requiere confirmar manualmente con:
TRUNCATE_AND_LOAD_ELECCIONESDB
Secretos requeridos:
DB_NAMEDB_HOSTDB_PORTDB_USERDB_PASSWORD
Este workflow ejecuta los targets de escritura en orden y en procesos R separados. El ultimo paso valida tablas finales, carga staging temporal y reemplaza PostgreSQL dentro de una transaccion. No debe habilitarse en pull requests.