Jenkins 管道正在跳过 groovy 'else if' 子句

Jenkins pipeline is skipping groovy 'else if' clause

我正在我的管道中进行一些测试。我的目标是,如果存在错误文件,构建应该失败。但是,如果由于某种原因测试遇到异常并且没有写入错误或成功文件,则管道也应该失败。如果失败的条件都不满足,我希望执行上游作业。

我在舞台上写的,最初看起来像这样:

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;
        }
    }
}

我模拟了一个文件都没有写入,管道也没有失败,而是触发了上游构建的情况。如果两个 shell 脚本的结果都是假的,为什么我不输入 else if 子句?我从 here 中获取了逻辑运算符,我认为它们应该得到满足(下面的代码是从新工作管道中的 shell 脚本输出的)

[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

如果这些文件不存在,那么 sh jenkins 步骤 returns 错误代码 2。你应该像这样重写你的 'if condition':

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;
    }
}

因为可能有其他原因无法找到文件(无法访问等)。