Compatibilidade de regras

Informar um problema Mostrar fonte Por noite · 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 na dois cenários a seguir:

  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 a versão atual ou mais antiga do LTS porque um recurso de que ele depende só está disponível nas versões mais recentes do LTS do Bazel.

Enquanto isso, a própria regra pode enviar alterações incompatíveis para seus usuários conforme muito bem. 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

Embora não seja obviamente viável garantir a compatibilidade entre todas versão do Bazel e de todas as versões da regra, nosso objetivo é garantir que o processo de migração continua sendo gerenciável para os usuários do Bazel. Uma migração gerenciável é definido como um processo em que os usuários não são forçados a atualizar o simultaneamente a versão principal da regra e a do Bazel. permitindo que os usuários lidem com alterações incompatíveis de uma fonte por vez.

Por exemplo, com a seguinte matriz de compatibilidade:

  • Migrar de rules_foo 1.x + Bazel 4.x para rules_foo 2.x + Bazel 5.x não é gerenciável, pois os usuários precisam fazer upgrade da versão principal regras_foo e 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 de 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 regras_foo 2.x regras_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 o Bazel em HEAD. Para isso, é possível
    • 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 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 o último LTS do Bazel compatível com a 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 com o modelo mais recente versão LTS do Bazel, os autores de regras podem:

  • Solicitar que recursos compatíveis com versões anteriores sejam transferidos para o LTS mais recente confira o processo de lançamento para mais detalhes.
  • Usar bazel_features para detectar 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.