我有一个可以创建文件的工作,除非馈入它的值之一与旧值匹配。 Jenkins中止或退出工作的最干净方法是什么?它的退出是正确的行为,因此我需要标记为FAILED的构建。 >我不想抛出错误代码,除非可以以某种方式将其转换为被标记为成功构建的代码。

评论

只需退出0 ...

我以为这标志着工作失败了?如果我错了并且可以显示文档,我很乐意接受它作为答案

好吧,只是bash脚本,退出0表示成功,退出非零表示失败...

这不在bash脚本中,这是管道作业本身,因此是Groovy。这会改变一切吗?

在groovy中,我只是尝试返回0,在我认为不抛出异常的groovy代码的所有结尾中,都应该这样做。我会让对jenkins 2有更多背景的人确认或确认

#1 楼

弄清楚了。在任何阶段之外(否则将成功结束特定阶段)执行以下操作;

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}


return将停止您正在运行的阶段或节点这就是为什么在阶段外运行它很重要,同时设置currentBuild.result可以防止其失败的原因。

评论


刚返回就应该使构建的状态变为灰色,并且没有结果……因此与失败的构建完全不同。

–酒
17-10-28在18:47

您如何返回并跳过所有剩余阶段?

–Jess Bowers
17年11月13日在22:30

@JessBowers就是您将代码片段放在哪里的全部。如果您在节点级别而不是阶段级别执行此操作,则它将完成整个工作。

– Alex
17年11月14日在13:52

请注意,它仅适用于脚本管道,不适用于声明式管道

– kagarlickij
18 Mar 28 '18 at 11:01

@kagarlickij-编写此答案时,不存在正确的声明性管道!

– Alex
18 Mar 28 '18 at 12:34

#2 楼

您还可以使用错误退出当前阶段,则不必考虑当前阶段的层次结构和类似内容:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}


红色阶段,如果一个阶段内发生错误。



这取决于您的要求以及使用哪种方式。

评论


如果您要这样做,请创建一个新的RuntimeException子类来抛出,而不是需要捕获所有异常并检查标志

– Michael Mrozek
18-10-15在16:24

#3 楼

Executor.interrupt(Result)方法是我发现过早停止构建并将其标记为成功的最干净,最直接的方法。

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
    sleep(1)   // Interrupt is not blocking and does not take effect immediately.
}




可以在声明式管道中工作,也可以在脚本化管道中工作。
没有try / catch或异常要处理。 UI。

缺点:


需要许多进程内脚本批准,其中包括不安全的批准。谨慎使用并批准。


评论


对我来说,它不起作用-正在执行连续的阶段。

–ŁukaszK
19-10-30在7:55

您可以将它放在声明式管道的某个阶段之前吗?

– Peetasan
20年1月16日在16:21

在声明性管道中,脚本块仅在阶段的步骤块内有效。如果需要按照给定阶段之前的描述停止执行,则需要在前一个阶段执行脚本。

– Ben Amos
20年1月16日在22:30

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用方法org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild

– Devaroop
20-2-6在8:32

是的,这就是我在“缺点”部分中提到的内容。

– Ben Amos
20年11月11日,0:16

#4 楼

老实说,您不需要专门使用exit命令,但是有一个条件BuildStep插件可以实现相同的最终结果(代码无法运行)。

我没有遇到

在Jenkins上先前的Stack Overflow帖子中也发现了条件:Jenkins Pipeline条件步骤/阶段

评论


尽管您的答案似乎是有效的(因为我找到了另一个解决方法,所以没有对其进行实时检查),但我认为“老实说您不应该退出”并不是启动它的好方法;显然,这些方法的存在意味着有时有必要退出。

– Alex
17年4月15日在0:18

你有什么建议?移至结尾声明?通常添加限定词?您提供了“反馈”,但是对我来说要说出它的意图或采取行动并不容易,请保持简洁。

– MrMesees
17年4月16日在19:57

等一下是你的问题吗?如果是的话,TBH您不想听到您不应该退出的消息,但是我建议的两种方法都不提供退出操作,它们规避了代码运行……直接支持我的立场。

– MrMesees
17年4月16日在20:15

嗯,我明白了,我认为我将您的陈述误解为“做某件事来结束工作很不好”,而不是“您不应该使用原义的退出命令”-如果我道歉,那是我的误解。

– Alex
17-4-16在23:34



我试图使它更清楚,根本不需要道歉,语言是善变的野兽,尤其是在互联网上:)

– MrMesees
17年4月17日在8:46

#5 楼

我几乎可以使用声明式管道来完成此任务。这使您可以根据Shell脚本的结果在管道启动之前退出。我无法在管道内部(阶段内或阶段之间)执行此操作。不会完全退出。

https://www.jenkins.io/doc/book/pipeline/syntax/#when

#6 楼

如果可以将构建状态设置为ABORTED而不是SUCCESS,则可以在流水线阶段使用以下代码片段来缩短作业:
我测试了将结果设置为steps { script { currentBuild.result = 'ABORTED' error("Aborting the job.") } } ,但是这样做导致构建失败(使用Jenkins 2.235.5)。看来SUCCESS步骤受尊重,而ABORTED被覆盖。