[Jenkins]如何自动停止超时任务?

本文介绍了一种使用Jenkins Job Watchdog监控并自动终止超时任务的方法,通过在阿里云部署Jenkins master和本地部署Jenkins slave,确保master不会被挂起,从而解决网络不稳定导致的任务挂起问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       公司的Jenkins服务器运行一段时间了,每天编译github cocos2d-x仓库的所有pull request,还算稳定。但有个问题比较郁闷,由于实际执行编译的slave就放在办公室里,网络不太稳定,特别是访问github时,有时会导致整个编译任务挂起。由于我们在每个slave上只放了一个执行单元(Excutor),只要一个编译任务挂起,就会导致整个jenkins挂起,所有后续的编译任务都在排队。这个时候只能手动杀掉挂起的任务,以便其他排队的任务可以继续执行。这个问题很蛋疼,因为我们不可能派个人一直盯着jenkins主站,等发现有任务挂起时,已经有10几个pull request在排队了。

    被这个问题折磨了几次之后,我下定决心要把它解决掉,分析了一下,其实可以用jenkins自己来解决:构建一个监控任务(jenkins-job-watchdog),每几分钟跑一次,看看其他任务有没有超时,如果超时,就把它关掉,呵呵,思路并不复杂。熟悉jenkins的童鞋可能会注意到:如果jenkins已经被挂起,就没有办法执行watchdog任务,怎么可能杀掉挂起的任务呢?呵呵,诀窍在于部署:在阿里云上部署一台jenkins master,在公司本地网络部署多台jenkins slave,master上不执行实际的编译任务,只执行触发器任务:响应任务请求,触发实际编译任务(在slave上执行),然后马上结束。这样,就保证了master不会被挂起,只要在master上执行watch-dog任务就可以了。那么:如何获取当前运行的任务,要怎么结束任务呢?必须介绍一下强大的jenkins python api, github地址:

https://github.com/salimfadhley/jenkinsapi

用法很简单:

J = Jenkins('http://localhost:8080',username,password)

for key,job in J.iteritems():

last_build = job.get_last_buildnumber()//获得最后一个构建的编号

 running = build.is_running()//任务是否在运行

        start_time =  last_build.get_timestamp()//获得构建的开始时间

       last_build.stop()//停止构建

将watchdog部署上去以后,还可以分别指定每个任务的超时时间,一旦超时就会被自动杀掉,再也不用半夜起床检查jenkins了~~

<think>嗯,用户需要的是一个Jenkins的XML配置文件,实现每10秒发送HTTP请求获取服务端日志,过滤打印,直到另一个HTTP请求返回成功才停止。首先,我得确定应该使用Jenkins的哪种任务类型,比如自由风格项目或者流水线。考虑到需要循环和条件判断,流水线脚本可能更适合,因为它可以用Groovy语法更灵活地处理循环和条件。 接下来,用户提到的每10秒发送HTTP请求,这可能需要使用循环结构,比如一个while循环,里面包含发送HTTP请求的步骤。然后过滤日志,可能需要用到shell命令或者Jenkins的日志处理插件。不过用户可能希望直接在配置里处理,所以考虑使用curl命令获取日志,然后用grep过滤。 另一个HTTP请求返回成功作为停止条件,这里可能需要两个不同的HTTP端点:一个用于获取日志,另一个用于检查状态。在每次循环中,先获取日志并过滤,然后检查状态接口是否返回成功。如果成功,就退出循环。 需要注意的是,Jenkins的流水线默认有超时设置,如果任务运行时间过长可能会被终止,所以可能需要设置超时时间或者调整Jenkins的系统配置。不过用户可能暂时不需要考虑这个,先提供一个基本的配置,再在注意事项里提醒。 另外,要确保HTTP请求的工具可用,比如安装curl,并且在Jenkins的脚本中正确使用。可能需要使用Pipeline的步骤,比如httpRequest插件,但用户可能没有安装,所以用sh命令执行curl更通用。 最后,把所有这些步骤整合到一个Jenkinsfile里,使用Declarative Pipeline或者Scripted Pipeline。Declarative的结构更清晰,适合示例。需要定义agent,stages,然后在steps里写循环逻辑。不过Declarative的steps里直接写循环可能有限制,所以可能需要用script块来嵌入Groovy代码。 可能的步骤: 1. 使用agent any指定运行节点。 2. 创建一个stage,包含一个循环,使用while(true)来持续执行。 3. 在循环内,使用sh执行curl获取日志,保存到变量或文件中,然后用grep过滤。 4. 再次使用curl检查状态接口,获取HTTP状态码或响应内容,判断是否成功。 5. 如果成功,break跳出循环,否则sleep 10秒。 需要注意处理错误,比如curl失败的情况,可能需要增加重试或错误处理。但用户的需求可能只需要基础结构,所以先保持简单。 然后,把这些转换成Jenkins的Declarative Pipeline语法,可能需要用script块包裹Groovy代码。同时,确保使用合适的插件,比如httpRequest,但为了兼容性,还是用sh curl更稳妥。 最后,测试这个脚本是否能在Jenkins中正确运行,确保每10秒执行一次,直到成功。可能需要在日志中打印过滤后的内容,用echo或者直接输出到控制台。 现在,把这些整理成一个完整的Jenkinsfile,并加入必要的注释,说明需要替换的URL和其他参数。同时提醒用户注意事项,比如安装curl,调整超时时间,以及根据实际情况修改过滤条件和成功条件。</think>以下是一个实现该需求的Jenkins Pipeline脚本(Jenkinsfile)完整示例。这个脚本使用声明式语法,通过轮询机制实现持续监控: ```xml <?xml version='1.1' encoding='UTF-8'?> <flow-definition plugin="workflow-job@1239.v585c869eea_4a"> <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@3607.vc869b_3d8d3e"> <script> pipeline { agent any parameters { string(name: 'LOG_URL', defaultValue: 'http://your-service/logs', description: '日志接口URL') string(name: 'STATUS_URL', defaultValue: 'http://your-service/status', description: '状态检查URL') } stages { stage('Monitor Logs') { steps { script { def stopLoop = false while(!stopLoop) { // 步骤1:获取并过滤日志 def logContent = sh( script: "curl -s ${params.LOG_URL} | grep 'ERROR'", // 示例过滤ERROR日志 returnStdout: true ).trim() if (logContent) { echo "Filtered Logs:\n${logContent}" } else { echo "No matching logs found" } // 步骤2:检查服务状态 def statusCode = sh( script: "curl -o /dev/null -s -w '%{http_code}' ${params.STATUS_URL}", returnStdout: true ).trim() if (statusCode == "200") { // 根据实际成功状态码调整 echo "Service returned success status. Stopping..." stopLoop = true } else { echo "Service not ready. Retrying in 10 seconds..." sleep 10 } } } } } } } </script> <sandbox>true</sandbox> </definition> </flow-definition> ``` 使用说明: 1. 将此配置保存为 `Jenkinsfile` 或通过Jenkins界面创建Pipeline项目后粘贴 2. 需要调整的关键参数: - `LOG_URL`:实际日志接口地址 - `STATUS_URL`:服务状态检查接口地址 - `grep 'ERROR'`:根据实际需求修改日志过滤条件 - `statusCode == "200"`:根据实际成功状态码调整 3. 需要满足的环境要求: - Jenkins服务器需要安装curl工具 - Pipeline插件版本需支持声明式语法 - 确保网络可达目标服务地址 4. 运行特性: - 每10秒轮询一次日志接口 - 自动过滤并显示包含"ERROR"的日志(可自定义过滤条件) - 持续检查状态接口,当返回200状态码时停止 注意事项: 1. 如果任务需要长时间运行,建议在Jenkins全局配置中调整超时设置 2. 建议添加超时控制(可在while循环内添加超时计数器) 3. 生产环境建议添加重试次数限制和异常处理 4. 可根据实际需求修改HTTP请求头(如添加认证信息): ```shell curl -H "Authorization: Bearer <TOKEN>" ... ``` 5. 如需持久化日志,可添加`archiveArtifacts`步骤保存日志文件 建议将此Pipeline与Jenkins的Build Trigger结合使用,实现自动化触发监控流程。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值