Cómo llamar a Bazel desde secuencias de comandos

Informar un problema Ver código fuente Nocturno · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 permitir la creación de 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.

Cómo elegir la base de salida

La opción --output_base controla dónde debe escribir el proceso de Bazel los resultados de una compilación, así como varios archivos de trabajo que Bazel usa de forma interna, 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.

Elegir el 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 tu secuencia de comandos de forma simultánea, deberás asignar a cada una una base de salida diferente (o aleatoria).

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 deberá esperar a que se completen esos comandos antes de poder continuar.

Notas sobre el modo de servidor

De forma predeterminada, Bazel usa un proceso de servidor de larga duración como una 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 rápidamente.

¿Qué código de salida obtendré?

Bazel intenta diferenciar las fallas debidas al código fuente en consideración de los errores externos que impiden que Bazel se ejecute correctamente. La ejecución de Bazel puede generar los siguientes códigos de salida:

Códigos de salida comunes a todos los comandos:

  • 0: Correcto
  • 2: Problema de línea de comandos, marcas o combinación de comandos incorrectos o no válidos, 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 mantiene el bloqueo del servidor y se pasó --noblock_for_lock.
  • 32: Error externo del entorno que no se encuentra en esta máquina.

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

  • 34: Se reserva para uso interno de Google.

  • 35: Se reserva para uso interno de Google.

  • 36: Problema ambiental local, se sospecha que es permanente.

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

  • 38: Se reserva para uso interno de Google.

  • 39: Los blobs que requiere Bazel se quitan de la caché remota.

  • 41-44: Se reserva para uso interno de Google.

  • 45: Error al publicar los resultados en el servicio de eventos de compilación.

  • 47: Se reserva para uso interno de Google.

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

  • 1: Se produjo un error en la compilación.
  • 3: La compilación se realizó correctamente, pero algunas pruebas fallaron o se agotó el tiempo de espera.
  • 4: La compilación se realizó correctamente, pero no se encontraron pruebas, aunque se solicitaron.

Para bazel run:

  • 1: Se produjo un error en la compilación.
  • Si la compilación se realiza correctamente, pero el subproceso ejecutado devuelve un código de salida distinto de cero, también será el código de salida del comando.

Para bazel query:

  • 3: Éxito parcial, pero la búsqueda encontró 1 o más errores en el conjunto de archivos BUILD de entrada, por lo que los resultados de la operación no son 100% confiables. Es probable que se deba a una opción --keep_going en la línea de comandos.
  • 7: Error de comando.

Es posible que las versiones futuras de Bazel agreguen códigos de salida adicionales y reemplacen el código de salida genérico de error 1 por un valor diferente distinto de cero con un significado particular. Sin embargo, todos los valores de salida distintos de cero siempre constituirán un error.

Cómo leer el archivo .bazelrc

De forma predeterminada, Bazel lee el archivo .bazelrc desde el directorio base del espacio de trabajo o el directorio principal del usuario. Si esto es deseable o no, es una decisión que debe tomar tu secuencia de comandos. Si tu secuencia de comandos debe ser perfectamente hermética (por ejemplo, cuando se realizan 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 los flujos stdout y stderr intercalados del comando Bazel más reciente. Ten en cuenta que ejecutar bazel info sobrescribirá el contenido de este archivo, ya que se convertirá en el comando de Bazel más reciente. Sin embargo, la ubicación del archivo de registro de comandos no cambiará, a menos que modifiques la configuración de las opciones --output_base o --output_user_root.

Análisis del resultado

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 o no los mensajes de "compilación actualizada". Estos mensajes se pueden analizar para descubrir qué destinos se compilaron correctamente y la ubicación de los archivos de salida que crearon. Asegúrate de especificar un valor muy grande de n si dependes de estos mensajes.

Soluciona problemas de rendimiento con la generación de perfiles

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