2016-12-01 14 views
7

W naszej pracy z Jenkins Pipeline mamy kilka etapów i chciałbym, aby którykolwiek z etapów się nie udał, a następnie aby zatrzymać budowanie i nie kontynuować dalszych etapów.Zatrzymanie pracy z rurociągiem jenkins wcześnie

Oto przykład jednego z etapów:

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
    if (result != 0) { 
     echo '[FAILURE] Failed to build' 
     currentBuild.result = 'FAILURE' 
    } 
} 

skrypt nie zadziała, a wynik kompilacji zostanie zaktualizowany, ale zadanie kontynuowane na kolejnych etapach. Jak mogę przerwać lub przerwać pracę, gdy tak się stanie?

Odpowiedz

7

Zasadniczo to właśnie robi krok sh. Jeśli nie uchwycić wynik w zmiennej, można po prostu uruchomić:

sh "./build" 

to wyjdzie, jeśli skrypt reurns niezerowy kod zakończenia.

Jeśli trzeba robić rzeczy, po pierwsze, i trzeba uchwycić efekt, można użyć kroku powłoki rzucić tę pracę

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
    if (result != 0) { 
     echo '[FAILURE] Failed to build' 
     currentBuild.result = 'FAILURE' 
     // do more stuff here 

     // this will terminate the job if result is non-zero 
     // You don't even have to set the result to FAILURE by hand 
     sh "exit ${result}" 
    } 
} 

Ale dodaje daje to samo, ale wydaje się bardziej rozsądny do do

stage('Building') { 
    try { 
     sh './build.sh' 
    } finally { 
     echo '[FAILURE] Failed to build' 
    } 
} 

Możliwe jest również wywoływanie zwrotu w kodzie. Jeśli jednak znajdujesz się wewnątrz stage, powróci on tylko z tego etapu. Więc

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
    if (result != 0) { 
     echo '[FAILURE] Failed to build' 
     currentBuild.result = 'FAILURE' 
     return 
    } 
    echo "This will not be displayed" 
} 
echo "The build will continue executing from here" 

przyzwyczajenie zakończyć pracę, ale

stage('Building') { 
    def result = sh returnStatus: true, script: './build.sh' 
} 
if (result != 0) { 
    echo '[FAILURE] Failed to build' 
    currentBuild.result = 'FAILURE' 
    return 
} 

wola.

3

Innym sposobem na osiągnięcie tego zachowania jest wyrzucenie wyjątku. W rzeczywistości to właśnie robi sam Jenkins. W ten sposób możesz również ustawić status kompilacji na ABORTED lub FAILURE. Przykład ten przerywa produkcji:

stage('Building') { 
    currentBuild.rawBuild.result = Result.ABORTED 
    throw new hudson.AbortException('Guess what!') 
    echo 'Further code will not be executed' 
} 

wyjściowa:

[Pipeline] stage 
[Pipeline] { (Building) 
[Pipeline] } 
[Pipeline] // stage 
[Pipeline] End of Pipeline 
ERROR: Guess what! 
Finished: ABORTED 
+0

Z Jenkins 2.89.3 to błąd: 'org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Skrypty nie dopuszczone do korzystania z nowych hudson.AbortException java.lang.String' –

+0

Wygląda na włączony tryb Sandbox i zakazuje rzucania tego wyjątku. Rodzaj dziwnego, ale wyłączającego tryb Sandbox powinien załatwić sprawę. – Jazzschmidt

+0

Można również zezwolić na użycie za pomocą polecenia Zarządzaj Jenkins> Zatwierdzenie skryptu w procesie – Jazzschmidt