Como encontrar comportamento não hermético nas regras do WORKSPACE

Neste artigo, uma máquina host é aquela em que o Bazel é executado.

Ao usar a execução remota, as etapas reais de build e/ou teste não estão acontecendo na máquina host, mas são enviadas para o sistema de execução remota. No entanto, as etapas envolvidas na resolução de regras do espaço de trabalho acontecem na máquina host. Se as regras do espaço de trabalho acessarem informações sobre a máquina host para uso durante a execução, é provável que o build seja interrompido devido a incompatibilidades entre os ambientes.

Como parte da adaptação das regras do Bazel para execução remota, é necessário encontrar essas regras do espaço de trabalho e corrigi-las. Esta página descreve como encontrar regras do espaço de trabalho potencialmente problemáticas usando o registro do espaço de trabalho.

Como encontrar regras não herméticas

As regras do espaço de trabalho permitem que o desenvolvedor adicione dependências a espaços de trabalho externos, mas são ricas o suficiente para permitir que o processamento arbitrário aconteça no processo. Todos os comandos relacionados estão acontecendo localmente e podem ser uma possível fonte de não hermeticidade. Geralmente, o comportamento não hermético é introduzido pelo repository_ctx, que permite a interação com a máquina host.

A partir do Bazel 0.18, é possível receber um registro de algumas ações potencialmente não herméticas adicionando a flag --experimental_workspace_rules_log_file=[PATH] ao comando do Bazel. Aqui, [PATH] é um nome de arquivo em que o registro será criado.

Observações:

  • o registro captura os eventos à medida que são executados. Se algumas etapas forem armazenadas em cache, elas não vão aparecer no registro. Portanto, para receber um resultado completo, não se esqueça de executar bazel clean --expunge antes.

  • Às vezes, as funções podem ser reexecutadas. Nesse caso, os eventos relacionados vão aparecer no registro várias vezes.

  • As regras do espaço de trabalho atualmente registram apenas eventos do Starlark.

Para descobrir o que foi executado durante a inicialização do espaço de trabalho:

  1. Execute bazel clean --expunge. Esse comando vai limpar o cache local e todos os repositórios armazenados em cache, garantindo que toda a inicialização seja executada novamente.

  2. Adicione --experimental_workspace_rules_log_file=/tmp/workspacelog ao seu comando do Bazel e execute o build.

    Isso produz um arquivo proto binário que lista mensagens do tipo WorkspaceEvent

  3. Faça o download do código-fonte do Bazel e vá para a pasta do Bazel usando o comando abaixo. Você precisa do código-fonte para analisar o registro do espaço de trabalho com o analisador de workspacelog.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
  4. No repositório de código-fonte do Bazel, converta todo o registro do espaço de trabalho em texto.

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
  5. A saída pode ser bastante detalhada e incluir a saída das regras integradas do Bazel.

    Para excluir regras específicas da saída, use a opção --exclude_rule. Exemplo:

    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. Abra /tmp/workspacelog.txt e verifique se há operações não seguras.

O registro consiste em WorkspaceEvent mensagens que descrevem determinadas ações potencialmente não herméticas realizadas em um repository_ctx.

As ações que foram destacadas como potencialmente não herméticas são as seguintes:

  • execute: executa um comando arbitrário no ambiente host. Verifique se eles podem introduzir dependências no ambiente host.

  • download, download_and_extract: para garantir builds herméticos, verifique se o sha256 está especificado

  • file, template: isso não é não hermético em si, mas pode ser um mecanismo para introduzir dependências no ambiente host no repositório. Entenda de onde vem a entrada e se ela não depende do ambiente host.

  • os: isso não é não hermético em si, mas uma maneira fácil de receber dependências no ambiente host. Um build hermético geralmente não chama isso. Ao avaliar se o uso é hermético, lembre-se de que ele está sendo executado no host e não nos workers. Geralmente, não é uma boa ideia receber detalhes do ambiente do host para builds remotos.

  • symlink: isso é normalmente seguro, mas procure indicadores de alerta. Qualquer link simbólico para fora do repositório ou para um caminho absoluto causaria problemas no worker remoto. Se o link simbólico for criado com base nas propriedades da máquina host ele provavelmente também será problemático.

  • which: verificar programas instalados no host geralmente é problemático já que os workers podem ter configurações diferentes.