You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:02:41