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 escritura 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 resultados por parte de varios procesos de Bazel.
La elección del directorio 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 de forma simultánea,
debes tener en cuenta que cada proceso del servidor Blaze puede controlar como máximo una
invocación a la vez.
Según tu situación, puede ser conveniente que cada instancia de la secuencia de comandos espere su turno, o bien puede ser conveniente usar --output_base
para ejecutar varios servidores Blaze y usarlos.
Si usas el valor predeterminado de la base 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, la secuencia de comandos deberá esperar a que se completen antes de 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 apaguen de inmediato.
¿Qué código de salida recibiré?
Bazel intenta diferenciar las fallas debido 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
: Correcto2
: Problema de línea de comandos, marcas o combinaciones de comandos incorrectas o ilegales, o variables de entorno incorrectas. Se debe modificar la línea de comandos.8
: La compilación se interrumpió, pero se cerró de forma ordenada.9
: El bloqueo del servidor se mantiene y se pasó--noblock_for_lock
.32
: Falla del entorno externo no 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
: Error transitorio al publicar resultados en el servicio de eventos de compilación.39
: Los blobs que requiere Bazel se desalojan de la caché remota.41-44
: Se reserva para uso interno de Google.45
: Error persistente de publicación de resultados en el servicio de eventos de compilación.47
: Se reserva para uso interno de Google.49
: Se reserva para uso interno de Google.
Códigos de retorno de los comandos bazel build
y bazel test
:
1
: No se pudo compilar.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.
Para bazel run
:
1
: No se pudo compilar.- Si la compilación se realiza correctamente, pero el subproceso ejecutado muestra un código de salida que no es cero, también será el código de salida del comando.
Para bazel query
:
3
: Se obtuvo un éxito parcial, pero la consulta encontró 1 o más errores en el conjunto de archivos de entrada de BUILD 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.
Es posible que las versiones futuras de Bazel agreguen códigos de salida adicionales, lo que reemplazará el código de salida de error genérico 1
por un valor diferente distinto de cero con un significado particular.
Sin embargo, todos los valores de salida que no sean cero siempre serán un error.
Cómo leer el archivo .bazelrc
De forma predeterminada, Bazel lee el archivo .bazelrc
desde el directorio de la base de trabajo o el directorio principal del usuario. Si esto es o no
deseado es una opción para tu secuencia de comandos. Si tu secuencia de comandos debe ser
perfectamente hermética (como 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, es mejor usar el comportamiento predeterminado.
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 interpoladas de stdout y stderr del comando 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
.
Cómo analizar el resultado
El resultado de Bazel es bastante fácil de analizar para muchos fines. 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.
Cómo solucionar problemas de rendimiento mediante la generación de perfiles
Consulta la sección Generador de perfiles de rendimiento.