Adapta reglas de Bazel para la ejecución remota

Informar un problema . Ver fuente . Por la noche · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

Esta página está destinada a usuarios de Bazel que escriben reglas personalizadas de compilación y prueba. que desean comprender los requisitos de las reglas de Bazel en el contexto de ejecución remota.

La ejecución remota le permite a Bazel ejecutar acciones en una plataforma independiente, como un centro de datos. Bazel usa un Protocolo gRPC para su ejecución remota. Puedes probar la ejecución remota con bazel-buildfarm un proyecto de código abierto que tiene como objetivo proporcionar una ejecución remota distribuida plataforma.

En esta página, se usa la siguiente terminología para referirse a los diferentes Tipos de entorno o plataformas:

  • Plataforma de host: Es la plataforma en la que se ejecuta Bazel.
  • Plataforma de ejecución: donde se ejecutan las acciones de Bazel
  • Plataforma de destino: donde se ejecutan los resultados de la compilación (y algunas acciones).

Descripción general

Cuando configures una compilación de Bazel para la ejecución remota, debes seguir las lineamientos descritos en esta página para garantizar que la compilación se ejecute de forma remota sin errores. Esto se debe a la naturaleza de la ejecución remota, en particular:

  • Acciones de compilación aisladas. Las herramientas de compilación no retienen el estado ni las dependencias no puede filtrarse entre ellas.

  • Varios entornos de ejecución. La configuración de compilación local adecuada para entornos de ejecución remota.

En esta página, se describen los problemas que pueden surgir cuando se implementa un Bazel personalizado. crear y probar reglas para la ejecución remota y cómo evitarlas Abarca las los siguientes temas:

Cómo invocar herramientas de compilación mediante reglas de la cadena de herramientas

Una regla de la cadena de herramientas de Bazel es un proveedor de configuración que le indica a una regla de compilación lo que herramientas de compilación (como compiladores y vinculadores) y cómo configurarlos con parámetros definidos por el creador de la regla. Una regla de la cadena de herramientas permite compilar y prueba reglas para invocar herramientas de compilación de forma predecible y preconfigurada que es compatible con la ejecución remota. Por ejemplo, usa una regla de la cadena de herramientas en lugar de invocar herramientas de compilación a través de PATH, JAVA_HOME u otro método variables que pueden no estar configuradas en valores equivalentes (o directamente) en la configuración entorno de ejecución.

Actualmente, existen reglas de la cadena de herramientas para las reglas de compilación y prueba de Bazel para Scala Rust, y Go, y hay nuevas reglas de cadenas de herramientas en curso para otros lenguajes y herramientas como Bash. Si no existe una regla de la cadena de herramientas para la herramienta que usa tu regla, considera lo siguiente: crear una regla de la cadena de herramientas.

Administra dependencias implícitas

Si una herramienta de compilación puede acceder a dependencias en las acciones de compilación, esas acciones fallan cuando se ejecutan de forma remota porque cada acción de compilación remota se ejecuta separados de los demás. Algunas herramientas de compilación retienen el estado en las acciones de compilación y acceder a las dependencias que no se hayan incluido explícitamente en la herramienta la aplicación, lo que hará que las acciones de compilación ejecutadas de forma remota fallen.

Por ejemplo, cuando Bazel indica a un compilador con estado que compile foo de forma local, el compilador retiene referencias a los resultados de compilación de foo. Cuando Bazel entonces Indica al compilador que compile bar, que depende de foo, sin indicar explícitamente la dependencia en el archivo BUILD para incluirla en el invocación del compilador, la acción se ejecutará correctamente si se mantiene el mismo de Compute Engine se ejecuta para ambas acciones (como es habitual en las ejecuciones locales). Sin embargo, debido a que en una situación de ejecución remota cada acción de compilación ejecuta una instancia del compilador independiente, estado del compilador y dependencia implícita de bar en foo se perderá y la compilación fallará.

Para ayudar a detectar y eliminar estos problemas de dependencias, Bazel 0.14.1 ofrece la una zona de pruebas local de Docker, que tiene las mismas restricciones de dependencias que la remota. ejecución. Usa la zona de pruebas para preparar tu compilación para la ejecución remota. Para ello, haz lo siguiente: Identificar y resolver errores de compilación relacionados con dependencias. Consulta Solución de problemas de la ejecución remota de Bazel con la zona de pruebas de Docker. para obtener más información.

Administra objetos binarios que dependen de la plataforma

Normalmente, un objeto binario compilado en la plataforma host no puede ejecutarse de forma segura en un de ejecución remota arbitraria debido a la posible falta de coincidencias de dependencias. Por ejemplo, el objeto binario SingleJar proporcionado con Bazel se orienta a la plataforma host. Sin embargo, para la ejecución remota, SingleJar se debe compilar como parte del proceso de compilar tu código para que se oriente a la plataforma de ejecución remota. (Consulta la lógica de selección de objetivos).

No envíes objetos binarios de las herramientas de compilación requeridas por tu compilación con tu código fuente. a menos que tengas la certeza de que se ejecutarán de manera segura en tu plataforma de ejecución. En cambio, una de las siguientes opciones:

  • Envía el código fuente de la herramienta o haz referencia externa a este para que se pueda creado para la plataforma de ejecución remota.

  • Instala previamente la herramienta en el entorno de ejecución remota (por ejemplo, un toolchain container) si es lo suficientemente estable y usa las reglas de la cadena de herramientas para ejecutarlo. en tu compilación.

Administra reglas de WORKSPACE de estilo de configuración

Las reglas WORKSPACE de Bazel se pueden usar para sondear la plataforma host en busca de herramientas. y las bibliotecas requeridas por la compilación, que, para las compilaciones locales, también es de procesamiento y ejecución. Si la compilación depende explícitamente de herramientas de compilación locales y artefactos, fallará durante la ejecución remota si la plataforma de ejecución remota no es igual a la plataforma host.

Las siguientes acciones realizadas por las reglas de WORKSPACE no son compatibles con ejecución remota:

  • Compilación de objetos binarios. Ejecuta acciones de compilación en WORKSPACE reglas genera objetos binarios incompatibles con la plataforma de ejecución remota si es diferente de la plataforma host.

  • Instalación de paquetes de pip. Se instalaron pip paquetes a través de WORKSPACE requieren que sus dependencias estén preinstaladas en la plataforma host. Esos paquetes, creados específicamente para la plataforma host, serán incompatible con la plataforma de ejecución remota si es diferente del host plataforma.

  • Vinculación con herramientas o artefactos locales. Enlaces simbólicos a herramientas o bibliotecas instalado en la plataforma host creada a través de reglas WORKSPACE provocarán que el fallen en la plataforma de ejecución remota, ya que Bazel no podrá para ubicarlos. En su lugar, crea symlinks con acciones de compilación estándar para que Se puede acceder a las herramientas y bibliotecas con symlink desde runfiles de Bazel. de imágenes. No uses repository_ctx.symlink para crear symlink de archivos de destino fuera del directorio de repositorio externo.

  • Mutación de la plataforma host. Evita crear archivos fuera de Bazel runfiles, crear variables de entorno y acciones similares, como es posible que se comporten de forma inesperada en la plataforma de ejecución remota.

Para ayudar a encontrar un posible comportamiento no hermético, puedes usar el registro de reglas de Workspace.

Si una dependencia externa ejecuta operaciones específicas que dependen del host debes dividir esas operaciones entre WORKSPACE y compilar de la siguiente manera:

  • Inspección de la plataforma y enumeración de dependencias. Estas operaciones se seguro ejecutarse de forma local mediante reglas WORKSPACE, que pueden verificar qué instalar bibliotecas, descargar los paquetes que se deben compilar y preparar los artefactos necesarios para la compilación. Para la ejecución remota, estas reglas deben también admiten el uso de artefactos ya verificados para brindar la información que que se obtendrían normalmente durante la inspección de la plataforma host. Verificadas previamente Los artefactos permiten que Bazel describa dependencias como si fueran locales. Usa sentencias condicionales o la marca --override_repository para esto.

  • Generar o compilar artefactos específicos de destino y mutación de la plataforma. Estas operaciones deben ejecutarse mediante reglas de compilación regulares. Acciones que producir artefactos específicos del destino para dependencias externas deben ejecutarse durante la compilación.

Para generar con mayor facilidad artefactos previamente verificados para la ejecución remota, puedes usar WORKSPACE reglas para emitir archivos generados. Puedes ejecutar esas reglas en cada de ejecución, p. ej., dentro de cada contenedor de la cadena de herramientas, y verifica los resultados de la compilación de ejecución remota en el repositorio de código fuente como referencia.

Por ejemplo, en el caso de las reglas de TensorFlow para cuda y python, las reglas WORKSPACE generan el siguiente BUILD files: Para la ejecución local, se usan los archivos producidos con la verificación del entorno del host. Para la ejecución remota, una sentencia condicional en una variable de entorno permite que la regla use archivos que se del repo.

Los archivos BUILD declaran genrules. que puede ejecutarse de forma local y remota, y realizar el procesamiento necesario que antes se realizaba mediante repository_ctx.symlink, como se muestra aquí.