Las compilaciones de Bazel que se ejecutan de forma local pueden fallar cuando se ejecutan de forma remota debido a restricciones y requisitos que no afectan las compilaciones locales. La más común las causas de estas fallas se describen en Cómo adaptar las reglas de Bazel para la ejecución remota.
En esta página, se describe cómo identificar y resolver los problemas más comunes que surgir con la ejecución remota mediante la función de zona de pruebas de Docker, que impone restricciones en la compilación iguales a las de la ejecución remota. Esto te permite para solucionar problemas de tu compilación sin la necesidad de un servicio de ejecución remota.
La función de la zona de pruebas de Docker imita las restricciones de la ejecución remota, como sigue:
Las acciones de compilación se ejecutan en contenedores de cadenas de herramientas. Puedes usar el mismo contenedores de cadenas de herramientas para ejecutar tu compilación de forma local y remota a través de un servicio que admiten la ejecución remota en contenedores.
Ningún dato irrelevante cruza los límites del contenedor. Solo de manera explícita las entradas y salidas declaradas ingresan y salen del contenedor, y solo después se complete correctamente la acción de compilación asociada.
Cada acción se ejecuta en un contenedor nuevo. Un contenedor nuevo y único es para cada acción de compilación generada.
Puedes solucionar estos problemas con uno de los siguientes métodos:
Soluciona problemas de forma nativa. Con este método, Bazel y sus acciones de compilación se ejecutan de forma nativa en tu máquina local. El Docker La función de espacio aislado impone restricciones a la compilación iguales a las de la ejecución. Sin embargo, este método no detectará herramientas, estados ni filtrar datos en tu compilación, lo que causará problemas con la ejecución remota.
Soluciona problemas en un contenedor de Docker. Con este método, Bazel y sus acciones de compilación se ejecutan dentro de un contenedor de Docker. lo que permite detectar herramientas, estados y filtraciones de datos en la compilación, además de imponer restricciones iguales a los de la ejecución remota. Este método proporciona información sobre tu incluso si fallan partes. Este método es experimental pero no tiene asistencia oficial.
Requisitos previos
Antes de comenzar a solucionar problemas, haz lo siguiente si aún no lo hiciste:
- Instala Docker y configura los permisos necesarios para ejecutarlo.
- Instala Bazel 0.14.1 o una versión posterior. Las versiones anteriores no son compatibles con Docker función de zona de pruebas.
- Agrega bazel-toolchains.
repo, fijado a la versión de actualización más reciente, en el archivo
WORKSPACE
de tu compilación como se describe aquí. - Agrega marcas al archivo
.bazelrc
para habilitar la función. Crea el archivo en directorio raíz de tu proyecto de Bazel si no existe. Marcas a continuación son una muestra de referencia. Consulta la información más reciente.bazelrc
en el repositorio bazel-toolchains y copia los valores de las marcas definidas. para la configuracióndocker-sandbox
.
# Docker Sandbox Mode
build:docker-sandbox --host_javabase=<...>
build:docker-sandbox --javabase=<...>
build:docker-sandbox --crosstool_top=<...>
build:docker-sandbox --experimental_docker_image=<...>
build:docker-sandbox --spawn_strategy=docker --strategy=Javac=docker --genrule_strategy=docker
build:docker-sandbox --define=EXECUTOR=remote
build:docker-sandbox --experimental_docker_verbose
build:docker-sandbox --experimental_enable_docker_sandbox
Si tus reglas requieren herramientas adicionales, sigue estos pasos:
Crear un contenedor de Docker personalizado mediante la instalación de herramientas con un Dockerfile y crear la imagen a nivel local.
Reemplaza el valor de la marca
--experimental_docker_image
anterior con el de tu imagen de contenedor personalizada.
Soluciona problemas de forma nativa
Este método ejecuta Bazel y todas sus acciones de compilación directamente en el directorio local. máquina y es una forma confiable de confirmar si la compilación tendrá éxito cuando ejecutado de forma remota.
Sin embargo, con este método, las herramientas, los objetos binarios y los datos instalados localmente pueden filtrarse. en tu compilación, en especial si usa reglas de WORKSPACE de estilo de configuración. Estas filtraciones causarán problemas con la ejecución remota. para detectarlos, soluciona problemas en un contenedor de Docker además de solucionar problemas de forma nativa.
Paso 1: Ejecuta la compilación
Agrega la marca
--config=docker-sandbox
al comando de Bazel que se ejecuta. tu compilación. Por ejemplo:bazel --bazelrc=.bazelrc build --config=docker-sandbox target
Ejecuta la compilación y espera a que se complete. La compilación ejecutará hasta cuatro veces más lento de lo normal debido a la función de la zona de pruebas de Docker.
Puedes encontrar el siguiente error:
ERROR: 'docker' is an invalid value for docker spawn strategy.
Si lo haces, vuelve a ejecutar la compilación con la marca --experimental_docker_verbose
.
Esta marca habilita mensajes de error detallados. Por lo general, este error se debe a una
instalación de Docker defectuosa o falta de permisos para ejecutarla bajo el
cuenta de usuario actual. Consulta la documentación de Docker
para obtener más información. Si los problemas persisten, ve a Soluciona problemas en un contenedor de Docker.
Paso 2: Resuelve los problemas detectados
A continuación, se muestran los problemas más frecuentes y sus soluciones.
Se hace referencia a un archivo, herramienta, objeto binario o recurso al que hace referencia el árbol de runfiles de Bazel que no está presente. Confirmar que se hayan establecido todas las dependencias de los objetivos afectados declarada explícitamente: Consulta Administra dependencias implícitas para obtener más información.
Un archivo, una herramienta, un objeto binario o un recurso al que hace referencia una ruta de acceso absoluta o la
PATH
si falta la variable. Confirma que todas las herramientas necesarias estén instaladas en el contenedor de la cadena de herramientas y usa las reglas de la cadena de herramientas para declara las dependencias que apuntan al recurso faltante. Consulta Cómo invocar herramientas de compilación mediante reglas de la cadena de herramientas para obtener más información.Una ejecución de objeto binario falla. Una de las reglas de compilación hace referencia a un objeto binario. incompatible con el entorno de ejecución (el contenedor de Docker). Consulta Cómo administrar objetos binarios que dependen de la plataforma para obtener más información. Si no puedes resolver el problema, comunícate con bazel-discuss@google.com. para obtener ayuda.
Falta un archivo de
@local-jdk
o hay errores. Los objetos binarios de Java de tu máquina local se filtren en la compilación y no sean compatibles con que la modifica. Usajava_toolchain
. en tus reglas y objetivos, en lugar de@local_jdk
. Escribe a bazel-discuss@google.com si necesitas más ayuda.Otros errores. Escribe a bazel-discuss@google.com para obtener ayuda.
Soluciona problemas en un contenedor de Docker
Con este método, Bazel se ejecuta dentro de un contenedor host de Docker, y la compilación de Bazel Las acciones se ejecutan dentro de contenedores de la cadena de herramientas individuales generados por Docker. función de zona de pruebas. La zona de pruebas genera un contenedor de la cadena de herramientas nuevo para cada uno. y solo se ejecuta una acción en cada contenedor de la cadena de herramientas.
Este método proporciona un control más detallado de las herramientas instaladas en el host. en un entorno de nube. Separando la ejecución de la compilación de la ejecución de su de compilación y mantener las herramientas instaladas al mínimo, puedes verificar si tu compilación tiene dependencias en el entorno de ejecución local.
Paso 1: Compila el contenedor
Crea un
Dockerfile
que cree el contenedor de Docker y, luego, instale Bazel con un conjunto mínimo de herramientas de compilación:FROM debian:stretch RUN apt-get update && apt-get install -y apt-transport-https curl software-properties-common git gcc gnupg2 g++ openjdk-8-jdk-headless python-dev zip wget vim RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" RUN apt-get update && apt-get install -y docker-ce RUN wget https://releases.bazel.build/<latest Bazel version>/release/bazel-<latest Bazel version>-installer-linux-x86_64.sh -O ./bazel-installer.sh && chmod 755 ./bazel-installer.sh RUN ./bazel-installer.sh
Compila el contenedor como
bazel_container
:docker build -t bazel_container - < Dockerfile
Paso 2: Inicia el contenedor
Inicia el contenedor de Docker con el comando que se muestra a continuación. En el comando, para reemplazar la ruta de acceso al código fuente en el host que deseas compilar.
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp:/tmp \
-v your source code directory:/src \
-w /src \
bazel_container \
/bin/bash
Este comando ejecuta el contenedor como raíz, asigna el socket de Docker y activa
el directorio /tmp
. Esto permite que Bazel genere otros contenedores de Docker y
Usa directorios en /tmp
para compartir archivos con esos contenedores. Tu fuente
está disponible en /src
dentro del contenedor.
El comando se inicia intencionalmente desde un contenedor base debian:stretch
que
incluye objetos binarios incompatibles con el contenedor rbe-ubuntu16-04
que se usa como
contenedor de la cadena de herramientas. Si los objetos binarios del entorno local se filtran en el
contenedor de la cadena de herramientas, causarán errores de compilación.
Paso 3: Prueba el contenedor
Ejecuta los siguientes comandos desde el contenedor de Docker para probarlo:
docker ps
bazel version
Paso 4: Ejecuta la compilación
Ejecuta la compilación como se muestra a continuación. El usuario de salida es raíz, de modo que se corresponde con un directorio al que se puede acceder con la misma ruta de acceso absoluta desde el host contenedor en el que se ejecuta Bazel, a partir de los contenedores de la cadena de herramientas que generó Docker función de zona de pruebas en la que se ejecutan las acciones de compilación de Bazel y desde la en la que se ejecutan el contenedor de host y de acción.
bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target
Paso 5: Resuelve los problemas detectados
Puedes resolver las fallas de compilación de la siguiente manera:
Si la compilación falla y indica que no hay espacio en el disco puedes aumentar este límite iniciando el contenedor host con la marca
--memory=XX
, dondeXX
es el espacio en disco asignado en gigabytes. Esto es experimental y podría dar como resultado un comportamiento impredecible.Si la compilación falla durante las fases de análisis o carga, una o más de Las reglas de compilación declaradas en el archivo WORKSPACE no son compatibles con ejecución remota. Consulta Adapta las reglas de Bazel para la ejecución remota. para buscar posibles causas y soluciones.
Si la compilación falla por cualquier otro motivo, consulta los pasos para solucionar problemas en el Paso 2: Resuelve los problemas detectados.