如何通过Curl调用Jenkins API查询指定Job中带特定参数的最后一次构建状态?
通过Jenkins API查询指定参数的最后一次构建状态
当然可以实现这个需求!不用迁移到Pipeline,用Curl配合简单的shell脚本就能搞定。下面是具体的操作步骤:
1. 核心API请求:获取任务的构建列表
Jenkins提供了REST API来查询任务的构建信息,我们可以先请求目标任务的构建列表,同时指定返回字段来减少数据量。
使用Curl发起请求的示例:
curl -u "你的Jenkins用户名:你的API令牌" "http://你的Jenkins地址/job/目标任务名/api/json?tree=builds[number,result,actions[parameters[name,value]]]"
tree参数用来过滤返回的JSON字段,只保留我们需要的构建编号(number)、构建结果(result)、以及构建的参数信息(actions.parameters)- 注意替换命令中的占位符:用户名、API令牌、Jenkins地址、目标任务名
2. 用jq过滤出符合参数条件的最新构建
返回的JSON里包含所有构建记录,我们需要筛选出参数certainParam=certainValue的构建,并且取最新的那一个(Jenkins返回的builds是按时间倒序排列的,最新的在最前面)。
可以用jq工具来解析和过滤JSON,示例命令如下:
curl -s -u "你的Jenkins用户名:你的API令牌" "http://你的Jenkins地址/job/目标任务名/api/json?tree=builds[number,result,actions[parameters[name,value]]]" | jq '.builds[] | select(.actions[]?.parameters[]? | select(.name == "certainParam" and .value == "certainValue")) | {number: .number, result: .result}' | jq -s '.[0]'
- 第一个
jq命令筛选出符合参数条件的构建,输出它的编号和结果 - 第二个
jq -s '.[0]'取筛选结果中的第一条(也就是最新的构建)
3. 在Freestyle任务中实现等待逻辑
你可以在Freestyle任务里添加一个「Execute shell」步骤,用下面的脚本实现完整的等待逻辑:
# 配置变量,请根据实际情况修改 JENKINS_URL="http://你的Jenkins地址" TARGET_JOB="目标任务名" JENKINS_USER="你的Jenkins用户名" API_TOKEN="你的API令牌" PARAM_NAME="certainParam" PARAM_VALUE="certainValue" # 获取最新的符合参数条件的构建信息 LATEST_MATCHED_BUILD=$(curl -s -u "${JENKINS_USER}:${API_TOKEN}" "${JENKINS_URL}/job/${TARGET_JOB}/api/json?tree=builds[number,result,actions[parameters[name,value]]]" | jq -r '.builds[] | select(.actions[]?.parameters[]? | select(.name == "'"${PARAM_NAME}"'" and .value == "'"${PARAM_VALUE}"'")) | {number: .number, result: .result}' | jq -s '.[0]') # 解析构建编号和结果 BUILD_NUM=$(echo "${LATEST_MATCHED_BUILD}" | jq -r '.number') BUILD_RESULT=$(echo "${LATEST_MATCHED_BUILD}" | jq -r '.result') # 判断是否需要等待 if [[ "${BUILD_RESULT}" == "null" ]]; then echo "发现相同参数的构建#${BUILD_NUM}正在运行,开始等待..." # 循环检查构建状态,直到完成 while true; do # 查询当前构建的实时状态 CURRENT_STATUS=$(curl -s -u "${JENKINS_USER}:${API_TOKEN}" "${JENKINS_URL}/job/${TARGET_JOB}/${BUILD_NUM}/api/json" | jq -r '.result') if [[ "${CURRENT_STATUS}" != "null" ]]; then echo "构建#${BUILD_NUM}已完成,结果:${CURRENT_STATUS}" # 按照需求:如果目标构建失败,直接跳过等待继续当前任务 if [[ "${CURRENT_STATUS}" == "FAILURE" ]]; then echo "目标构建失败,无需等待,继续当前任务" break fi echo "目标构建完成,继续当前任务" break fi echo "构建仍在运行,30秒后再次检查..." sleep 30 done else echo "没有找到相同参数的运行中构建,直接继续当前任务" fi
4. 注意事项
- 权限问题:确保你的Jenkins用户拥有读取目标任务的权限,否则API请求会返回403错误
- jq工具安装:如果Jenkins的执行节点上没有安装jq,需要先安装(比如Ubuntu用
apt-get install jq,CentOS用yum install jq) - API令牌生成:不要用Jenkins密码,建议在用户个人设置里生成专属的API令牌(路径:Jenkins主页 → 点击用户名 → 设置 → API Token)
内容的提问来源于stack exchange,提问作者jessefournier
相关产品推荐
相关产品推荐

