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

时间:2017-06-12 07:59:12

标签: 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
            }
        }

    }
}

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

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

4 个答案:

答案 0 :(得分:4)

如果没有用户提交,我们就不想开始构建。由于消息或用户的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"
    }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

    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

阶段“ Bar”将被跳过,但在其余阶段中,作业将被标记为“通过”(假设之前没有发生任何错误)

答案 3 :(得分:0)

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

E.g。

pipeline {
  stages {
    ...
  }
  post {
    aborted {
      script {
        currentBuild.result = 'SUCCESS'
      }
    }
  }
}