Como executo, teste e encerro um servidor HTTP usando o Jenkins?

9

Estou trabalhando em uma equipe que está criando um serviço HTTP RESTful. Estamos tendo problemas para configurar um trabalho de CI do Jenkins que criará o serviço, executará em segundo plano, executará alguns testes e encerrará os servidores.

Específicos

  • O servidor é construído em Node.js usando o framework hapi e tem alguns testes unitários escritos em mocha.
  • Os testes são escritos em Java usando o Maven. (Por que não testes baseados em node.js? Porque nosso departamento de testes investiu tempo na criação de uma estrutura de teste REST baseada em Java).
  • A compilação deve falhar se os testes de unidade baseados em nó falharem ou se os testes de java falharem.
  • Nossa caixa Jenkins é gerenciada por uma equipe de suporte em outros locais da empresa; nossas construções são executadas em um escravo do Linux.

Tentativa atual

Temos algo desse tipo funcionando agora, mas não é confiável. Usamos 3 etapas de construção:

A primeira etapa de criação é uma etapa Execute Shell com os seguintes comandos:

npm install
npm test
node server.js ./test-config.json &

Em segundo lugar, fazemos uma etapa Invoke Maven 3 que aponta para o teste pom.xml .

E em terceiro lugar, executamos Invoke Standalone Sonar Analysis para fazer análise de código estático.

Isso funciona principalmente, mas dependemos do ProcessTreeKiller do Jenkins para interromper os serviços assim que o trabalho for concluído . Nós sempre recebemos os avisos dizendo: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+buildfor more information

Infelizmente, tivemos casos em que o serviço foi encerrado cedo demais (antes da conclusão dos testes) ou em que o serviço não foi encerrado (fazendo com que os builds subsequentes falhem porque a porta já está em uso).

Então, precisamos de algo mais confiável.

Falha na tentativa

Nós tentamos configurar um script de shell único que tratava de iniciar o serviço, executando maven, matando o serviço e, em seguida, exibindo um código de saída. Mas isso não funcionou porque o comando mvn não estava disponível na linha de comando. Nosso Jenkins tem várias versões maven disponíveis (e jdks também) e eu não sei onde eles moram nos escravos ou como chegar até eles sem usar a etapa de compilação Invoke Maven 3 .

Idéias

Brincamos com algumas ideias para resolver este problema, mas esperamos obter alguma orientação de outras pessoas que possam ter resolvido problemas semelhantes com o Jenkins.

  1. Ter o serviço terminado automaticamente após algum período de tempo. Problema é descobrir quanto tempo para deixá-los correr.
  2. Adicione uma etapa de criação para eliminar os serviços depois que terminarmos. O problema é que, se a execução do maven falhar, as etapas subsequentes não serão executadas. (E se dissermos ao maven para ignorar as falhas do teste, então a compilação não será quebrada se falharem.)
  3. Tente matar qualquer processo de serviço existente como a primeira e a última etapas da construção. O problema é que outras equipes também usam esses escravos Jenkins, então precisamos garantir que o serviço seja encerrado quando terminarmos nossa construção.
  4. Inicie e pare os serviços node.js via Maven fazendo algo como este blog sugere . O problema é que não sabemos se Jenkins identificará a tarefa em segundo plano gerada como um "descritor de arquivo vazado" e a eliminará antes de terminarmos o teste.

Seria bom se Jenkins tivesse uma "ação de pós-compilação" que permitisse que você executasse um script de limpeza. Ou se tivesse uma etapa de compilação "Executar processo em segundo plano" que mataria os itens de plano de fundo no final da compilação. Mas não consigo encontrar nada assim.

Alguém conseguiu fazer o Jenkins fazer algo remotamente assim?

    
por Allan 15.04.2014 в 21:57
fonte

1 resposta

3

Alguns brainstorming:

  • Você pode desativar o Jenkins ProcessTreeKiller, globalmente ou por chamada. Não sei por que isso não é uma opção para você.

  • Em resposta ao item 2, várias opções:

    1. As ações pós-compilação são executadas independentemente se as etapas de compilação falharam ou não. Essa seria uma ótima maneira de acionar uma tarefa de "limpeza de serviço" que será executada independentemente do estado de compilação.
    2. Você pode configurar qualquer etapa de compilação como ação de pós-compilação, usando Qualquer Construir Passo , ou você pode usar Post Build Tasks , o último ainda oferece opções para definir critérios de acionamento.
  • Você pode alterar o estado de compilação com base nos critérios RegEx usando Text Plugin -finder

  • Você pode configurar Etapas de criação condicional . A "condição" pode até ser resultado de alguma execução de script

por Slav 17.04.2014 / 15:47
fonte