Como chamar o Bazel usando scripts

É possível chamar o Bazel de scripts para realizar uma build, executar testes ou consultar o gráfico de dependência. O Bazel foi projetado para permitir a criação de scripts eficazes, mas esta seção lista alguns detalhes a serem considerados para tornar seus scripts mais robustos.

Como escolher a base de saída

A opção --output_base controla onde o processo do Bazel grava as saídas de um build, bem como vários arquivos de trabalho usados internamente pelo Bazel. Um deles é um bloqueio que protege contra mutações simultâneas da base de saída por vários processos do Bazel.

Escolher o diretório base de saída correto para seu script depende de vários fatores. Se você precisar colocar as saídas de build em um local específico, isso vai determinar a base de saída que você precisa usar. Se você estiver fazendo uma chamada "somente leitura" para o Bazel (como bazel query), os fatores de bloqueio serão mais importantes. Em particular, se você precisar executar várias instâncias do script simultaneamente, saiba que cada processo do servidor Blaze pode processar no máximo uma invocação por vez. Dependendo da sua situação, pode ser interessante que cada instância do script espere a vez ou usar --output_base para executar vários servidores Blaze.

Se você usar o valor padrão da base de saída, vai disputar o mesmo bloqueio usado pelos comandos interativos do Bazel do usuário. Se o usuário emitir comandos de longa duração, como builds, seu script terá que esperar a conclusão desses comandos antes de continuar.

Observações sobre o modo de servidor

Por padrão, o Bazel usa um processo de servidor de longa duração como uma otimização. Ao executar o Bazel em um script, não se esqueça de chamar shutdown quando terminar de usar o servidor ou especifique --max_idle_secs=5 para que servidores ociosos sejam desligados imediatamente.

Qual código de saída vou receber?

O Bazel tenta diferenciar falhas devido ao código-fonte em consideração de erros externos que impedem a execução adequada do Bazel. A execução do Bazel pode resultar nos seguintes códigos de saída:

Códigos de saída comuns a todos os comandos:

  • 0: sucesso
  • 2: problema na linha de comando, flags ou combinação de comandos incorretas ou ilegais ou variáveis de ambiente incorretas. Sua linha de comando precisa ser modificada.
  • 8: o build foi interrompido, mas encerramos com um desligamento ordenado.
  • 9: o bloqueio do servidor foi mantido e --noblock_for_lock foi transmitido.
  • 32: falha no ambiente externo não nesta máquina.

  • 33: o Bazel ficou sem memória e falhou. Você precisa modificar a linha de comando.

  • 34: reservado para uso interno do Google.

  • 35: reservado para uso interno do Google.

  • 36 - Problema ambiental local, suspeita de ser permanente.

  • 37 - Exceção não processada / erro interno do Bazel.

  • 38: erro temporário ao publicar resultados no serviço de eventos de build.

  • 39 - Os blobs exigidos pelo Bazel são removidos do cache remoto.

  • 41-44: reservado para uso interno do Google.

  • 45: erro persistente ao publicar resultados no serviço de eventos de build.

  • 47: reservado para uso interno do Google.

  • 49: reservado para uso interno do Google.

Códigos de retorno para comandos bazel build, bazel test:

  • 1: falha na criação.
  • 3 - Build OK, but some tests failed or timed out.
  • 4 - O build foi concluído, mas nenhum teste foi encontrado, mesmo que o teste tenha sido solicitado.

Para bazel run:

  • 1: falha na criação.
  • Se o build for bem-sucedido, mas o subprocesso executado retornar um código de saída diferente de zero, esse será o código de saída do comando também.

Para bazel query:

  • 3: sucesso parcial, mas a consulta encontrou um ou mais erros no conjunto de arquivos BUILD de entrada. Portanto, os resultados da operação não são 100% confiáveis. Isso provavelmente ocorre devido a uma opção --keep_going na linha de comando.
  • 7: falha no comando.

Versões futuras do Bazel podem adicionar outros códigos de saída, substituindo o código de saída de falha genérica 1 por um valor diferente de zero com um significado específico. No entanto, todos os valores de saída diferentes de zero sempre constituirão um erro.

Como ler o arquivo .bazelrc

Por padrão, o Bazel lê o arquivo .bazelrc do diretório de espaço de trabalho base ou do diretório inicial do usuário. Se isso é desejável ou não é uma escolha para seu script. Se ele precisar ser perfeitamente hermético (como ao fazer builds de lançamento), desative a leitura do arquivo .bazelrc usando a opção --bazelrc=/dev/null. Se você quiser realizar um build usando as configurações preferidas do usuário, o comportamento padrão será melhor.

Registro de comando

A saída do Bazel também está disponível em um arquivo de registro de comandos que pode ser encontrado com o seguinte comando:

bazel info command_log

O arquivo de registros de comando contém os fluxos stdout e stderr intercalados do comando Bazel mais recente. Executar bazel info vai substituir o conteúdo desse arquivo, já que ele se torna o comando mais recente do Bazel. No entanto, o local do arquivo de registro de comandos não vai mudar, a menos que você altere a configuração das opções --output_base ou --output_user_root.

Analisando a saída

A saída do Bazel é fácil de analisar para muitas finalidades. Duas opções que podem ser úteis para seu script são --noshow_progress, que suprime mensagens de progresso, e --show_result n, que controla se as mensagens "build up-to-date" são impressas ou não. Essas mensagens podem ser analisadas para descobrir quais destinos foram criados com sucesso e o local dos arquivos de saída criados. Especifique um valor muito grande de n se você depender dessas mensagens.

Solução de problemas de desempenho por criação de perfil

Consulte a seção Criação de perfis de desempenho.