Puedes llamar a Bazel desde las secuencias de comandos para realizar una compilación, ejecutar pruebas o consultar el gráfico de dependencias. Bazel se diseñó para permitir secuencias de comandos efectivas, pero esta sección enumera 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 dónde deben escribirse los resultados de una compilación en el proceso de Bazel, así como varios archivos de trabajo que usa Bazel de forma interna, uno de los cuales es un bloqueo que protege contra la mutación simultánea de la base de salida de varios procesos de Bazel.
La elección del directorio base correcto de salida 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 resultados que necesitas 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 asignarle a cada una una base de salida diferente (o aleatoria).
Si usas el valor base predeterminado de salida, 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 de servidor de larga duración como optimización. Cuando ejecutes Bazel en una secuencia de comandos, no olvides llamar a shutdown
cuando termines con el servidor, o especifica --max_idle_secs=5
para que los servidores inactivos se cierren de inmediato.
¿Qué código de salida obtendré?
Bazel intenta diferenciar las fallas debido al código fuente en consideración de los 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
- Correcto2
: Problema de línea de comandos, marcas incorrectas o combinaciones de comandos, o variables de entorno incorrectas Se debe modificar la línea de comandos.8
: La compilación se interrumpió, pero se cerró el pedido de forma ordenada.9
: Se mantiene el bloqueo del servidor y se pasa--noblock_for_lock
.32
: la falla del entorno externo no se encuentra en esta máquina.33
: Bazel se quedó sin memoria y falló. Debe modificar su línea de comandos.34
: reservado para uso interno de Google.35
: reservado para uso interno de Google.36
: posible problema ambiental local, sospecha que es permanente.37
: Error de excepción no controlada o de Bazel interno.38
: reservado para uso interno de Google.39
: Los BLOB que requiere Bazel son expulsados de la caché remota.41-44
: reservado para uso interno de Google.45
: Se produjo un error al publicar los resultados en el servicio Evento de compilación.47
: reservado para uso interno de Google.
Códigos de retorno para los comandos bazel build
, bazel test
:
1
: error de compilación3
: Se creó correctamente, pero algunas pruebas fallaron o se agotaron el tiempo de espera.4
: La compilación se realizó correctamente, pero no se encontraron pruebas a pesar de que se solicitaron.
Para bazel run
:
1
: error de compilación- Si la compilación se realiza correctamente, pero el subproceso ejecutado muestra un código de salida distinto de cero, también será el código de salida del comando.
Para bazel query
:
3
: Se realizó de forma parcial, pero la consulta encontró 1 o más errores en el conjunto de archivos de BUILD 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
: falla del comando.
Las versiones futuras de Bazel pueden agregar códigos de salida adicionales y reemplazar el código de salida con fallas
1
por un valor 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
del directorio base del lugar de trabajo o al directorio principal del usuario. Si esto es conveniente o no, es una opción para tu secuencia de comandos. Si tu secuencia de comandos debe ser perfectamente hermética (como cuando se compilan versiones), debes inhabilitar la lectura del archivo .bazelrc con la opción --bazelrc=/dev/null
. Si deseas realizar una compilación mediante 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 se convierte en el comando de Bazel más reciente.
Sin embargo, la ubicación del archivo de registro de comandos no cambiará a menos que cambies la configuración de las opciones --output_base
o --output_user_root
.
Analizando salida
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 "compilación actualizada" o no. Estos mensajes se pueden analizar para descubrir qué destinos se compilaron de forma correcta y la ubicación de los archivos de salida que crearon. Asegúrate de especificar un valor muy grande de n si confías en estos mensajes.
Soluciona problemas de rendimiento mediante la generación de perfiles
Consulta la sección sobre creación de perfiles de rendimiento.