如何通过Jenkins REST API获取刚触发的构建编号?
获取Jenkins远程触发的构建编号方案
下面是几种可靠的方法,避免依赖lastBuild带来的冲突问题:
方法1:利用响应头Location获取构建编号
当你发送POST请求触发构建时,Jenkins成功响应的Location头会直接返回新构建的完整URL,其中包含构建编号。如果你的Jenkins启用了CSRF保护,需要先获取crumb再请求,步骤如下:
- 获取CSRF crumb:
CRUMB=$(curl -u "用户名:密码/API令牌" "http://{IP}:{PORT}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,':',//crumb)") - 触发构建并捕获响应头:
响应头里的Location值类似curl -u "用户名:密码/API令牌" -H "$CRUMB" -v -X POST "http://{IP}:{PORT}/job/subjob/buildWithParameters?token=你的令牌" 2>&1 | grep -i "Location:"http://{IP}:{PORT}/job/subjob/123/,末尾的123就是你触发的构建编号。
方法2:通过自定义唯一参数标记构建
触发构建时传入一个唯一标识参数(比如UUID),之后通过API查询匹配该参数的构建:
- 生成唯一标识并触发构建:
# Linux/macOS环境生成UUID UNIQUE_ID=$(uuidgen) curl -u "用户名:密码/API令牌" -X POST "http://{IP}:{PORT}/job/subjob/buildWithParameters?token=你的令牌&BUILD_MARKER=$UNIQUE_ID" - 查询匹配参数的构建编号:
该方法需要安装curl -u "用户名:密码/API令牌" "http://{IP}:{PORT}/job/subjob/api/json?tree=builds[number,actions[parameters[name,value]]]" | jq --arg id "$UNIQUE_ID" '.builds[] | select(.actions[]?.parameters[]? | .name == "BUILD_MARKER" and .value == $id) | .number'jq解析JSON响应,返回的数字即为目标构建编号。
方法3:通过构建队列追踪构建编号
触发的构建会先进入Jenkins队列,你可以通过队列项查询关联的构建编号:
- 触发构建并捕获队列项URL:
这里的QUEUE_URL格式类似QUEUE_URL=$(curl -u "用户名:密码/API令牌" -v -X POST "http://{IP}:{PORT}/job/subjob/buildWithParameters?token=你的令牌" 2>&1 | grep -i "Location:" | awk '{print $2}' | tr -d '\r\n')http://{IP}:{PORT}/queue/item/456/ - 轮询队列状态,直到获取构建编号:
该方法适合构建需要排队的场景,轮询直到队列项关联到实际构建实例。while true; do BUILD_URL=$(curl -u "用户名:密码/API令牌" "$QUEUE_URL/api/json" | jq -r '.executable.url') if [ "$BUILD_URL" != "null" ]; then BUILD_NUMBER=$(echo "$BUILD_URL" | awk -F'/' '{print $(NF-1)}') echo "你的构建编号是: $BUILD_NUMBER" break fi sleep 2 done
内容的提问来源于stack exchange,提问作者user1844328
相关产品推荐
相关产品推荐

