MEP19: Integração Contínua #
Estado #
Concluído
Filiais e solicitações pull #
Resumo #
O matplotlib poderia se beneficiar de uma integração contínua melhor e mais confiável, tanto para testar quanto para criar instaladores e documentação.
Descrição detalhada #
Estado da arte atual #
teste
matplotlib atualmente usa Travis-CI para testes automatizados. Embora o Travis-CI deva ser elogiado pelo quanto faz como um serviço gratuito, ele tem várias deficiências:
Muitas vezes, falha devido a tempos limite de rede ao instalar dependências.
Muitas vezes falha por razões inexplicáveis.
os produtos de compilação ou teste só podem ser salvos da compilação de ramificações no repositório principal, não das solicitações pull; portanto, geralmente é difícil analisar "post mortem" o que deu errado. Isso é particularmente frustrante quando a falha não pode ser posteriormente reproduzida localmente.
Não é extremamente rápido. Os requisitos de CPU e memória do matplotlib para teste são muito maiores do que o projeto Python médio.
Ele testa apenas no Ubuntu Linux e temos apenas um controle mínimo sobre as especificidades da plataforma. Ele pode ser atualizado a qualquer momento fora de nosso controle, causando atrasos inesperados em momentos que podem não ser convenientes em nosso cronograma de lançamento.
No lado positivo, a integração do Travis-CI com o github -- testando automaticamente todas as solicitações pull pendentes -- é excepcional.
compilações
Não há esforço centralizado para compilações binárias automatizadas para matplotlib. No entanto, as seguintes coisas díspares estão sendo feitas [Se os autores mencionados aqui pudessem preencher em detalhes, isso seria ótimo!]:
@sandrotosi: constrói pacotes Debian
@takluyver: Tem compilações automatizadas do Ubuntu no Launchpad
@cgohlke: Faz compilações do Windows (não sei o quão automatizado isso é)
@r-owen: Faz compilações do OS-X (não sei o quão automatizado isso é)
Documentação
A documentação do main agora é construída por travis e carregada em https://matplotlib.org/devdocs/index.html
@NelleV, acredito, gera os documentos automaticamente e os publica na web para traçar o progresso do MEP10.
Peculiaridades do matplotlib #
matplotlib tem requisitos complexos que tornam o teste e a construção mais desgastantes do que muitos outros projetos Python.
O tempo de CPU para executar os testes é bastante alto. Isso nos coloca além das contas gratuitas de muitos serviços CI (por exemplo, ShiningPanda)
Ele possui um grande número de dependências e testar a matriz completa de todas as combinações é impraticável. Precisamos ser inteligentes sobre o espaço que testamos e garantimos o suporte.
Requisitos #
Esta seção descreve os requisitos que gostaríamos de ter.
Testar todas as solicitações pull conectando-se à API do GitHub, como Travis-CI faz
Teste em todas as principais plataformas: Linux, Mac OS-X, MS Windows (nessa ordem de prioridade, com base na pesquisa do usuário)
Retenha os últimos n dias de produtos de construção e teste, para auxiliar na depuração post-mortem.
Compilações binárias noturnas automatizadas, para que os usuários possam testar o que há de mais avançado sem instalar um ambiente de compilação completo.
Benchmarking automatizado. Seria bom ter um conjunto de benchmark padrão (separado dos testes) cujo desempenho pudesse ser rastreado ao longo do tempo, em diferentes back-ends e plataformas. Embora isso seja separado da construção e do teste, idealmente seria executado na mesma infraestrutura.
Criação e publicação noturna automatizada de documentação (ou como parte do teste, para garantir que os PRs não introduzam bugs na documentação). (Isso não substituiria a documentação estática para versões estáveis como padrão).
Os sistemas de teste devem ser gerenciados por vários desenvolvedores, para que nenhuma pessoa se torne um gargalo. (O design do Travis-CI faz isso bem - armazenar a configuração de compilação no repositório git, em vez de em outro lugar, é um design muito bom.)
Facilite o teste de uma matriz grande, mas esparsa, de diferentes versões das dependências do matplotlib. A pesquisa do usuário matplotlib fornece alguns bons dados sobre onde concentrar nossos esforços: https://docs.google.com/spreadsheets/d/1jbK0J4cIkyBNncnS-gP7pINSliNy9lI-N4JHwxlNSXE/edit
É bom ter: um design descentralizado para que aqueles com plataformas mais obscuras possam publicar os resultados da compilação em um painel central.
Implementação #
Esta parte ainda não foi escrita.
No entanto, idealmente, a implementação seria um serviço de terceiros, para evitar adicionar administração do sistema ao nosso tempo já estendido. Como temos alguns fundos doados, este serviço pode ser pago se oferecer vantagens significativas de economia de tempo em relação às ofertas gratuitas.
Compatibilidade com versões anteriores #
A compatibilidade com versões anteriores não é uma grande preocupação para este MEP. Vamos substituir as ferramentas e procedimentos atuais por algo melhor e jogar fora o antigo.
Alternativas #
Notas do Hangout #
Infraestrutura CI #
Nós gostamos de Travis e provavelmente continuará fazendo parte do nosso arsenal de qualquer maneira. Os problemas de confiabilidade estão sendo analisados.
Habilite uploads do Amazon S3 de produtos de teste no Travis. Isso ajudará com post-mortem de falhas (@mdboom está investigando isso agora).
Queremos cobertura para Mac. A melhor aposta é provavelmente pressionar Travis para ativá-lo em nosso projeto, pagando-lhes por uma conta Pro (já que eles não permitem testes no Linux e no Mac).
Queremos cobertura do Windows. Shining Panda é uma opção lá.
Investigue a descoberta ou construção de uma ferramenta que colete e sintetize os resultados do teste de várias fontes e publique-os no GitHub usando a API do GitHub. Isso pode ser de uso geral para a comunidade Scipy.
Tanto para Windows quanto para Mac, devemos documentar (ou melhor ainda, criar um script) o processo de configuração da máquina para uma compilação e como compilar binários e instaladores. Isso pode exigir a obtenção de informações de Russel Owen e Christoph Gohlke. Essa é uma etapa necessária para fazer compilações automatizadas, mas também seria valiosa por vários outros motivos.
A própria estrutura de teste #
Devemos investigar maneiras de fazer com que demore menos tempo
Eliminar testes redundantes, se possível
Melhorias gerais de desempenho para matplotlib ajudarão
Deveríamos estar cobrindo mais coisas, particularmente mais back-ends
Deveríamos ter mais testes de unidade, menos testes de integração, se possível