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

如果输入超时,Mark Jenkins构建成功?(声明性管道),jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我正在创建一个声明性Jenkins管道,如下所示: pipeline { agent { label 'mylabel' } stages { stage('Install dependencies') { milestone() steps { sh "yarn install" } } stage('L

我正在创建一个声明性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
            }
        }

    }
}
但是,如果超时步骤失败(因为我们不想部署这个构建,或者没有人按下按钮等等),这个构建就会被标记为状态“中止”。不幸的是,这意味着,例如Github将我们的请求标记为“检查失败”


有没有一种方法可以用timeout()步骤之前的状态声明生成?如果构建在超时步骤之前是成功的,则应该将其标记为成功,即使超时发生。

如果没有用户提交,我们不想启动构建。由于scm中的错误,触发了对消息或用户的预防。 然后我们要做的是使构建失败,结果是未构建

也许这也适用于你的情况

在脚本中尝试以下操作

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

您可能可以在声明性管道的
post
部分中调整
currentBuild.result

例如


由于您只想让构建中止,而不将其标记为失败,因此只需在代码中添加一个简单的
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
                    }
                }
            }
        }

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

如果不希望将作业标记为“中止”或“失败”:

对于声明性管道(不是脚本化管道),您可以执行以下操作

stage('Foo') { steps { script { env.PROCEED_TO_DEPLOY = 1 try { timeout(time: 2, unit: 'MINUTES') { // ... } } catch (err) { env.PROCEED_TO_DEPLOY = 0 } } } } stage('Bar') { when { expression { env.PROCEED_TO_DEPLOY == 1 } } //rest of your pipeline 舞台(‘Foo’){ 台阶{ 剧本{ env.continue_TO_DEPLOY=1 试一试{ 超时(时间:2,单位:分钟){ // ... } }捕捉(错误){ env.procedue\u TO\u DEPLOY=0 } } } } 舞台(“酒吧”){ 什么时候{ 表情{ env.procept_TO_DEPLOY==1 } } //剩下的管道
阶段“栏”将被跳过,但对于其余阶段,作业将被标记为已通过(假设之前没有发生任何错误)

这种语法似乎不能用于声明性管道,我得到了
WorkflowScript:38:应该是stage@line 38,column 9。
。第38行是try块。我认为在声明性管道中,try应该在stage块内。此代码段在管道作业中作为内联管道脚本进行了测试。我尝试过移动它在声明性管道中,在阶段内部和步骤内部,它们似乎都不起作用。使用post部分而不是try/catch:不……这不起作用。看起来在声明性管道中currentBuild.result没有任何变化。事实上,即使是后中止部分中的回显也没有得到执行。可能与此问题有关:实际上,这可能是因为currentBuild.result已设置为比SUCCESS更糟糕的值,并且无法重新提升,即使是在同一阶段。 stage('Foo') { steps { script { env.PROCEED_TO_DEPLOY = 1 try { timeout(time: 2, unit: 'MINUTES') { // ... } } catch (err) { env.PROCEED_TO_DEPLOY = 0 } } } } stage('Bar') { when { expression { env.PROCEED_TO_DEPLOY == 1 } } //rest of your pipeline