如何重新触发因超时失败的Jenkins任务?含命令行与Pipeline方案
Jenkins超时任务重触发方案说明
一、现有重试配置的问题
你提供的重试版Pipeline配置存在多处不合理,无法正常实现预期的自动重试逻辑:
- 语法缺失:
try/catch、retry块均未补充闭合大括号,直接运行会抛出语法错误 - 错误无过滤:只要Stage执行报错就会触发重试,不会区分是超时异常还是脚本错误、环境异常等其他问题,会导致不必要的重试
- 存在阻塞步骤:
input "Timeout has been exceeded"会暂停任务等待人工确认,完全不符合自动重试的需求 - 代码冗余:测试执行的Shell步骤在
try块和retry块重复编写,后续维护修改成本高 - 超时逻辑不合理:Stage级的45分钟超时覆盖整个Stage生命周期,若触发重试,剩余可用时长会被首次执行占用,大概率会再次超时,重试逻辑无法正常跑完
二、通用超时失败任务自动重试方案
推荐优化后的Pipeline配置如下,仅针对超时错误自动重试,无需人工干预:
stage('Test') { steps { // retry(2)表示最多重试2次,加上首次执行总共最多运行3次,可根据需求调整次数 retry(2) { // 将timeout放在retry块内部,每次重试都有独立的45分钟超时计时 timeout(time: 45, unit: 'MINUTES') { script { try { sh label: '', script: 'cd ${WORKSPACE}/logs/test_1; /home/jenkins/tests/test_1.sh' sh label: '', script: 'cd ${WORKSPACE}/logs/test_2; /home/jenkins/tests/test_2.sh' } catch (error) { // 仅超时类错误触发重试,其他错误直接终止任务 if (error.getMessage().contains('Timeout has been exceeded') || currentBuild.currentResult == 'ABORTED') { println "检测到超时异常,触发自动重试" throw error // 抛出异常触发上层retry逻辑 } else { println "检测到非超时异常,终止任务执行" currentBuild.result = 'FAILURE' throw error } } } } } } }
该方案的优势:
- 每次重试都有独立的超时计时,不会被上一次执行占用时长
- 仅超时错误触发重试,避免资源浪费
- 测试执行逻辑仅写一次,无冗余代码
- 全程自动化执行,无需人工介入
三、命令行批量重触发指定时间内的超时失败任务
提前配置好Jenkins CLI工具、对应Jenkins实例的认证信息后,可使用如下脚本批量重触发目标任务:
# 基础配置,替换为你的实际信息 JENKINS_URL="http://你的Jenkins服务地址" JENKINS_USER="你的Jenkins用户名" JENKINS_TOKEN="你的Jenkins API令牌" CLI_PATH="本地jenkins-cli.jar的存放路径" # 时间范围配置:1小时对应3600秒,1周对应604800秒,按需切换 # 过去1小时 FILTER_TIME=$(($(date +%s) - 3600)) # 过去1周请替换为:FILTER_TIME=$(($(date +%s) - 604800)) # 遍历所有任务执行过滤重触发 java -jar $CLI_PATH -s $JENKINS_URL -auth $JENKINS_USER:$JENKINS_TOKEN list-jobs | while read job_name; do # 获取任务最近一次构建ID last_build_id=$(java -jar $CLI_PATH -s $JENKINS_URL -auth $JENKINS_USER:$JENKINS_TOKEN get-job "$job_name" | xmllint --xpath 'string(//lastBuild/number)' - 2>/dev/null) if [ -z "$last_build_id" ] || [ "$last_build_id" = "0" ]; then continue; fi # 过滤时间范围内、状态为ABORTED的构建 build_timestamp=$(java -jar $CLI_PATH -s $JENKINS_URL -auth $JENKINS_USER:$JENKINS_TOKEN show-build-info "$job_name" $last_build_id | grep 'timestamp:' | awk '{print $2}' | cut -d. -f1) if [ $build_timestamp -ge $FILTER_TIME ] && java -jar $CLI_PATH -s $JENKINS_URL -auth $JENKINS_USER:$JENKINS_TOKEN show-build-info "$job_name" $last_build_id | grep -q 'result: ABORTED'; then # 检查控制台输出是否包含超时关键字 if java -jar $CLI_PATH -s $JENKINS_URL -auth $JENKINS_USER:$JENKINS_TOKEN console "$job_name" $last_build_id | grep -q 'Timeout has been exceeded'; then echo "重触发超时任务:$job_name #$last_build_id" java -jar $CLI_PATH -s $JENKINS_URL -auth $JENKINS_USER:$JENKINS_TOKEN build "$job_name" -s fi fi done
内容的提问来源于stack exchange,提问作者Suhasini Subramaniam
相关产品推荐
相关产品推荐

