Как отметить успешность сборки, если один из этапов отменен? - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть конвейер с этапами, где один из этапов периодически занимает больше времени, чем ожидалось, и, следовательно, использует timeout для его прерывания. Но если этап отменяется, сборка также помечается как прерванная. Ниже приведен код для конвейера:

pipeline {
    agent any

    stages {

        stage('First') {
            options {
                timeout(time: 10, unit: 'SECONDS')
            }
            steps {
                script {

                    catchError(buildResult: 'SUCCESS') {
                        echo "Executing stage I"
                        sleep 12
                    }

                }
            }
        }

        stage('Second') {
            steps {
                script {
                    echo "Executing stage II"
                }
            }
        }
    }
}

Даже если сцена помечена как Aborted, я хочу пометить сборку как Success. Не могли бы вы помочь, как мне этого добиться?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Я бы предложил одно улучшение в ответе Майкла (это верно, кстати). Вы можете использовать catchError, чтобы отметить этап ABORTED (или UNSTABLE) и пометить сборку SUCCESS, но вам нужно обернуть код, который может прерваться, блоком try-catch для контроля ошибки. Рассмотрим следующий пример:

pipeline {
    agent any

    stages {

        stage('First') {
            options {
                timeout(time: 3, unit: 'SECONDS')
            }
            steps {
                script {
                    catchError(buildResult: 'SUCCESS', stageResult: 'ABORTED') {
                        try {
                            echo "Executing stage I"
                            sleep 4
                        } catch(org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
                            error "Stage interrupted with ${e.toString()}"
                        }
                    }

                }
            }
        }

        stage('Second') {
            steps {
                script {
                    echo "Executing stage II"
                }
            }
        }
    }
}

Когда вы запускаете этот конвейер, стадия, для которой истекло время ожидания, помечается как ABORTED, но конвейер продолжается, и если на оставшихся стадиях нет ошибок, он помечается как SUCCESS.

enter image description here

А вот как выглядит статус UNSTABLE.

enter image description here

Решение Майкла также работает, но оно дает немного другой результат - время ожидания помечается как SUCCESS, и это может быть менее интуитивно понятно. Вы должны нажать на сцену, чтобы проверить, истекло ли это время или нет.

pipeline {
    agent any

    stages {

        stage('First') {
            options {
                timeout(time: 3, unit: 'SECONDS')
            }
            steps {
                script {
                    try {
                        echo "Executing stage I"
                        sleep 4
                    } catch(Exception e) {
                        currentBuild.result = "SUCCESS"
                    }
                }
            }
        }

        stage('Second') {
            steps {
                script {
                    echo "Executing stage II"
                }
            }
        }
    }
}

enter image description here

2 голосов
/ 15 апреля 2020

Ваш catchError() не будет работать в вашем случае. Документация ( Source ) сообщает следующее:

buildResult (необязательно)

Если обнаружена ошибка, общий результат сборки будет установлен на это значение , Обратите внимание, что результат компоновки может ухудшиться, поэтому вы не можете изменить результат на SUCCESS, если текущий результат НЕУСТОЙЧИВ или хуже. Используйте SUCCESS или ноль, чтобы не устанавливать результат компоновки при обнаружении ошибки. .

Статус сборки устанавливается с помощью currentBuild.currentResult, который может иметь три значения: SUCCESS, UNSTABLE или FAILURE.

Если вы хотите отметить построить как SUCCESS при прерывании беременности можно использовать опцию post-option ( Source ) aborted:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        aborted { 
            // Executed only if stage is aborted
            currentBuild.result = 'SUCCESS'
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...