Tenho lidado com o problema de escalonamento de CI na minha empresa e, ao mesmo tempo, tentando descobrir qual abordagem tomar quando se trata de CI e várias filiais. Há uma questão semelhante em stackoverflow, Multiple feature branches e integração contínua . Comecei um novo porque gostaria de obter mais discussão e fornecer algumas análises sobre a questão.
Até agora descobri que existem 2 abordagens principais que posso adotar (ou talvez algumas outras ???).
- Vários conjuntos de trabalhos (falando sobre Jenkins / Hudson aqui) por filial
- Escreva ferramentas para gerenciar os trabalhos extras
- Criar / modificar / excluir trabalhos em massa
- Configurações personalizadas para cada trabalho por filial (url SCM, duplicações de repositórios de gerenciamento de depósito)
- Alguns exemplos de pessoas lidando com esse problema com ferramentas shell, scripts de formigas e Jenkins CLI. Vejo:
- http://jenkins.361315.n4.nabble.com/Multiple-branches-best-practice-td2306578.html
- http://jenkins.361315.n4.nabble.com/Is-it-possible-to-handle-multiple-branches-where-some-jobs-should-run-on-each-one-without-duplicatin-td954729. html
- http://jenkins.361315.n4.nabble.com/Parallel-development-with-branches-td1013013.html
- Configurar ou criar um trabalho hudson automaticamente
- Irá causar mais carga no seu cluster CI
- O ciclo de feedback para desenvolvedores fica lento (se a infraestrutura não puder lidar com a nova carga)
- Escreva ferramentas para gerenciar os trabalhos extras
- Vários conjuntos de trabalhos por 2 ramos (dev e estável)
- Gerenciar os dois conjuntos manualmente (se você alterar a configuração de um trabalho, certifique-se de alterar no outro ramo)
- PITA, mas pelo menos tão poucos para gerenciar
- Outros branches extras não terão um conjunto de testes completo antes de serem enviados para o dev
- Devs insatisfeitos. Por que um desenvolvedor deveria se preocupar com problemas de escala de CI? Ele tem um pedido simples, quando eu ramificar gostaria de testar meu código. Simples.
- Gerenciar os dois conjuntos manualmente (se você alterar a configuração de um trabalho, certifique-se de alterar no outro ramo)
Então, parece que se eu quiser fornecer aos desenvolvedores CI para seus próprios branches personalizados, preciso de ferramentas especiais para Jenkins (API ou shellscripts ou algo assim?) E lidar com o dimensionamento. Ou posso dizer a eles para mesclar com mais frequência ao DEV e viver sem CI em branches personalizados. Qual você escolheria ou existem outras opções?
fonte
Eu criaria trabalhos separados para cada filial. Já fiz isso antes e não é difícil de gerenciar e configurar se você configurou Hudson / Jenkins corretamente. Uma maneira rápida de criar vários trabalhos é copiar de um trabalho existente que tenha requisitos semelhantes e modificá-los conforme necessário. Não tenho certeza se você deseja permitir que cada desenvolvedor configure seus próprios trabalhos para seus próprios ramos, mas não é muito trabalho para uma pessoa (ou seja, um gerente de compilação) gerenciar. Uma vez que as ramificações personalizadas foram mescladas em ramificações estáveis, os trabalhos correspondentes podem ser removidos quando não forem mais necessários.
Se estiver preocupado com a carga no servidor de CI, você pode configurar instâncias separadas do CI ou mesmo escravos separados para ajudar a equilibrar a carga em vários servidores. Certifique-se de que o servidor em que está executando o Hudson / Jenkins é adequado. Eu usei o Apache Tomcat e apenas tive que garantir que ele tivesse memória e capacidade de processamento suficientes para processar a fila de construção.
É importante deixar claro o que você deseja alcançar usando CI e então descobrir uma maneira de implementá-lo sem muito esforço manual ou duplicação. Não há nada de errado em usar outras ferramentas externas ou scripts que são executados por seu servidor de CI que ajudam a simplificar seu processo geral de gerenciamento de build.
fonte
Eu escolheria dev + branches estáveis. E se você ainda quer ramificações personalizadas e tem medo da carga, então por que não mover essas ramificações personalizadas para a nuvem e deixar que os desenvolvedores gerenciem eles mesmos, por exemplo http://cloudbees.com/dev.cb Esta é a empresa onde Kohsuke está agora . Há um Eclipse Tooling também, então se você estiver no Eclipse, você o terá totalmente integrado ao dev env.
fonte
Na verdade, o que é realmente problemático é o isolamento de construção com ramificações de recursos. Em nossa empresa, temos um conjunto de projetos maven separados, todos parte de uma distribuição maior. Esses projetos são mantidos por equipes diferentes, mas para cada distribuição, todos os projetos precisam ser liberados. Uma featurebranch agora pode se sobrepor de um projeto a outro e é aí que o isolamento da construção fica doloroso. Existem várias soluções que tentamos:
Na verdade, a última solução é a mais promissora. Todas as outras soluções carecem de uma ou de outra forma. Junto com o plugin job-dsl, é fácil configurar um novo branch de recurso. simplesmente copie e cole o script bacana, adapte os ramos e deixe o trabalho inicial criar os novos trabalhos. Certifique-se de que a tarefa de propagação remova tarefas não gerenciadas. Em seguida, você pode escalar facilmente com ramificações de recursos em diferentes projetos de maven.
Mas, como Tom disse bem acima, seria melhor superar a necessidade de branches de recursos e ensinar os desenvolvedores a integrar de forma limpa, mas esse é um processo mais longo e o resultado não é claro com muitas partes do sistema legado que você não vai tocar mais.
meus 2 centavos
fonte