如何向Jenkins Pipeline添加超时步骤


93

使用自由样式项目时,您可以设置20分钟后,如果未结束,则中止构建。Jenkins多分支管道项目如何做到这一点?

Answers:


187

您可以使用超时步骤:

timeout(20) {
  node {
    sh 'foo'
  }
}

如果你需要一个不同的TimeUnitMINUTES,您可以提供的unit参数:

timeout(time: 20, unit: 'SECONDS') {

编辑2018年8月:如今,使用更常见的声明性管道(易于被顶层pipeline构造识别),还可以options在不同级别(每个整体管道或每个阶段)使用指定超时:

pipeline {
  options {
      timeout(time: 1, unit: 'HOURS') 
  }
  stages { .. }
  // ..
}

不过,如果要将超时应用于声明式管道中的单个步骤,则可以如上所述使用超时。


6
也可在1. Jenkins仪表板<任何管道项目> ▼→ 管道语法步骤参考或2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/步骤参考下获得参考
Gerold Broser

2
是否可以仅在获取节点的部分中超时,而不能计算运行内容所花费的时间?即:有时节点处于脱机状态,我想这份工作,如果它不能及时获得一个节点,而不是超时失败的一种方式,但不想,如果它确实获得节点作业失败和运行..
杰克

如果您只想知道该节点是否在线,则可以询问:def n=Jenkins.instance.getNode("ETService3") if (n!=null && n.computer && n.computer.online) { echo "Online" } else { echo "Offline" // wait a little bit and try again }一种棘手的方法来两次获取该节点。第一次使用外部超时,第二次使用内部超时。我也缺少该功能。
elou

@Jake,应该是个问题!
charlie_pl '18 -10-31

1
超时过期后如何抛出自己的错误消息?
red888 '18

4

对于声明性管道,建议在options-section中使用超时步骤

以确定的超时限制执行块内的代码。如果达到了时间限制,则会引发异常(org.jenkinsci.plugins.workflow.steps.FlowInterruptedException),这将导致构建中止(除非以某种方式捕获并处理了该构建)。单位是可选的,但默认为分钟。

超时步骤有3个参数可以配置:

  • 时间(必填,整数)

    • 超时量(如果未指定单位),以分钟为单位的持续时间
  • 活动(可选,布尔值)

    • 此块的日志中没有活动之后的超时,而不是绝对持续时间。
  • 单位(可选,值:NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS)

    • 时间单位,默认为MINUTES

例子:

timeout(time: 10) // would lead to a timeout of 10 minutes (MINUTES is default value)
timeout(time: 10, unit: 'SECONDS') // a 10 seconds timeout
timeout(time: 10, activity: false, unit: 'MILLISECONDS')

负责人詹金斯文档具有使用超时的一个很好的例子:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

2
activity默认为false。当activity为false时-整个作业true超时,活动超时(将任何内容打印到日志中)。
Maxim Suslov

我要timeout为特定阶段添加某种方式,以便后续阶段可以正常运行。在上面的示例中,管道在超时后中止并且不执行后续阶段。有没有办法满足我的要求?给定阶段超时的示例代码(来自官方Jenkins Doc):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash
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.