如何在Jenkins Pipeline中添加超时步骤

133

当您使用自由风格项目时,可以设置在20分钟后,如果尚未完成,则取消构建。如何在Jenkins多分支管道项目中实现此功能?

5个回答

245
你可以使用timeout步骤:
timeout(20) {
  node {
    sh 'foo'
  }
}
如果您需要不同于 MINUTES 的 TimeUnit ,则可以提供 unit 参数:
timeout(time: 20, unit: 'SECONDS') {

2018年8月更新:如今随着更常见的声明性流水线(可以通过顶层pipeline结构轻松识别),超时也可以在不同级别上(每个整个流水线或每个阶段)使用选项指定:

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

不过,如果你想在声明性流水线的单个步骤中应用超时,则可以按照上述描述使用。


7
参考资料也可以在以下两个位置找到:1. Jenkins仪表板<任何流水线项目> ▼ → 流水线语法 → _步骤参考_;或者2. JENKINS_URL/job/<任何流水线项目>/pipeline-syntax/步骤参考. - Gerold Broser
3
是否可以仅为获取节点的部分设置超时,而不计算运行内容所花费的时间?例如:有时候节点处于离线状态,如果任务无法及时获取节点,我希望任务能够失败而不是超时,但如果任务已经获取了节点并正在运行,则不希望任务失败。 - Jake
1
@Jake,那应该是一个问题! - charlie_pl
1
当超时时间到期时,如何抛出自己的错误消息? - red888
@red888 请查看 catchError 指令,它是一种高级的 try/catch 结构,可以让您在捕获异常时设置自己的消息。 - Max Cascone
显示剩余3条评论

22

对于声明式流水线,建议在选项部分中使用超时步骤

在确定的时间限制内执行块内的代码。如果达到时间限制,将抛出异常(org.jenkinsci.plugins.workflow.steps.FlowInterruptedException),导致构建中止(除非它被捕获并进行处理)。单位是可选的,默认为分钟。

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

  • time (必需, 整数)

    • 超时的时间量,如果没有指定单位则为分钟。
  • activity (可选, 布尔值)

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

    • time的单位,默认为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')

Jenkins官方文档提供了一个非常好的超时使用示例:

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

4
“activity” 的默认值为 false。当“activity”为 false 时,整个任务会超时,当“activity”为 true 时,只有在活动中超时(才能将任何内容打印到日志中)。 - Maxim Suslov
2
我想为特定阶段添加“超时”,以便后续阶段可以优雅地运行。在上面的示例中,管道在超时后中止,并且不执行后续阶段。有没有办法满足我的要求?给出了一个给定阶段的超时示例代码(来自官方Jenkins文档):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } } - Yash
1
值得注意的是,与阶段超时不同,管道的声明性超时有些不同。第一个不考虑等待代理花费的时间,而第二个则会考虑。因此,在代理繁忙的情况下,必须记住这一点。 - Marek R
1
@Yash请查看catchError指令。 - Max Cascone

8

在声明式流水线中,您可以使用:

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                retry(3) {
                    sh './flakey-deploy.sh'
                }

                timeout(time: 3, unit: 'MINUTES') {
                    sh './health-check.sh'
                }
            }
        }
    }
}

6

对于一个声明式管道(整个作业的超时时间):

pipeline {
    options {
        timeout(time: 3, unit: 'HOURS')
    }
    
    agent {
        label 'agent_name'
    }
        
    stages {
        stage('Stage_name') {
            steps {
                // ...
            }
        }
    }
    
    // ...
}

对于一个脚本化流水线(整个作业的超时):

def call() {
    node('agent_name') {
        timeout(time: 3, unit: 'HOURS') {
            stage('Stage_name') {
                // ...
            }
        }
    }    
}

在一个阶段内的超时时间(针对特定操作):

声明性流水线

pipeline {
    agent {
        label 'agent_name'
    }

    stages {
        stage('Stage_name') {
            steps {
                timeout(time: 3, unit: 'HOURS') {
                    sh ' ... '
                    echo '...'
                    // ...
                }

                // ...
            }
        }
    }
}

脚本化流水线

def call() {
    node('agent_name') {
        stage('Stage_name') {
            timeout(time: 3, unit: 'HOURS') {
                sh '...'
                echo '...'
                // ...
            }

            // ...
        }
    }    
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接