Прерванная работа конвейера Дженкинса продолжается на более поздних стадиях - PullRequest
0 голосов
/ 21 января 2019

Я использую последнюю версию Jenkins и подключаемых модулей, и у меня задание декларативного конвейера jenkins, настроенное следующим образом:

pipeline { 
    agent {
        label 'default'
    }
    stages {
        stage('Prepare') {
            steps {
                dir('foo') {
                    git ...
                }
            }
        }
        stage('Temp1') {
            steps {
                sh script: 'dotnet run ...'
                echo 'Temp1'
            }
        }
        stage('Temp2') {
            steps {
                echo 'Temp2'
            }
        }
    }
}

Если я прерву сборку во время сценария sh в Temp1этап, я ожидаю, что ни остальные этапы Temp1, ни этап Temp2 не будут работать.Однако, когда я прерываю его, он останавливает сценарий sh, затем запускает оставшуюся часть этапа Temp1 и продолжает также запускать этап Temp2!

Вот журнал:

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on ...
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Prepare)
[Pipeline] dir
Running in ...
[Pipeline] {
[Pipeline] git
Fetching changes from the remote Git repository
...
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Temp1)
[Pipeline] sh
+ dotnet run ...
Aborted by ...
Sending interrupt signal to process
[Pipeline] echo
Temp1
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Temp2)
[Pipeline] echo
Temp2
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: ABORTED

Как мне заставить сборку действительно прерваться?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

В результате возникла проблема с сетью точек, когда он возвращает 0 в качестве кода выхода при уничтожении SIGTERM. https://github.com/dotnet/coreclr/issues/21243 было разрешено несколько дней назад, но еще не выпущено.

В качестве обходного пути вы можете сделать что-то вроде этого:

public static int Main(string[] args)
{
    Environment.ExitCode = 1;

    // Do stuff

    return 0;
}

Если Main завершится успешно, он вернет код завершения 0. Если он получит SIGTERM, он вернет значение в Environment.ExitCode.

0 голосов
/ 24 января 2019

Вы можете попробовать 2 разные вещи.

stage('Foo'){
    //do something
} 
post {
     failure { currentBuild.result = 'ABORTED' // this should cause the pipeline to stop 
     //or the hard way: failure{ throw new hudson.AbortException('Abort the build.') 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...