Encuentra comportamientos no herméticos en las reglas de WORKSPACE

A continuación, una máquina anfitrión es la máquina en la que se ejecuta Bazel.

Cuando usas la ejecución remota, los pasos reales de compilación o prueba no ocurren en la máquina anfitrión, sino que se envían al sistema de ejecución remota. Sin embargo, los pasos involucrados en la resolución de reglas del lugar de trabajo se realizan en la máquina anfitrión. Si las reglas de tu lugar de trabajo acceden a información sobre la máquina anfitrión para usarla durante la ejecución, es probable que la compilación se rompa debido a las incompatibilidades entre los entornos.

Como parte de la adaptación de reglas de Bazel para la ejecución remota, debes encontrar esas reglas del lugar de trabajo y corregirlas. En esta página, se describe cómo encontrar reglas de lugares de trabajo potencialmente problemáticas en el registro del lugar de trabajo.

Cómo buscar reglas no herméticas

Las reglas del lugar de trabajo permiten al desarrollador agregar dependencias a lugares de trabajo externos, pero son lo suficientemente ricos como para permitir que suceda un procesamiento arbitrario en el proceso. Todos los comandos relacionados se ejecutan de forma local y pueden ser una posible fuente de no hermeticidad. Por lo general, un comportamiento no hermético se introduce a través de repository_ctx, que permite interactuar con la máquina anfitrión.

A partir de Bazel 0.18, puedes obtener un registro de algunas acciones potencialmente no herméticas si agregas la marca --experimental_workspace_rules_log_file=[PATH] al comando de Bazel. Aquí, [PATH] es el nombre de archivo con el que se creará el registro.

Información que debes tener en cuenta:

  • el registro captura los eventos a medida que se ejecutan. Si algunos pasos se almacenan en caché, no aparecerán en el registro. Por lo tanto, para obtener un resultado completo, no olvides ejecutar bazel clean --expunge de antemano.

  • A veces, las funciones se pueden volver a ejecutar, en cuyo caso los eventos relacionados aparecerán en el registro varias veces.

  • Actualmente, las reglas de Workspace solo registran eventos de Starlark.

Para encontrar lo que se ejecutó durante la inicialización del lugar de trabajo, haz lo siguiente:

  1. Ejecuta bazel clean --expunge. Este comando limpiará la caché local y los repositorios almacenados en caché, lo que garantizará que toda la inicialización se vuelva a ejecutar.

  2. Agrega --experimental_workspace_rules_log_file=/tmp/workspacelog a tu comando de Bazel y ejecuta la compilación.

    Esto produce un archivo proto binario con una lista de mensajes del tipo WorkspaceEvent.

  3. Descarga el código fuente de Bazel y navega a la carpeta de Bazel con el siguiente comando. Necesitas el código fuente para poder analizar el registro del lugar de trabajo con el analizador de workspacelog.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. En el repositorio de código fuente de Bazel, convierte todo el registro del lugar de trabajo en texto.

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
    
  5. El resultado puede ser bastante detallado y, además, incluir el resultado de las reglas de Bazel integradas.

    Para excluir reglas específicas del resultado, usa la opción --exclude_rule. Por ejemplo:

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \
        --exclude_rule "//external:local_config_cc" \
        --exclude_rule "//external:dep" > /tmp/workspacelog.txt
    
  6. Abre /tmp/workspacelog.txt y comprueba si hay operaciones no seguras.

El registro consta de mensajes de WorkspaceEvent que describen ciertas acciones potencialmente no herméticas realizadas en un repository_ctx.

Las acciones que se destacaron como potencialmente no herméticas son las siguientes:

  • execute: Ejecuta un comando arbitrario en el entorno del host. Verifica si es posible que generen dependencias en el entorno de host.

  • download, download_and_extract: Para garantizar compilaciones herméticas, asegúrate de que se especifique sha256

  • file, template: No es no hermético en sí mismo, pero puede ser un mecanismo para ingresar dependencias del entorno del host en el repositorio. Asegúrate de comprender de dónde proviene la entrada y que esta no depende del entorno de host.

  • os: No es no hermético en sí, sino que es una manera fácil de obtener dependencias en el entorno de host. Por lo general, una compilación hermética no lo llamaría. Cuando evalúes si tu uso es hermético, ten en cuenta que se ejecuta en el host y no en los trabajadores. Por lo general, obtener detalles específicos del entorno del host no es una buena idea para las compilaciones remotas.

  • symlink: Por lo general, esto es seguro, pero busca indicadores de advertencia. Cualquier symlink hacia fuera del repositorio o a una ruta de acceso absoluta causaría problemas en el trabajador remoto. Si el symlink se crea según las propiedades de la máquina anfitrión, es probable que también sea problemático.

  • which: La verificación de programas instalados en el host suele ser problemática, ya que los trabajadores pueden tener configuraciones diferentes.