Preciso de ajuda com a filosofia e o design de uma instalação de integração contínua.
Nossa configuração atual de IC usa o buildbot. Quando comecei a projetá-lo, herdei (bem, não estritamente, porque eu estava envolvido no design dele um ano antes) um construtor de CI sob medida que foi adaptado para executar toda a compilação de uma só vez, durante a noite. Depois de um tempo, decidimos que isso era insuficiente e começamos a explorar diferentes estruturas de IC, eventualmente escolhendo o buildbot. Um dos meus objetivos na transição para o buildbot (além de aproveitar todos os extras do whiz-bang) era superar algumas das inadequações do nosso construtor noturno sob medida.
Humor-me por um momento, e deixe-me explicar o que eu herdei. A base de código da minha empresa é quase 150 aplicativos Windows c ++ exclusivos, cada um com dependências em uma ou mais de uma dúzia de bibliotecas internas (e muitas também em bibliotecas de terceiros). Algumas dessas bibliotecas são interdependentes e têm aplicativos dependentes que (embora não tenham nada a ver um com o outro) precisam ser construídos com a mesma construção dessa biblioteca. Metade desses aplicativos e bibliotecas são considerados "herdados" e não portáveis e devem ser construídos com várias configurações distintas do compilador IBM (para o qual escrevi subclasses exclusivas de Compile
), e a outra metade é criada com o visual studio.ShellCommand
s, pois não há suporte para o VSS).
Nosso construtor noturno original simplesmente retirou a fonte de tudo e construiu as coisas em uma determinada ordem. Não havia como criar apenas um único aplicativo, escolher uma revisão ou agrupar coisas. Ele lançaria máquinas virtuais para criar vários aplicativos. Não era muito robusto, não era distribuível. Não era terrivelmente extensível. Eu queria ser capaz de superar todas essas limitações no buildbot.
A maneira como eu fiz isso originalmente foi criar entradas para cada um dos aplicativos que desejávamos criar (todos eles são 150), criar agendadores acionados que pudessem criar vários aplicativos como grupos e, em seguida, incluir esses grupos em um agendador noturno geral. Eles poderiam ser executados em escravos dedicados (sem mais trapaceiros de máquinas virtuais) e, se eu quisesse, poderia simplesmente adicionar novos escravos. Agora, se queremos fazer uma compilação completa fora do cronograma, é apenas um clique, mas também podemos criar apenas um aplicativo, se assim o desejarmos.
Existem quatro pontos fracos dessa abordagem, no entanto. Uma é a complexa rede de dependências da nossa árvore de fontes. Para simplificar a manutenção da configuração, todos os construtores são gerados a partir de um dicionário grande. As dependências são recuperadas e construídas de uma maneira não muito robusta (ou seja, interromper certas coisas no meu dicionário de construção de destino). A segunda é que cada compilação possui entre 15 e 21 etapas de compilação, o que é difícil de navegar e observar na interface da web e, como existem cerca de 150 colunas, leva uma eternidade para carregar (pense em 30 segundos a vários minutos). Em terceiro lugar, não temos mais a descoberta automática de alvos de criação (embora, por mais que um dos meus colegas de trabalho me fale sobre isso, não vejo o que isso nos levou). Finalmente,
Agora, mudando para um novo desenvolvimento, estamos começando a usar o g ++ e o subversion (não portando o repositório antigo, lembre-se - apenas para as novidades). Além disso, estamos começando a fazer mais testes de unidade ("mais" pode dar uma imagem errada ... é mais como qualquer outro ) e testes de integração (usando python). Estou tendo dificuldade em descobrir como encaixá-los na minha configuração existente.
Então, onde eu errei filosoficamente aqui? Como posso avançar da melhor maneira (com buildbot - é a única peça do quebra-cabeça em que tenho licença para trabalhar), para que minha configuração seja realmente mantida? Como abordar algumas das fraquezas do meu design? O que realmente funciona em termos de estratégias de IC para grandes bases de códigos (possivelmente super) complexas?
EDITAR:
Pensei ter explicado meu problema, mas obviamente não estava suficientemente claro. Estou não à procura de sugestões para alterar plataformas CI. Isso não vai acontecer, e respostas sugerindo que não serão aceitas. O que eu quero saber é como outras pessoas gerenciam bases de código complicadas usando o CI. Tenho uma dúzia de produtos diferentes ao quadrado , e tenho dependências espalhadas pelo vento, e todas são diferentes. É com isso que quero saber como lidar.