2016-04-15 5 views
25

После прочтения Jenkins tutorial, объясняющего Pipeline плагин, кажется, что плагин должен сделать возможным реализовать Post-Build шагов. Однако документация довольно ограничена в отношении конкретных инструкций.Как реализовать стадию Post-Build с использованием подключаемого модуля Jenkins Pipeline?

Например Интересно, как реализовать:

  • Выполнить только если сборка прошла успешно
  • Выполнить только если сборка прошла успешно или неустойчиво
  • Run независимо от результата сборки
  • Run только если сборка прошла успешно

    stage 'build' 
    ... build 
    ... tests 
    stage 'post-build' 
    ... 
    

    (Или добавьте -Dmaven.test.failure.ignore=false к MAVEN_OPTS)

  • Run только если сборка прошла успешно или неустойчиво

    stage 'build' 
    ... build 
    try { 
        ... tests 
    } catch { 
        ... 
    } 
    stage 'post-build' 
    ... 
    

    (Или добавьте -Dmaven.test.failure.ignore=true к MAVEN_OPTS)

  • Выполнение независимо от результата сборки - можно ли это сделать, используя try/catch/finally?

    try { 
        stage 'build' 
        ... 
    } catch { 
        ... 
    } finally { 
        stage 'post-build' 
        ... 
    } 
    

(я заметил, что окончательный статус сборки устанавливается как УСПЕХА хотя некоторые этапы, то есть. «Строить», так и не удалось, как это установлено на основе последней стадии. Это означает, что окончательное currentBuild.result = 'UNSTABLE'?)

+0

Возможный дубликат [Как я заверяю, что этап трубопровода Дженкинс всегда выполняется, даже если предыдущий не удалось ?] (http://stackoverflow.com/questions/37463489/how-do-i-assure-that-a-jenkins-pipeline-stage-is-always-executed-even-if-a-prev) –

ответ

4

Если вы используете try/catch, и хотите, чтобы сборка была отмечена как нестабильная или неудачная, вы должны использовать currentBuild.result = 'UNSTABLE' и т. д. Я считаю, что некоторые плагины, такие как плагин JUnit Report, установят это для вас, если он найдет неудачные тесты в результатах junit. Но в большинстве случаев вам нужно настроить себя, если вы ловите ошибки.

Второй вариант, если вы не хотите продолжать, - это повторная ошибка.

stage 'build' 
... build 
try { 
    ... tests 
} catch(err) { 
    //do something then re-throw error if needed. 
    throw(err) 
} 
stage 'post-build' 
... 
1

try-catch блоки могут быть настроены для обработки ошибок, как в реальном коде приложения.

Например:

try { 
    node { 
     sh 'sleep 20' // <<- can abort here 
    } 
} catch (Exception e) { 
    println 'catch' 
} finally { 
    println 'finally' 
} 

node { 
    println 'second' 
} 

try { 
    node { 
     sh 'sleep 20' // <<- can abort here again 
    } 
} catch (Exception e) { 
    println 'catch' 
} finally { 
    println 'finally' 
} 

А вот пример вывода с двумя Прерывает.

Started by user me 
Replayed #3 
[Pipeline] node 
Running on my-node in /var/lib/jenkins-slave/workspace/my-job 
[Pipeline] { 
[Pipeline] sh 
[my-job] Running shell script 
+ sleep 20 

Aborted by me 

Sending interrupt signal to process 

/var/lib/jenkins-slave/workspace/[email protected]/durable-9e1a15e6/script.sh: line 2: 10411 Terminated    sleep 20 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] echo 
catch 
[Pipeline] echo 
finally 
[Pipeline] node 
Running on my-node in /var/lib/jenkins-slave/workspace/my-job 
[Pipeline] { 
[Pipeline] echo 
second 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] node 
Running on my-node in /var/lib/jenkins-slave/workspace/my-job 
[Pipeline] { 
[Pipeline] sh 
[my-job] Running shell script 
+ sleep 20 

Aborted by me 

Sending interrupt signal to process 
/var/lib/jenkins-slave/workspace/[email protected]/durable-d711100c/script.sh: line 2: 10416 Terminated    sleep 20 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] echo 
catch 
[Pipeline] echo 
finally 
[Pipeline] End of Pipeline 
Finished: ABORTED 

Конечно, это работает для любых исключений, возникающих во время исполнения.

14

Лучший способ использования post build action в сценарии конвейера.

Обработка Неудача
декларативного Pipeline поддерживает Robust Failure обработки по умолчанию с помощью своего почтового участка, который позволяет об объявлении количества различных «почтовых условий», таких как: всегда, нестабильные, успеха, неудачи, и изменился. В разделе Синтаксис трубопровода более подробно описывается, как использовать различные условия сообщения, .

Jenkinsfile (декларативных Pipeline)

pipeline { 
    agent any 
    stages { 
     stage('Test') { 
      steps { 
       sh 'make check' 
      } 
     } 
    } 
    post { 
     always { 
      junit '**/target/*.xml' 
     } 
     failure { 
      mail to: [email protected], subject: 'The Pipeline failed :(' 
     } 
    } 
} 

Документация ниже https://jenkins.io/doc/book/pipeline/syntax/#post

+3

это doesn я работаю для меня, когда я запускаю его в проекте Pipeline –

+0

@Mohamed, a s Subrat сказал, что это не работает за пределами файла jenkins. Есть ли другой способ сделать это? – Jason

+0

Возможно, это связано с версией jenkins или плагином, но я не уверен. Другой способ сделать это - внести изменения в try catch и, наконец, блокировать. –