Трубопровод Дженкинса пропускает отличную фразу 'else if' - PullRequest
0 голосов
/ 04 декабря 2018

Я провожу некоторые испытания в моем трубопроводе.Моя цель заключается в том, чтобы при наличии файла ошибки сборка не удалась.Но если по какой-либо причине в тестах возникло исключение и не было записано ни файла ошибки, ни файла успешной работы, конвейер также должен завершиться неудачей.Если ни одно из условий сбоя не выполнено, я бы хотел, чтобы выполнялась вышестоящая работа.

Я написал ее поэтапно, и изначально она выглядела так:

stage('system tests') {
    steps {
        dir(project_root) {
            def error_exists = sh(
                script: 'ls error.txt', returnStatus: true
            )
            if (error_exists == 0) {
                currentBuild.result = 'FAILED'
                return
            }
            build job: 'my-job;
        }
    }
}

Приведенный выше кодработает.Когда выполняемые тесты записывают файл ошибок, конвейер завершается ошибкой.Затем я попытался изменить код, чтобы обслужить результат, где не пишутся ни файлы ошибок, ни успехов.

stage('system tests') {
    steps {
        dir(project_root) {
            def error_exists = sh(
                script: 'ls error.txt', returnStatus: true
            )
            def success_exists = sh(
                script: 'ls success.txt', returnStatus: true
            )
            if (error_exists == 0) {
                currentBuild.result = 'FAILED'
                return
            } else if (success_exists == 1 && error_exists == 1) {
                currentBuild.result = 'FAILED'
                return
            }
            build job: 'my-job;
        }
    }
}

Я смоделировал ситуацию, когда ни один файл не был записан, и конвейер не вышел из строя, и вместо этого он запустил сборку восходящего потока.Почему я не вхожу в предложение else if, если результат обоих сценариев оболочки ложен?Я взял логические операторы из здесь и думаю, что они должны быть выполнены (приведенный ниже код выводится из сценариев оболочки в конвейере нового задания)

[new-job] Running shell script
+ ls error.txt
ls: cannot access error.txt: no such file or directory

[new-job] Running shell script
+ ls success.txt
ls: cannot access success.txt: no such file or directory

1 Ответ

0 голосов
/ 04 декабря 2018

Если эти файлы не существуют, то шаг sh jenkins возвращает код ошибки 2. Вы должны переписать свое «если условие» следующим образом:

success_exists == 2 && error_exists == 2

Но я думаю, что в вашем случае этот код болееподходит:

stage('system tests') {
steps {
    dir(project_root) {
        def error_exists = sh(
            script: 'ls error.txt', returnStatus: true
        )
        def success_exists = sh(
            script: 'ls success.txt', returnStatus: true
        )
        if (error_exists == 0) {
            currentBuild.result = 'FAILED'
            return
        } else if (success_exists != 0 && error_exists != 0) {
            currentBuild.result = 'FAILED'
            return
        }
        build job: 'my-job;
    }
}

Поскольку могут быть другие причины невозможности найти файл (отсутствие доступа и т. д.).

...