Funciones de CI

Las siguientes son algunas funciones que puedes encontrar en la mayoría de los sistemas de CI.

Entorno

Es importante elegir y comprender el entorno de hardware y software en el que el sistema ejecuta el flujo de trabajo. Las consideraciones importantes sobre las aplicaciones para Android son las siguientes:

  • Plataformas: Linux, Mac, Windows y sus versiones.
  • Memoria disponible: La compilación de apps y la ejecución de emuladores pueden consumir mucha RAM y, a menudo, es necesario ajustar parámetros como el tamaño del montón de JVM para evitar errores de memoria insuficiente.
  • Software preinstalado: Los sistemas de CI suelen proporcionar imágenes con una gran colección de herramientas ya disponibles, como Java Development Kit (JDK), kit de desarrollo de software (SDK) de Android, herramientas de compilación, plataformas y emuladores.
  • Arquitectura del ejecutor y conjunto de instrucciones: ARM, x86 Esto es importante cuando se usan emuladores.
  • Variables de entorno: Algunas las configura el sistema de CI (por ejemplo, ANDROID_HOME) y puedes establecer las tuyas para, por ejemplo, evitar codificar credenciales en tu flujo de trabajo.

Hay muchos otros aspectos que debes considerar, como la cantidad de núcleos disponibles y si la virtualización está habilitada para ejecutar emuladores.

Informes y registros

Cuando un paso falla, el sistema de CI te notifica y, por lo general, no te permite combinar el cambio. Para averiguar qué salió mal, busca errores en los registros.

Además, las compilaciones y las pruebas generan informes que, por lo general, se almacenan como artefactos de esa compilación en particular. Según el sistema de CI, puedes usar complementos para visualizar los resultados de esos informes.

Tiempos de ejecución de la caché y la CI

Los sistemas de CI usan una caché de compilación para acelerar el proceso. En su forma más simple, guardan todos los archivos de caché de Gradle después de una compilación exitosa y los restablecen antes de una nueva. Se basa en la función de caché de compilación de Gradle y debería estar habilitada en tu proyecto.

Estas son algunas formas de mejorar los tiempos de ejecución y la confiabilidad:

  • Modules: Detecta qué módulos se ven afectados por un cambio y solo compílalos y pruébalos.
  • Omitir cachés: Si la compilación incluye secuencias de comandos que modificó un desarrollador, ignora las cachés de compilación. Es más seguro compilar desde cero.
  • Pruebas de fragmentación: Las pruebas instrumentadas en especial puede ser útil para fragmentar pruebas en varios dispositivos. Esto es compatible con el ejecutor de Android, los dispositivos administrados por Gradle y Firebase Test Lab.
  • Fragmentar compilaciones: Puedes fragmentar la compilación en varias instancias de servidor.
  • Caché remota: También puedes usar la caché remota de Gradle.

Volver a intentar las pruebas con errores

La fragilidad se refiere a las pruebas o herramientas que fallan de forma intermitente. Siempre debes intentar encontrar y corregir los problemas que generan compilaciones y pruebas inestables, pero algunos de ellos son difíciles de reproducir, en especial cuando se ejecutan pruebas de instrumentación. Una estrategia común es reintentar las ejecuciones de prueba cada vez que fallen, hasta una cantidad máxima de reintentos.

No hay una sola forma de configurar los reintentos, ya que pueden ocurrir en varios niveles. En la siguiente tabla, se describe la acción que puedes realizar en respuesta a una prueba fallida:

Error

Acción

El emulador no respondió durante un segundo, lo que activó un tiempo de espera

Volver a ejecutar la prueba con errores

No se pudo iniciar el emulador

Volver a ejecutar toda la tarea

Se produjo un error de conexión durante la fase de confirmación de la compra del código

Reinicia el flujo de trabajo

Es importante registrar qué partes del sistema son inestables y hacer un seguimiento de ellas, así como realizar un seguimiento para que la CI sea confiable y rápida, solo con reintentos