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.

Las confirmaciones necesitan el escritorio de la Mac

Sección titulada «Las confirmaciones necesitan el escritorio de la Mac»

Un bioProve necesita a una persona frente a la Mac. kovra 0.12.1 se entrega para macOS, y ahí toda aprobación se lee y se aprueba en la ventana de revisión de kovra: el sensor de Touch ID dentro de ella, o un código y el diálogo de macOS con la contraseña de su sesión si la Mac no tiene Touch ID (o no está configurado). En CI, por SSH o donde no haya sesión gráfica, esa ventana no se puede mostrar: con un teléfono vinculado, la solicitud va a la app de aprobación de kovra en ese teléfono (kovra Mobile, próximamente), donde una persona la aprueba o la deniega; sin teléfono vinculado, todo lo que necesita aprobación se rechaza, con un mensaje que lo indica. La llave maestra y la vinculación se aprueban solo en la Mac. kovra nunca recae en una aprobación que un script o un agente pueda darse a sí mismo, y KOVRA_CONFIRMER no cambia eso en una Mac (solo aplica a builds de desarrollo).

Esto tiene una consecuencia deliberada: las acciones high/prod no pueden automatizarse — requieren a una persona, frente a la Mac o en el teléfono vinculado, por diseño. Por eso, en CI:

  • Los secretos low/medium se inyectan sin prompt — el camino cotidiano en CI: kovra run sin valores high/prod funciona de forma desatendida.
  • Todo lo que necesita aprobación — inyectar un valor high/prod, eliminar o bajar de nivel un secreto crítico — se rechaza, salvo que una persona lo apruebe en el teléfono vinculado. No hay bypass desatendido para kovra run; ejecútelo desde el escritorio de la Mac.

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 }
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.