Cómo llamar a Bazel desde secuencias de comandos

Informar un problema Ver fuente

Puedes llamar a Bazel desde secuencias de comandos para realizar una compilación, ejecutar pruebas o consultar el gráfico de dependencias. Bazel se diseñó para habilitar secuencias de comandos eficaces, pero en esta sección, se enumeran algunos detalles que debes tener en cuenta para que tus secuencias de comandos sean más sólidas.

Elige la base de salida

La opción --output_base controla en qué lugar el proceso de Bazel debe escribir los resultados de una compilación, así como varios archivos de trabajo que Bazel usa internamente, uno de los cuales es un bloqueo que protege contra la mutación simultánea de la base de salida por parte de varios procesos de Bazel.

La elección del directorio base de salida correcto para tu secuencia de comandos depende de varios factores. Si necesitas colocar los resultados de la compilación en una ubicación específica, esto determinará la base de salida que debes usar. Si realizas una llamada de "solo lectura" a Bazel (como bazel query), los factores de bloqueo serán más importantes. En particular, si necesitas ejecutar varias instancias de la secuencia de comandos al mismo tiempo, debes tener en cuenta que cada proceso del servidor Blaze puede manejar como máximo una invocación a la vez. Según la situación, tal vez tenga sentido que cada instancia de tu secuencia de comandos espere su turno, o bien usar --output_base para ejecutar varios servidores Blaze y usarlos.

Si usas el valor base de salida predeterminado, competirás por el mismo bloqueo que usan los comandos interactivos de Bazel del usuario. Si el usuario emite comandos de larga duración, como compilaciones, tu secuencia de comandos tendrá que esperar a que se completen esos comandos para poder continuar.

Notas sobre el modo de servidor

De forma predeterminada, Bazel usa un proceso del servidor de larga duración como optimización. Cuando ejecutes Bazel en una secuencia de comandos, no olvides llamar a shutdown cuando termines de usar el servidor o especifica --max_idle_secs=5 para que los servidores inactivos se apaguen de inmediato.

¿Qué código de salida obtendré?

Bazel intenta diferenciar las fallas debido al código fuente que se considera de errores externos que impiden que Bazel se ejecute de forma correcta. La ejecución de Bazel puede generar los siguientes códigos de salida:

Códigos de salida comunes a todos los comandos:

  • 0 - Listo
  • 2: Problema de la línea de comandos, marcas o combinación de comandos incorrectas o ilegales, o variables de entorno incorrectas. Se debe modificar la línea de comandos.
  • 8: Se interrumpió la compilación, pero se cerró de forma ordenada.
  • 9: Se retiene el bloqueo del servidor y se pasó --noblock_for_lock.
  • 32: Error del entorno externo que no se encuentra en esta máquina.

  • 33: Bazel se quedó sin memoria y falló. Debes modificar la línea de comandos.

  • 34: reservado para uso interno de Google.

  • 35: reservado para uso interno de Google.

  • 36: Problema ambiental local, sospechado permanente.

  • 37: Excepción no controlada / error interno de Bazel

  • 38: Error transitorio de publicación de resultados en el servicio de eventos de compilación.

  • 39: Los BLOB que requiere Bazel se expulsan de la caché remota.

  • 41-44: reservado para uso interno de Google.

  • 45: Error persistente cuando se publican los resultados en el servicio de eventos de compilación

  • 47: reservado para uso interno de Google.

  • 49: reservado para uso interno de Google.

Códigos de retorno para los comandos bazel build, bazel test:

  • 1: error de compilación.
  • 3: La compilación es correcta, pero algunas pruebas fallaron o se agotó el tiempo de espera.
  • 4: La compilación se realizó correctamente, pero no se encontraron pruebas a pesar de que se solicitaron pruebas.

Para bazel run:

  • 1: error de compilación.
  • Si la compilación tiene éxito, pero el subproceso ejecutado muestra un código de salida distinto de cero, este también será el código de salida del comando.

Para bazel query:

  • 3: No se realizó correctamente la consulta, pero se encontraron 1 o más errores en el conjunto de archivos de COMPILACIÓN de entrada y, por lo tanto, los resultados de la operación no son 100% confiables. Es probable que esto se deba a una opción --keep_going en la línea de comandos.
  • 7: error del comando.

Las versiones futuras de Bazel pueden agregar códigos de salida adicionales y reemplazar el código de salida genérico de falla 1 por un valor diferente que no sea cero y un significado particular. Sin embargo, todos los valores de salida que no sean cero siempre constituirán un error.

Lee el archivo .bazelrc

De forma predeterminada, Bazel lee el archivo .bazelrc del directorio del lugar de trabajo base o del directorio principal del usuario. Si esto es conveniente o no, es una opción para tu secuencia de comandos. Si esta necesita ser perfectamente hermética (como cuando se hacen compilaciones de lanzamiento), debes inhabilitar la lectura del archivo .bazelrc con la opción --bazelrc=/dev/null. Si deseas realizar una compilación con la configuración preferida del usuario, el comportamiento predeterminado es mejor.

Registro de comandos

El resultado de Bazel también está disponible en un archivo de registro de comandos que puedes encontrar con el siguiente comando:

bazel info command_log

El archivo de registro de comandos contiene las transmisiones stdout y stderr intercaladas del comando de Bazel más reciente. Ten en cuenta que ejecutar bazel info reemplazará el contenido de este archivo, ya que luego se convertirá en el comando de Bazel más reciente. Sin embargo, la ubicación del archivo de registro del comando no cambiará a menos que cambies la configuración de las opciones --output_base o --output_user_root.

Resultado del análisis

El resultado de Bazel es bastante fácil de analizar para muchos propósitos. Dos opciones que pueden ser útiles para tu secuencia de comandos son --noshow_progress, que suprime los mensajes de progreso, y --show_result n, que controla si se imprimen los mensajes de “compilar actualizados”. Estos mensajes se pueden analizar para descubrir qué destinos se compilaron correctamente y la ubicación de los archivos de salida que se crearon. Asegúrate de especificar un valor muy grande de n si dependes de estos mensajes.

Cómo solucionar problemas de rendimiento mediante la generación de perfiles

Consulta la sección Generación de perfiles de rendimiento.