Como adicionar uma etapa de tempo limite ao Jenkins Pipeline

93

Quando você está usando um projeto de estilo livre, você pode definir que após 20 minutos a construção seja abortada se não for concluída. Como isso é possível com um projeto Jenkins Multi Branch Pipeline?

Devonte
fonte

Respostas:

187

Você pode usar a etapa de tempo limite :

timeout(20) {
  node {
    sh 'foo'
  }
}

Se precisar de um diferente TimeUnitde MINUTES , você pode fornecer o unitargumento:

timeout(time: 20, unit: 'SECONDS') {

EDITAR agosto de 2018: Hoje em dia, com os pipelines declarativos mais comuns (facilmente reconhecidos pela pipelineconstrução de nível superior ), os tempos limites também podem ser especificados usando optionsem diferentes níveis (por pipeline geral ou por estágio):

pipeline {
  options {
      timeout(time: 1, unit: 'HOURS') 
  }
  stages { .. }
  // ..
}

Ainda assim, se você deseja aplicar um tempo limite a uma única etapa em um pipeline declarativo, ele pode ser usado conforme descrito acima.

Stephen King
fonte
6
A referência também está disponível em 1. Jenkins Dashboard<qualquer projeto Pipeline> ▼ → Pipeline SyntaxStep Reference ou 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Step Reference .
Gerold Broser
2
É possível expirar apenas a parte de aquisição do nó e não contar o tempo gasto executando o conteúdo? Ou seja: às vezes os nós estão offline e eu quero uma maneira de o trabalho falhar se não puder adquirir um nó a tempo, em vez de tempo limite, mas não quero que o trabalho falhe se tiver adquirido o nó e estiver em execução.
Jake
Se você apenas deseja saber se o nó está online, você pode perguntar com: def n=Jenkins.instance.getNode("ETService3") if (n!=null && n.computer && n.computer.online) { echo "Online" } else { echo "Offline" // wait a little bit and try again }Uma maneira complicada é adquirir o nó duas vezes. A primeira vez com tempo limite externo, a segunda com tempo limite interno. Eu também estou perdendo o recurso.
elou
@Jake, isso deveria ser uma pergunta!
charlie_pl
1
Como você lança sua própria mensagem de erro quando o tempo limite expira?
red888
4

Para um Pipeline Declarativo , é aconselhável usar a etapa de tempo limite na seção de opções .

Executa o código dentro do bloco com um determinado limite de tempo. Se o limite de tempo for atingido, uma exceção (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) é lançada, o que leva ao aborto da compilação (a menos que seja capturado e processado de alguma forma). A unidade é opcional, mas o padrão é minutos.

A etapa de tempo limite tem 3 parâmetros que você pode configurar:

  • tempo (obrigatório, interno)

    • A quantidade de tempo limite, se nenhuma unidade tiver duração declarada em minutos
  • atividade (opcional, booleano)

    • Tempo limite após nenhuma atividade em logs para este bloco em vez de duração absoluta.
  • unidade (opcional, valores: NANOSSEGUNDOS, MICROSECONDOS, MILISSEGUNDOS, SEGUNDOS, MINUTOS, HORAS, DIAS)

    • A unidade para o tempo , o padrão é MINUTOS

Exemplos:

timeout(time: 10) // would lead to a timeout of 10 minutes (MINUTES is default value)
timeout(time: 10, unit: 'SECONDS') // a 10 seconds timeout
timeout(time: 10, activity: false, unit: 'MILLISECONDS')

A documentação oficial do Jenkins tem um exemplo muito bom para o uso de um tempo limite:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Michael Kemmerzell
fonte
2
activitytem falso como padrão. Quando activityé falso - tempo limite para todo o trabalho, truetempo limite para atividade (para imprimir qualquer coisa no log).
Maxim Suslov
Desejo adicionar timeoutpara um determinado estágio de forma que o estágio subsequente seja executado normalmente. No exemplo acima, o pipeline é abortado após o tempo limite e os estágios subsequentes não são executados. Existe uma maneira de cumprir meu requisito? Amostra de código para o tempo limite de um determinado estágio (do documento oficial Jenkins):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash,