Como definir o `killSoftly` para um trabalho específico do Jenkins?

11

Minha compilação Jenkins trava entre as etapas de compilação e pós-compilação.

A saída do console mostra que há uma espera de 6 minutos (mas já vi esperas de até uma hora):

10:53:26 BUILD FAILED in 1m 7s
10:53:26 4 actionable tasks: 4 executed
10:53:26 Build step 'Invoke Gradle script' changed build result to FAILURE
10:53:26 Build step 'Invoke Gradle script' marked build as failure
11:09:29 [CucumberReport] Using Cucumber Reports version 4.9.0

Eu encontrei este e este perguntas que têm problemas semelhantes, e eles dizem que a solução é a criação -DSoftKillWaitSeconds=0em jenkins.xml.

No entanto, eu preciso de uma maneira de definir a opção apenas para trabalhos específicos, sem mexer nas configurações globais do Jenkins (eu não gostaria de mexer com outros projetos).

EDITAR:

Quando abro manualmente o trabalho, antes da etapa [CucumberReport], os relatórios de pepino ainda são gerados.

Eu também verificado abortar a construção se é preso caixa em opções de compilação meio ambiente, com Timeout estratégia definida para No Activity(timeout segundos = 2).

Quando crio o projeto com essas configurações, a compilação falhará com "Abortado após 0 segundos", mostrado no Histórico da compilação, como antes, mas a saída do console será a mesma. (Nada muda, os Relatórios de pepino serão gerados, mas após um certo tempo limite).

Mate Mrše
fonte
O que você deseja alcançar com o parâmetro? Talvez haja uma solução mais fácil para isso.
Michael Kemmerzell
Quero reduzir o tempo de espera após a fase de compilação. Como você pode ver na saída do console, há uma espera de 6 minutos entre as etapas de compilação e pós-compilação.
Mate Mrše
Você pode fornecer algumas partes do seu pipeline? Duvido que Jenkins esteja simplesmente preso - algo tem que acontecer aqui.
Michael Kemmerzell
Você pode ser mais específico sobre quais partes do pipeline seriam de interesse para que eu possa editar e compartilhar algumas porque não consigo compartilhar o código real?
Mate Mrše
Você não pode simplesmente definir uma timeoutopção no seu pipe? Você definitivamente deve publicar uma versão simplificada do seu pipe. É difícil "adivinhar" o que pode estar errado. Além disso, esta pergunta provavelmente é mais adequada para estar em devops.stackexchange.com
tftd

Respostas:

4

Não é possível selecionar um valor específico para o trabalhoSoftKillWaitSeconds (o valor é derivado do núcleo Jenkins em um ponto em que o nome do trabalho não é conhecido).

Minha recomendação é corrigir o tratamento de cancelamento no seu trabalho , para que não dependa de um "tempo limite de interrupção suave". Se você estiver executando em um sistema Unix-ish, poderá garantir isso executando seu trabalho em um novo grupo de processos ( set -mno bash) e (por exemplo) configurando uma interceptação de saída adequada.

Alex O
fonte
Como eu sou novo na Jenkins, você poderia expandir a "execução do seu trabalho em um novo grupo de processos (definir -m no bash) e (por exemplo) configurar uma armadilha de saída adequada"?
Mate Mrše
Isso não tem relação com Jenkins em si. Você pode usar essa abordagem se o seu trabalho envolver uma etapa de construção "Executar shell" (ou se você puder alterá-la). Em seguida, use "set -m" para criar um novo grupo de processos e use uma armadilha como mostrado aqui para garantir que todos os processos no grupo sejam mortos.
Alex O
3

Estamos usando o plug-in Build-timeout para eliminar trabalhos bloqueados com a estratégia de tempo limite definida como No Activityou Absolute. Para mim, essa é uma boa abordagem quando você usa projetos de estilo livre. O motivo pelo qual sua compilação é "interrompida após 0 segundos" é que provavelmente há processos filhos inacabados. Da documentação :

Como o Java permite apenas que os encadeamentos sejam interrompidos em um conjunto de locais fixos, dependendo de como uma construção trava, a operação de cancelamento pode não ter efeito. Por exemplo,

  • se Jenkins estiver aguardando a conclusão dos processos filhos, ele poderá ser cancelado imediatamente.
  • se Jenkins estiver preso em um loop infinito, nunca poderá ser abortado.
  • se o Jenkins estiver executando uma E / S de rede ou de arquivo na Java VM (como cópia longa do arquivo ou atualização do SVN), ela não poderá ser abortada.

Você pode tentar a estratégia de tempo limite absoluto. Você pode definir uma variável global para não repetir o valor do tempo limite nos trabalhos:

  1. Vá para "Gerenciar Jenkins"> "Configurar sistema".
  2. Marque "Variáveis ​​de ambiente" em "Propriedades globais".
  3. Adicione uma variável de ambiente name = "GLOBAL_TIMEOUT_MINUTES" value = "20".
  4. Vá para a página de configuração de um projeto.
  5. Marque "Interrompa a compilação se estiver travada" em "Ambiente de compilação".
  6. Selecione "Absoluto" para "Estratégia de tempo limite". Claro, também aplicável a outras estratégias.
  7. Defina "$ {GLOBAL_TIMEOUT_MINUTES}" para "Tempo limite".
  8. Defina a ação de tempo limite "Interromper a compilação".

Se isso não estiver funcionando, você pode tentar procurar nos logs https: // your-jenkins-server / log ou em um despejo de encadeamento.
A interrupção pode ser causada pela versão nova / antiga de um plug-in. Tente descobrir quais são os processos filho inacabados. Tente desativar as ações pós-compilação uma a uma para encontrar a que pode ser a causa do problema. Você pode ver /superuser/1401879/debugging-what-happens-when-a-jenkins-build-unexpectedly-pauses-or-hangs

KB
fonte
Votado para obter informações úteis, no entanto, não resolve o meu problema. Eu já tentei construir o plug-in de tempo limite, mas sem sucesso.
Mate Mrše 13/01