如何让Jenkins Pipeline在curl返回无效状态码时执行完所有请求再失败?
解决Jenkins Pipeline中curl失败后继续执行后续命令再失败的问题
问题的核心在于Jenkins Pipeline的sh步骤默认会在命令返回非0退出码时直接终止流水线。当第一个curl无法连接目标URL时,curl返回退出码7,触发sh步骤抛出异常,导致第二个curl根本没机会执行。
要实现"先执行完所有curl请求,再统一判断失败"的需求,可以按以下方式修改你的Pipeline:
pipeline { agent any stages { stage('Check URL Status Codes') { steps { script { // 执行第一个curl,通过|| true确保命令始终返回0,避免sh步骤终止流水线 def res1 = sh(returnStdout: true, script: 'curl -o /dev/null -sf -w "%{http_code}" http://xyz1.jsp || true').trim().toInteger() echo "First URL status code: ${res1}" // 执行第二个curl,同样处理 def res2 = sh(returnStdout: true, script: 'curl -o /dev/null -s -w "%{http_code}" http://xyz2.jsp || true').trim().toInteger() echo "Second URL status code: ${res2}" // 统一判断状态码,若存在无效的000则手动触发构建失败 if (res1 == 0 || res2 == 0) { // 000转成Integer后是0 error("构建失败:URL返回无效状态码。第一个URL: ${res1},第二个URL: ${res2}") } } } } } }
关键修改点说明:
|| true后缀:在每个curl命令后添加|| true,无论curl本身返回什么退出码,整个shell命令的退出码都会变成0,这样sh步骤不会抛出异常,流水线会继续执行第二个curl。- 统一错误判断:执行完两个curl后,检查获取到的状态码(注意
000转成Integer后是0),如果存在无效状态码,调用error()方法手动标记构建失败,同时输出清晰的错误信息。 trim()替代replace(' ',''):更简洁地去除输出中的空格和换行符,避免转换Integer时出错。
这样就能保证所有curl请求都执行完毕后,再根据结果决定是否让构建失败。
内容的提问来源于stack exchange,提问作者varun dunga
相关产品推荐
相关产品推荐

