2016-04-05 11 views
36

Mam Jenkinsfile z wieloma etapami i jednym z nich jest w rzeczywistości inne zadanie (wdrożenie), które może nie udać się w niektórych przypadkach.Jak zaimplementować opcję ponowienia dla nieudanych etapów w rurociągach Jenkins?

Wiem, że mogę wyświetlać podpowiedzi przy użyciu Jenkinsfile, ale tak naprawdę nie wiem, jak zaimplementować mechanizm ponawiania dla tego zadania.

Chcę móc kliknąć na nieudanym etapie i wybrać, aby spróbować ponownie. jenkins-pipelines-with-stages

+1

To ogólne żądanie dotyczące funkcji znajduje się pod adresem [JENKINS-33846] (https://issues.jenkins-ci.org/browse/JENKINS-33846). To (z rozczarowaniem) jest wybrane tylko dla deklaratywnych potoków w [JENKINS-45455] (https://issues.jenkins-ci.org/browse/JENKINS-45455). – mkobit

Odpowiedz

22

Powinieneś być w stanie połączyć powtórzenie + Wejście tego robić coś w tym

stage('deploy-test') { 
    try { 
    build 'yourJob' 
    } catch(error) { 
    echo "First build failed, let's retry if accepted" 
    retry(2) { 
     input "Retry the job ?" 
     build 'yourJob' 
    } 
    } 
} 

można też użyć limitu czasu dla wejścia, jeśli chcesz, aby zakończyć, jeśli nikt nie sprawdza. Istnieje również waitUntil, które mogą być przydatne, ale nie używał go jeszcze

Edit: WaitUntil wydaje się zdecydowanie najlepiej, należy grać z nim trochę, ale coś w tym jest czystsze:

stage('deploy-test') { 
    waitUntil { 
    try { 
     build 'yourJob' 
    } catch(error) { 
     input "Retry the job ?" 
     false 
    } 
    } 
} 

Nawiasem mówiąc, tutaj znajduje się dokumentacja wszystkich tych kroków. https://jenkins.io/doc/pipeline/steps

+0

Czy pojawi się monit o ponowienie próby? Wątpię. – sorin

+0

O nie, masz rację. zaktualizuję na to moją odpowiedź! – fchaillou

+1

Czy jest możliwe włączenie limitu czasu tylko dla części ponownej próby? Mogę chcieć mieć inny czas oczekiwania na pracę. Nie przyjąłem jeszcze odpowiedzi, ponieważ nie uważam pracy blokującej za dobre rozwiązanie. Najlepiej byłoby, gdyby opcja ponowienia była już po zakończeniu zadania. Wyobraź sobie, że ta praca jest wyzwalana przez hak GitHub na PR. Wolałbym zobaczyć błąd w GitHub zamiast braku odpowiedzi w przypadku błędu. – sorin

2

Ten punkt kontrolny (nie mój) był jedną z lepszych opcji, które znalazłem podczas próby wdrożenia tej funkcji. https://gist.github.com/beercan1989/b66b7643b48434f5bdf7e1c87094acb9

Zmieniono go na metodę w bibliotece współdzielonej, która po prostu ponowił lub przerwała moje potrzeby. Dodano także maksymalną liczbę ponownych prób i zmienną timeout, abyśmy mogli ją zmienić w zależności od zadania lub etapu, który tego potrzebuje.

package com.foo.bar.jenkins 

def class PipelineHelper { 
    def steps 

    PipelineHelper(steps) { 
     this.steps = steps 
    } 

    void retryOrAbort(final Closure<?> action, int maxAttempts, int timeoutSeconds, final int count = 0) { 
     steps.echo "Trying action, attempt count is: ${count}" 
     try { 
      action.call(); 
     } catch (final exception) { 
      steps.echo "${exception.toString()}" 
      steps.timeout(time: timeoutSeconds, unit: 'SECONDS') { 
       def userChoice = false 
       try { 
        userChoice = steps.input(message: 'Retry?', ok: 'Ok', parameters: [ 
          [$class: 'BooleanParameterDefinition', defaultValue: true, description: '', name: 'Check to retry from failed stage']]) 
       } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) { 
        userChoice = false 
       } 
       if (userChoice) { 
        if (count <= maxAttempts) { 
         steps.echo "Retrying from failed stage." 
         return retryOrAbort(action, maxAttempts, timeoutMinutes, count + 1) 
        } else { 
         steps.echo "Max attempts reached. Will not retry." 
         throw exception 
        } 
       } else { 
        steps.echo 'Aborting' 
        throw exception; 
       } 
      } 
     } 
    } 
} 

Przykładowe użycie z maksymalnie 2 ponownymi próbami, które czekają na 60s dla danych wejściowych.

Pamiętaj tylko, aby umieścić węzły wewnątrz zamknięcia, aby oczekiwanie na dane wejściowe nie blokowało executora.

Jeśli masz płatne przedsiębiorstwo Jenkins, Cloudbees ma wtyczkę Checkpoint, która może lepiej sobie z tym poradzić, ale nie planuje się jej wydania dla open source Jenkins (JENKINS-33846).

Powiązane problemy