成功清除Jenkins Pipeline工作的最干净方法?


55

我有一个可以创建文件的作业,除非馈入它的值之一与旧值匹配。是什么在詹金斯最清晰的方式中止或退出工作,没有它是FAILED?它退出是正确的行为,所以我要标记构建SUCCESS

最终将以if语句结束。

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

我不想抛出错误代码,除非它可以以某种方式转化为被标记为成功构建的代码。


1
只是exit 0...
Tensibai '17

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

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

这不在bash脚本中,这是管道作业本身,因此是Groovy。这会改变一切吗?
亚历克斯(Alex)

在groovy中,我只想尝试return 0groovy代码中所有不抛出异常的结尾,我认为应该这样做。我将让对jenkins 2有更多背景的人确认或确认
Tensibai '17

Answers:


46

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

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

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


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

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

1
@JessBowers就是您将代码片段放在何处的全部内容。如果您在节点级别而不是阶段级别执行此操作,则它将完成整个工作。
亚历克斯(Alex)

4
请注意,它仅适用于脚本化管道,不适用于声明性管道
kagarlickij,

@kagarlickij-编写此答案时,正确的声明性管道不存在!
亚历克斯(Alex)

10

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

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
}

但是,如果错误发生在一个阶段内,则将导致红色阶段。

在此处输入图片说明

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


如果您要这样做,请创建一个新的RuntimeExceptionthrow 子类,而不需要捕获所有异常并检查标志
Michael Mrozek 18-10-15

1

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

我还没有遇到这个问题,所以还没有使用插件。

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


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

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

等一下 是你的问题吗?如果是,TBH您不想听到您不应该退出的消息,但是我建议的两种方法都不能提供退出功能,它们可以避免运行代码...直接支持我的立场。
MrMesees

1
啊,我明白了,我认为我误解了您的陈述,认为“做某件事来结束工作很不好”,而不是“您不应该使用文字exit命令”-如果我道歉,那是我的误解。
亚历克斯(Alex)

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

0

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

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

优点

  • 可以在声明性管道以及脚本化管道中工作。
  • 没有尝试/捕获或异常要处理。
  • 在用户界面中将调用阶段和所有后续阶段标记为绿色/通过。

缺点

  • 需要大量的进程内脚本批准,其中包括被认为不安全的批准。谨慎批准和使用。

对我来说,它不起作用-连续的阶段正在执行。
ŁukaszK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.