Licencia

Los repositorios públicos usan TestDetta gratis. Los repositorios privados pasan una cadena de licencia al CI. Un problema de licencia nunca hace fallar una compilación: sin una licencia válida se ejecutan todas las pruebas, como antes de TestDetta.

Repositorios públicos

Un repositorio público no necesita licencia, pero TestDetta solo sabe que un repositorio es público donde el CI lo indica:

En Jenkins, Azure DevOps, Bitbucket, otros sistemas de CI y las máquinas de los desarrolladores, todos los repositorios cuentan como privados.

Cómo pasar la licencia

TestDetta busca la licencia en este orden:

  1. TESTDETTA_LICENSE: la cadena de licencia, desde una variable enmascarada o secreta;
  2. TESTDETTA_LICENSE_FILE: la ruta de un archivo que la contiene;
  3. ~/.testdetta/license: la escriben td license install y la actualización automática;
  4. .testdetta/license en el repositorio.

Lo recomendado es una variable secreta. En GitHub Actions, pásala a través de la entrada license de la acción:

- uses: <owner>/testdetta@<sha>
  with:
    mode: test
    license: ${{ secrets.TESTDETTA_LICENSE }}

Solo td affected y td test comprueban la licencia. td record ejecuta todas las pruebas de todos modos y no necesita ninguna.

Cómo comprobarla

td license status muestra qué cubre la licencia encontrada: su validez, los repositorios que cubre y el número de committers activos, sin datos personales. El mismo estado aparece en el registro, en el job summary y en la salida JSON siempre que importa: válida, a punto de caducar, por encima de los puestos, caducada, ámbito incorrecto, no válida o ausente.

td license status

Máquinas sin secretos de CI

Donde ninguna variable secreta puede contener la licencia, guárdala una vez por máquina:

td license install <license|file>

Primero se comprueba y después se escribe en ~/.testdetta/license.

Renovación automática

Una licencia incluye la dirección desde la que se renueva. Como máximo una vez al día, TestDetta obtiene la versión actual y la guarda en ~/.testdetta/license, así que las renovaciones y los puestos añadidos llegan sin tocar tus secretos. La solicitud envía la licencia en una cabecera y nada de tu repositorio. Tiene un tiempo de espera de 2 segundos y ningún reintento, y cualquier fallo se ignora: una red sin conexión o bloqueada cuesta como mucho 2 segundos al día. Se respeta HTTPS_PROXY.

En una red que no puede acceder al servicio de licencias, define TESTDETTA_LICENSE_REFRESH=off y sustituye tú mismo la cadena de licencia cuando recibas una nueva.

Qué repositorios cubre una licencia

Una licencia indica los repositorios que cubre, como github.com/acme/*. TestDetta los compara con el remoto origin del repositorio. Las credenciales incrustadas en la URL del remoto, habituales con Jenkins, se eliminan antes de la comparación y nunca se registran.

Cuando el remoto no nombra el repositorio que cubre la licencia, por ejemplo en un mirror local, define TESTDETTA_LICENSE_SCOPE:

TESTDETTA_LICENSE_SCOPE=git.acme.corp/scm/pay/app

Committers activos

TestDetta tiene un precio por committer activo al mes: un autor de commits distinto con al menos un commit creado en los últimos 30 días, entre los commits alcanzables desde el commit analizado. Los autores se cuentan localmente, por correo unificado mediante .mailmap, y ningún correo sale de tus máquinas. No se cuentan bots como Dependabot, Renovate y github-actions; añade tus propios patrones en .testdetta/license.json:

{ "bots": ["ci-service-account"] }

Hasta un 20 % por encima de los puestos de la licencia (al menos una persona) no hay problema. Por encima de eso, TestDetta sigue seleccionando durante 30 días y avisa en cada resumen, para que haya tiempo de añadir puestos; solo si después el recuento sigue por encima se ejecutan todas las pruebas, como sin licencia. Consulta Precios.

Nunca una compilación en rojo: una licencia caducada, ausente o que no coincide hace que TestDetta ejecute todas las pruebas y explique por qué. No hace fallar el job.