我正在创建一个声明式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将我们的拉取请求标记为"检查失败"。
有没有办法用超时()步骤之前的状态声明构建?例如。如果构建在超时步骤之前成功,则应将其标记为成功,即使超时发生也是如此。
答案 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'
}
}
}
}