Ir al contenido

Headless y CI

Los valores por defecto de kovra asumen una persona frente a una Mac: la master key en el Keychain y las acciones sensibles protegidas detrás de un bioProve. Los entornos desatendidos — runners de CI, contenedores — no tienen ninguno de los dos. kovra también funciona ahí, en modo passphrase.

Al definir KOVRA_PASSPHRASE, kovra deja de usar por completo el keyring del SO: deriva la master key de 256 bits con Argon2id a partir de la passphrase más un salt estable y no secreto guardado junto al vault (kdf.salt). Se inicializa el vault una vez para crear el salt, y luego cada ejecución posterior deriva la misma clave:

Ventana de terminal
export KOVRA_PASSPHRASE="$CI_VAULT_PASSPHRASE" # from your CI secret store
kovra init

Conviene mantener la passphrase en el almacén de secretos del proveedor de CI — es lo único que desbloquea el vault, así que se la trata como la master key que deriva.

Un bioProve necesita una persona. En un host sin hardware biométrico, kovra recurre al file broker: un comando protegido espera e imprime instrucciones, y una segunda sesión lo aprueba. En scripts se fuerza el canal de forma explícita:

Ventana de terminal
export KOVRA_CONFIRMER=file # never attempt a biometric prompt

Esto tiene una consecuencia deliberada: las acciones high/prod no pueden automatizarse por completo — siguen requiriendo a una persona, por diseño. Por eso, en CI:

  • Los secretos low/medium se inyectan sin prompt — el camino cotidiano en CI.
  • La inyección de high/prod sigue necesitando a una persona en el file broker — no hay bypass desatendido para kovra run.

El gate de lanzamiento del Dashboard puede omitirse en dev/CI/contenedores con --no-confirm (o KOVRA_UI_NO_CONFIRM=1).

jobs:
test:
runs-on: [self-hosted, macos]
env:
KOVRA_PASSPHRASE: ${ secrets.KOVRA_VAULT_PASSPHRASE }
KOVRA_CONFIRMER: file
steps:
- uses: actions/checkout@v4
- name: Run tests with injected secrets
run: kovra run --env dev -- npm test

kovra run --env dev resuelve el .env.refs commiteado e inyecta los valores dev (no high) directamente en npm test — sin escribir nada en disco, argv ni el log.