干货!Pipeline脚本稳定运行的核心设计思路

本文介绍了如何确保Jenkins Pipeline脚本稳定运行,重点讲解了编码式Pipeline中异常处理的使用,包括try-catch-finally结构以及对检查性异常和运行时异常的处理。同时,文章还提到了错误(Error)的处理,并给出了处理错误和异常的示例代码。通过合理的异常处理机制,可以确保Pipeline在遇到问题时仍能执行必要的清理操作,从而提高整体的稳定性。

如果想要CI/CD持续稳定的运行,那么pipeline脚本的稳定性就是最核心的问题,那么如何才能让pipeline脚本稳定的运行呢?就是应用异常!这里以脚本化Pipeline script为例进行讲解,如果您使用声明式pipeline script,请把异常处理机制放在script {}中(这里不对声明式pipeline script做详细介绍)。

编码式Pipline的异常使用

Pipeline 处理异常的形式如下:

node {

    sh './set-up.sh'

    try {

        sh 'might fail'

        echo 'Succeeded!'

    } catch (err) {

        echo "Failed: ${err}"

    } finally {

        sh './tear-down.sh'

    }

    echo 'Printed whether above succeeded or failed.'

}

异常通用概念

在这里需要介绍一下异常相关的基础概念:

Exception

检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。

运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。

Error

错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。下图显示了如何组织Groovy中的异常层次结构。它都基于Java中定义的层次结构。

try和catch的使用

方法使用trycatch关键字的组合捕获异常。 try/catch块放在可能生成异常的代码周围。

try{

   //保护的代码

} catch(ExceptionName e1) {

   //处理异常的代码

}

可以有多个catch块来处理多种类型的异常。对于每个catch块,根据引发的异常类型,您将编写代码来相应地处理它。

try {

   def arr = new int[3];

    arr[5] = 5;

}

catch(ArrayIndexOutOfBoundsExceptionex) {

    println("捕获Array out of Bounds exception");

}

catch(IOException ex) {

    println("捕获 io exception");

}

结果输出

捕获Array out of Bounds exception

finally块

finally块遵循try块或catch块。无论发生异常,最终都会执行最后一段代码。

try {

def arr = new int[3];

arr[5] = 5;

}

catch(ArrayIndexOutOfBoundsExceptionex) {

    println("捕获Array out of Bounds exception");

}

catch(IOException ex) {

    println("捕获 io exception");

}

finally{

    println("执行final 块");

}

结果输出

捕获Array out of Boundsexception

执行final块

备注:如果大家不确认具体的异常类型直接使用exception(或者exp)就可以,因为他是各种exception的父类!

error的处理

当我们需要处理错误(错误不是异常,而是脱离程序员控制的问题。)的时候,就需要使用error(或者err)了。

try {

//保护的代码

   }

catch(error) {

//处理错误的代码

}

稳定代码的设计核心点

如果想使我们的代码稳定运行,既处理异常又捕获error,可以这样处理

try {

   //保护的代码

}

catch(err) {

//处理错误的代码

}


catch(exp){

//处理异常的代码

}

在pipeline中的应用如下所示,这样可以确保我们的pipeline稳定运行,
 

node {

try {

   //pipeline运行的脚本

}

catch(err) {

//处理pipeline中代码的异常

}

catch(exp){

//处理pipeline中遇到的错误信息

}

}

<think>我们有一个关于JenkinsPipeline的需求:设置Pipeline脚本运行超过24小时后自动停止。根据Jenkins的文档和常见实践,我们可以使用`timeout`步骤来实现这个功能。`timeout`步骤可以设置一个阶段(stage)或步骤块(block)的最大执行时间。具体来说,我们可以在整个Pipeline或者某个特定的阶段使用`timeout`来设置超时时间为24小时(24hours)。参考引用中提到了`timeout`步骤的使用(引用[1]中的12.3.5.5部分):stage('enforce'){steps{timeout(activity:true,time:1){echo'test'}}}但是,上面的例子中设置的时间是1(单位默认为分钟),我们需要设置24小时。我们可以将时间单位指定为"HOURS",并设置时间为24。因此,我们可以这样写:timeout(time:24,unit:'HOURS'){//需要设置超时的代码块}注意:`timeout`步骤可以放在整个Pipeline的最外层(在stages外面,使用pipeline块内的顶层选项),但通常我们更常见的是包裹整个stages或者某个具体的stage。然而,在DeclarativePipeline(声明式流水线)中,我们可以在`options`部分为整个Pipeline设置超时,也可以在某个stage的`options`中设置。方法1:在整个Pipeline设置超时(在pipeline块内,与agent、stages同级):pipeline{agentanyoptions{timeout(time:24,unit:'HOURS')}stages{//所有阶段}}方法2:在某个stage内部设置超时(只对该stage有效):stage('Build'){options{timeout(time:24,unit:'HOURS')}steps{//步骤}}方法3:使用`timeout`步骤包裹一系列步骤(在steps块内):stage('LongRunningStage'){steps{timeout(time:24,unit:'HOURS'){//具体的步骤}}}根据需求,我们可能希望整个Pipeline在24小时后停止,那么方法1是合适的。如果只是某个阶段需要,则使用方法2或3。另外,注意`timeout`步骤的`activity`参数:如果设置为true,则表示如果在超时时间内没有日志输出,则视为超时;否则,只要超过时间就超时。我们的需求是超过24小时就停止,所以可以用设置activity(默认为false)或者显式设置为false。但是,如果我们的任务可能长时间没有日志输出(比如在等待外部事件)但实际并未挂起,我们可能希望它超时,那么可以设置`activity:true`。过,根据问题描述,我们只需要按总时间超时即可。因此,一个设置整个Pipeline超时为24小时的例子如下:```groovypipeline{agentanyoptions{timeout(time:24,unit:'HOURS')}stages{stage('Build'){steps{//构建步骤}}stage('Test'){steps{//测试步骤}}//其他阶段...}}```如果Pipeline运行时间超过24小时,Jenkins会中止该Pipeline并标记为失败。另外,引用[1]中还有关于`retry`(重试)和`catchError`(捕获错误)的步骤,但这些与超时无关。注意:我们也可以使用`script`块在ScriptedPipeline脚本式流水线)中实现,但用户的问题中没有指定是声明式还是脚本式。通常,声明式更常见,所以我们以声明式为例。如果用户使用的是脚本式流水线,可以这样写:```groovynode{timeout(time:24,unit:'HOURS'){//整个流水线的步骤}}```总结:使用`timeout`步骤,并设置时间为24,单位为'HOURS'。相关问题:1.如何在JenkinsPipeline中设置超时以停止运行时间过长的任务?2.JenkinsPipeline的timeout步骤有哪些参数?3.除了整个Pipeline,如何为JenkinsPipeline的单个阶段设置超时?4.如何设置JenkinsPipeline在没有日志输出时超时?</think>### Jenkins Pipeline 24小时超时停止配置 在Jenkins Pipeline中实现24小时超时自动停止,可以通过 `timeout` 步骤结合 `unit: 'HOURS'` 参数实现。以下是具体配置方法: #### 1. **全局Pipeline超时(推荐)** 在 `pipeline` 块内使用 `options` 设置全局超时: ```groovy pipeline { agent any options { timeout(time: 24, unit: 'HOURS') // 整个Pipeline超时24小时 } stages { stage('Long Running Task') { steps { sh './long_script.sh' // 长时间运行的任务 } } } } ``` #### 2. **针对特定阶段超时** 为单个阶段设置独立超时: ```groovy stage('Critical Stage') { options { timeout(time: 24, unit: 'HOURS') // 仅此阶段超时24小时 } steps { sh './critical_task.sh' } } ``` #### 3. **步骤块级超时** 包裹需要限制的步骤块: ```groovy steps { timeout(time: 24, unit: 'HOURS') { // 精确控制代码块 retry(3) { sh './unstable_script.sh' } } } ``` #### 关键参数说明: - `time`:超时时间值(整数) - `unit`:时间单位(`SECONDS`/`MINUTES`/`HOURS`) - `activity`:布尔值,`true` 表示无日志输出时触发超时(默认 `false`) > **注意**:超时触发后,Pipeline 会抛出 `org.jenkinsci.plugins.workflow.steps.FlowInterruptedException` 并中止执行[^1]。 #### 高级场景:嵌套超时控制 ```groovy timeout(time: 24, unit: 'HOURS') { parallel( // 并行任务也受超时约束 'TaskA': { sh './taskA.sh' }, 'TaskB': { timeout(time: 12, unit: 'HOURS') { // 嵌套超时 sh './taskB.sh' } } ) } ``` #### 验证方法: 添加超时测试阶段: ```groovy stage('Timeout Test') { steps { script { try { timeout(time: 1, unit: 'SECONDS') { // 测试1秒超时 sleep 5 // 故意超时 } } catch(e) { echo "Timeout triggered successfully" } } } } ``` #### 备选方案:外部中断 对于非Pipeline任务,可在Jenkins系统设置中配置: 1. 进入 **Manage Jenkins > System Configuration** 2. 在 `# of executors` 设置中找到 `Quiet period` 3. 设置 `Abort builds if stuck` 为 24 小时[^4] --- ### 相关问题 1. **如何区分全局超时和阶段级超时的优先级?** > 当同时存在时,阶段级超时会覆盖全局设置[^1]。 2. **超时触发后能否执行清理操作?** > 可通过 `post { failure { ... } }` 块定义超时后的清理步骤。 3. **如何监控即将超时的Pipeline?** > 使用 `timestamps` 步骤配合日志分析工具实时跟踪执行时长[^1]。 4. **超时设置对并行任务(parallel)的影响是什么?** > 外层超时作用于整个并行组,内层超时可单独控制子任务。 5. **为什么设置超时后任务仍在运行?** > 检查是否在 `agent none` 阶段使用超时,此时可能无法中断外部进程。 6. **如何实现无日志输出触发的超时?** > 添加参数 `activity: true`,例如:`timeout(time: 2, unit: 'HOURS', activity: true)` [^1]: Jenkins Pipeline语法文档 [^2]: 自动化部署流程实践 [^3]: Jenkins系统环境配置 [^4]: Jenkins系统设置路径 [^5]: 依赖包安装问题排查
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试开发Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值