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

WorkflowDisparadorProposito
CIPull requests y pushes a mainRestaura renv, comprueba scripts R, carga el manifiesto de {targets}, ejecuta lint no bloqueante y construye Hugo.
ETL ExportManual, semanal y cambios relevantes en mainRestaura 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 DocsManual y cambios en docs-site/ en mainConstruye el sitio Hugo y lo publica en GitHub Pages.
Deploy DBManualValida 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.zip
  • descargas/eleccionesdb_sqlite.zip
  • descargas/eleccionesdb_csv.zip
  • ci-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_KEY
  • CF_S3_SECRET_KEY
  • CF_S3_ENDPOINT
  • CF_S3_BUCKET
  • CF_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_NAME
  • DB_HOST
  • DB_PORT
  • DB_USER
  • DB_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.