如果输入超时,Mark Jenkins会成功吗?(声明性管道)

K. *_*ert 8 jenkins jenkins-pipeline

我正在创建一个声明式Jenkins管道,如下所示:

pipeline {
    agent {
        label 'mylabel'
    }
    stages {
        stage('Install dependencies') {
            milestone()
            steps {
                sh "yarn install"
            }
        }
        stage('Lint files') {
            steps {
                sh "eslint src"
            }
        }
        stage('Create bundle') {
            steps {
                sh "yarn run build:server"
                sh "yarn run build:client"
            }
        }
        stage('Publish') {
            steps {
                timeout(time: 15, unit: 'SECONDS') {
                    input(message: 'Deploy this build to QA?')
                }
                // deployment steps
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果超时步骤失败(因为我们不想部署此构建,或者没有人按下按钮等等),它的工作效果很好,构建标记状态为"已中止".不幸的是,这意味着例如Github将我们的拉取请求标记为"检查失败".

有没有办法用超时()步骤之前的状态声明构建?例如.如果构建在超时步骤之前成功,则应将其标记为成功,即使超时发生也是如此.

jpy*_*ams 15

由于您想要的只是让构建中止而不将其标记为失败,因此您只需try/catch在代码中添加一个简单的即可。

        stage('Publish') {
            steps {
                script {
                    def proceed = true
                    try {
                        timeout(time: 15, unit: 'SECONDS') {
                            input(message: 'Deploy this build to QA?')
                        }
                    } catch (err) {
                        proceed = false
                    }
                    if(proceed) {
                        // deployment steps
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果用户中止构建或超时,错误将被抑制,构建仍然成功,部署步骤将不会执行。


Wim*_*een 5

在这种情况下,如果没有用户提交,我们就不想开始构建。由于scm中的错误,因此无法阻止消息或用户。然后,我们要做的是使构建失败并显示NOT_BUILT结果。

也许这也适合您的情况

在脚本中尝试以下操作

try {
    stage ('wait') {
        timeout(time: 15, unit: 'SECONDS') {
            input(message: 'Deploy this build to QA?')
        } 
    }
} catch (err) {
    def user = err.getCauses()[0].getUser()
    if('SYSTEM' == user.toString()) { //timeout
        currentBuild.result = "SUCCESS"
    }
}
Run Code Online (Sandbox Code Playgroud)