Compatibilidade de regras

Informar um problema Ver código-fonte Nightly · 7.4 . 7,3 · 7.2 · 7,1 · 7,0 · 6,5

As regras do Bazel Starlark podem interromper a compatibilidade com as versões LTS do Bazel nos seguintes dois cenários:

  1. A regra quebra a compatibilidade com versões futuras do LTS porque um recurso depende é removido do Bazel em HEAD.
  2. A regra quebra a compatibilidade com as versões LTS atuais ou mais antigas porque um recurso em que ela depende está disponível apenas nas versões LTS mais recentes do Bazel.

Enquanto isso, a própria regra também pode enviar mudanças incompatíveis para os usuários. Quando combinado com alterações interruptivas no Bazel, atualizar a versão da regra e essa versão do Bazel é motivo de frustração para os usuários. Isso aborda como os autores de regras devem manter a compatibilidade de regras com o Bazel para facilitam o upgrade do Bazel e das regras para os usuários.

Processo de migração gerenciável

Obviamente, não é viável garantir a compatibilidade entre todas as versões do Bazel e da regra, mas nosso objetivo é garantir que o processo de migração continue gerenciável para os usuários do Bazel. Um processo de migração gerenciável é definido como um processo em que os usuários não são forçados a atualizar a versão principal da regra e a versão principal do Bazel simultaneamente, permitindo que os usuários processem mudanças incompatíveis de uma fonte por vez.

Por exemplo, com a seguinte matriz de compatibilidade:

  • A migração de rules_foo 1.x + Bazel 4.x para rules_foo 2.x + Bazel 5.x não é considerada gerenciável, porque os usuários precisam fazer upgrade da versão principal de rules_foo e do Bazel ao mesmo tempo.
  • Migrar de rules_foo 2.x + Bazel 5.x para rules_foo 3.x + Bazel 6.x é é considerada gerenciável, já que os usuários podem primeiro fazer upgrade do rules_foo de 2.x para 3.x sem alterar a versão principal do Bazel, depois fazer upgrade do Bazel da 5.x para a versão 5.x. 6.x.
regras_foo 1.x rules_foo 2.x rules_foo 3.x HEAD
Bazel 4.x
Bazel 5.x
Bazel 6.x
HEAD

❌: Nenhuma versão da versão da regra principal é compatível com o LTS do Bazel. lançamento.

✅: pelo menos uma versão da regra é compatível com a versão mais recente do Versão LTS do Bazel.

Práticas recomendadas

Como autores de regras do Bazel, você pode garantir um processo de migração gerenciável para os usuários seguindo estas práticas recomendadas:

  1. A regra deve seguir Semântica Controle de versão: versões secundárias do mesmo principal são compatíveis com versões anteriores.
  2. A regra em HEAD deve ser compatível com a versão mais recente do LTS do Bazel.
  3. A regra em HEAD deve ser compatível com Bazel em HEAD. Para isso,
    • Configurar seus próprios testes de CI com o Bazel em HEAD
    • Adicione seu projeto ao Bazel downstream testing; a equipe do Bazel registra problemas no seu projeto se houver alterações interruptivas nele. afetar seu projeto, e você deve seguir nosso projeto downstream políticas resolver problemas rapidamente.
  4. A versão principal mais recente da regra precisa ser compatível com a versão mais recente Versão LTS do Bazel.
  5. Uma nova versão principal da regra precisa ser compatível com a última versão do Bazel LTS com suporte da versão principal anterior da regra.

Atingir 2. e 3. é a tarefa mais importante, porque permite alcançar 4. e 5) naturalmente.

Para facilitar a manutenção da compatibilidade com o Bazel no HEAD e a versão mais recente do Bazel LTS, os autores de regras podem:

  • Solicite que recursos com compatibilidade com versões anteriores sejam transferidos para a versão LTS mais recente. Confira o processo de lançamento para mais detalhes.
  • Use bazel_features para fazer a detecção de recursos do Bazel.

Em geral, com as abordagens recomendadas, é possível migrar as regras para O Bazel é incompatível com mudanças e os novos recursos dele são usados no HEAD sem que sejam usados. descartando a compatibilidade com a versão mais recente do LTS do Bazel.