我的Jenkins pipeline中retry重试功能不生效是什么原因?
问题原因
你的retry逻辑未生效是核心配置缺失导致的:
curl默认不会将HTTP请求错误识别为命令执行失败:curl只要本身进程正常启动执行,哪怕遇到4xx/5xx类的服务端错误,默认退出码也为0。而Jenkins的retry块只有捕获到步骤抛出的异常时才会触发重试,sh步骤默认只有收到非零退出码才会抛出异常,因此上传失败后Jenkins会认为步骤执行成功,直接退出。- 可选优化:建议调整
timeout和retry的嵌套顺序,把retry放在timeout内部,避免多次重试的总时长超出你的预期(你当前的写法是每次重试都有5分钟超时,总最长耗时15分钟,如果这是符合预期的可以不用改)。
修复方案
给curl添加-f(--fail)参数即可,该参数会让curl在HTTP请求返回4xx/5xx错误时主动返回非零退出码,触发sh步骤抛异常进入重试逻辑。修正后代码如下:
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId:'nexus-user', usernameVariable: 'NEXUS_USR', passwordVariable: 'NEXUS_PW']]) { final Integer maxTries = 3 Integer numTries = 1 retry(maxTries) { timeout(time: 5) { // Timeout in minutes println "Trying $numTries/$maxTries upload to file server." numTries++ sh """ curl -v -f -u $NEXUS_USR:$NEXUS_PW --upload-file $artifact $remoteUrl/$remoteDir/$artifact """ } } }
如果需要对连接超时、DNS解析错误等场景也增强重试判定,还可以额外给curl添加--retry 2参数,作为curl层面的重试补充,和Jenkins层面的重试形成双层保障。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

