Eu tenho lido um pouco sobre servidores de CI como Jenkins e estou me perguntando: em que momento é útil?
Porque certamente para um projeto minúsculo em que você teria apenas 5 classes e 10 testes de unidade, não há necessidade real.
Aqui temos cerca de 1500 testes de unidade e eles passam (em estações de trabalho antigas do Core 2 Duo) em cerca de 90 segundos (porque eles realmente estão testando "unidades" e, portanto, são muito rápidos). A regra que temos é que não podemos confirmar o código quando um teste falha.
Portanto, cada desenvolvedor lança todos os seus testes para impedir a regressão.
Obviamente, como todos os desenvolvedores sempre iniciam todos os testes, detectamos erros devido a alterações conflitantes assim que um desenvolvedor realiza a alteração de outro (quando houver).
Ainda não está muito claro para mim: devo configurar um servidor de IC como o Jenkins? O que isso traria?
É apenas útil para o ganho de velocidade? (não é um problema no nosso caso)
É útil porque construções antigas podem ser recriadas? (mas podemos fazer isso com o Mercurial, verificando antigas rotações)
Basicamente, entendo que pode ser útil, mas não consigo entender exatamente o porquê.
Qualquer explicação que leve em consideração os pontos que levantei acima seria bem-vinda.
fonte
Você provavelmente ainda não precisa de CI, mas acho que será útil quando você chegar à fase de teste. O Jenkins é configurado em poucas horas e simplificará seus testes e ajudará a evitar erros tolos (que acontecem especialmente quando você faz uma correção rápida na produção).
fonte
Para mim, um IC fica interessante se sua equipe tiver mais de um membro.
Você precisa parar de pensar no CI como "outro PC executando os testes para mim". IC sobre ter um processo de compilação definido e automatizado e gerenciamento de versão.
O IC é a entidade autorizada única que cria sua versão do software. Se não se baseia no IC, simplesmente não aconteceu.
Com um IC, você tem restrições para automatizar tudo o que mostrará todos os ajustes manuais, hacks e atalhos que você possui e simplesmente não funciona com um IC e deve ser evitado em primeiro lugar.
Problemas que evita:
Vantagens (muitas para mencionar tudo):
fonte
Há um problema fundamental sobre a integração contínua (IC) que é perfeitamente espelhado na sua pergunta: as práticas de IC são difíceis de implementar e defender, porque o software do servidor de CI não é trivial para configuração, nem é trivial para colocar seus projetos em execução por um IC servidor. Com isso, torna-se difícil realmente ver onde está o ganho em adotar o IC.
Antes de tudo, o IC trata de insight e qualidade. O bom IC aproxima você do seu projeto, fornece feedback adequado sobre métricas de qualidade, documentação, conformidade com os padrões de codificação etc. Ele deve fornecer as ferramentas para visualizar facilmente tudo isso e permitir que você reconheça e veja rapidamente associe um conjunto de alterações a um instantâneo específico de todas essas métricas do projeto.
Não se trata apenas de executar testes de unidade. De modo nenhum! O que me leva à qualidade. O IC adota erros, não os evita ou os joga fora. O que ele faz é simplesmente fornecer uma ferramenta para erros no início, em vez de mais tarde. Portanto, você realmente não confirma o código testado anteriormente em um servidor de IC. Embora você deva se esforçar para confirmar um código limpo e não quebrado, você realmente usa o servidor de IC para executar automaticamente um construtor de integração automaticamente através do seu código e avaliar se tudo deu certo. Se tiver, arrumado! Se não tiver, não há problema - as boas práticas de IC afirmam que sua próxima prioridade deve ser apenas corrigir o que está quebrado. O qual, em um bom servidor de CI, deve ser facilmente apontado para você.
À medida que o tamanho de uma equipe aumenta, a integração do código de todos naturalmente se torna mais difícil. Deveria ser tarefa de um servidor de IC centralizado testar todas as partes integradas e aliviar esse fardo dos membros da equipe. Portanto, você deve ter todos comprometidos o mais cedo possível (e da maneira mais limpa possível) e monitorando o status das compilações (geralmente há notificações envolvidas). E, novamente, se algo for quebrado por causa do comprometimento de algum desenvolvedor, torna-se imediatamente sua responsabilidade corrigir isso e recuperar essas construções automatizadas de volta ao status OK imediatamente.
Então você vê, na minha opinião, todo projeto se beneficia de ser continuamente integrado. O problema é que, até agora, e devido à complexidade incompreensível de cada servidor de CI que eu conheço, as pessoas realmente se opuseram às práticas de IC em projetos menores / mais simples. Porque, vamos lá, as pessoas têm coisas melhores a fazer do que passar dias configurando um software feio, excessivamente complexo, com entrega insuficiente e inchada.
Eu tive exatamente o mesmo problema, e foi isso que me levou a desenvolver o Cintient em meu tempo livre desde cerca de um ano atrás. Minha premissa era simplificar a instalação, a configuração e o uso, além de fornecer as métricas de qualidade que todos os demais praticamente falham ou fornecem de forma insuficiente. Então, após essa longa resposta, aparece meu ponto descarado de apontar o link do GitHub para o projeto (que é gratuito e de código aberto, natch). Ele também tem algumas imagens legais, aparentemente. :-) https://github.com/matamouros/cintient
Espero ter ajudado você.
(NOTA: Editado após o comentário de Bryan Oakley, sobre o fato de que eu deveria ter levado mais tempo para criar uma resposta melhor. Também acho que ele estava certo.)
fonte