如何通过Jenkins API筛选定时触发的夜间构建并实现失败重触发?
解决Jenkins定时器构建筛选与重触发问题
1. 用Jenkins REST API结合jq筛选目标构建
直接访问job页面没法精准过滤构建,我们得借助Jenkins的JSON API拉取构建元数据,再用jq工具筛选出定时器触发且在夜间时间范围内的最新构建。
先计算时间范围(比如取最近24小时,覆盖夜间构建窗口),再调用API做过滤:
# 计算24小时前的毫秒时间戳(Jenkins API用毫秒级时间戳) START_TIMESTAMP=$(( $(date +%s) - 86400 ))000 # 获取符合条件的构建列表,仅保留核心字段 filtered_builds=$(curl --insecure --user test:test 'https://jenkins.domain.com/job/leaves/job/tenant/job/develop/api/json?tree=builds[number,status,timestamp,triggerInfo]' | \ jq --arg start_ts "$START_TIMESTAMP" '.builds[] | select(.timestamp >= $start_ts) | select(.triggerInfo | has("timer"))') # 提取最新构建(Jenkins返回的builds默认按时间倒序排列,直接取第一个) latest_timer_build=$(echo "$filtered_builds" | jq '.[0]') build_number=$(echo "$latest_timer_build" | jq -r '.number') build_status=$(echo "$latest_timer_build" | jq -r '.status')
2. 检查状态并执行重触发
如果筛选到的最新构建状态是FAILURE,就调用Jenkins的rebuild API触发重跑:
if [ "$build_status" = "FAILURE" ]; then echo "构建#${build_number}失败,开始重触发..." curl --insecure --user test:test -X POST "https://jenkins.domain.com/job/leaves/job/tenant/job/develop/${build_number}/rebuild" echo "重触发请求已发送" else echo "最新定时器构建#${build_number}状态为${build_status},无需操作" fi
3. 整合为定时脚本并部署
把上面的代码保存为jenkins_night_build_check.sh,给它加执行权限:
chmod +x jenkins_night_build_check.sh
再用cron设置每日定时运行(比如早上8点检查夜间构建结果):
# 编辑cron任务 crontab -e # 添加以下行(替换脚本路径和日志路径) 0 8 * * * /path/to/jenkins_night_build_check.sh >> /var/log/jenkins_build_check.log 2>&1
额外注意事项
- 确保服务器上已安装
jq工具(Debian/Ubuntu用apt install jq,macOS用brew install jq) - 验证Jenkins用户
test拥有读取构建信息和触发构建的权限(在Jenkins全局安全配置中配置) - 如果夜间构建有固定时间窗口(比如每晚20:00到次日6:00),可以调整
START_TIMESTAMP的计算逻辑,精准匹配这个时间段
内容的提问来源于stack exchange,提问作者Alfador
相关产品推荐
相关产品推荐

