多线程远程触发Jenkins作业时如何无需预取构建号追踪对应构建结果
多线程并发触发Jenkins作业追踪方案
解决并发场景下构建号匹配错误的核心逻辑是利用Jenkins触发接口返回的独有队列ID追踪构建,完全不需要提前预取下一个构建号:
1. 触发构建提取唯一队列ID
Jenkins在buildWithParameters接口触发成功后,会返回状态码201,响应头的Location字段会返回当前请求专属的队列地址,队列ID全局唯一,不会和其他并发请求冲突。
示例代码:
import requests import time # 替换为你的Jenkins认证信息 JENKINS_AUTH = ("用户名", "Jenkins API令牌") JENKINS_TRIGGER_TOKEN = "myToken" # 触发构建,参数建议通过POST body传递 trigger_url = f"{serverURL}/job/{jobName}/buildWithParameters?token={JENKINS_TRIGGER_TOKEN}" # 若Jenkins开启CSRF防护,需先获取crumb加入请求头 crumb_resp = requests.get(f"{serverURL}/crumbIssuer/api/json", auth=JENKINS_AUTH) crumb_info = crumb_resp.json() req_headers = {crumb_info["crumbRequestField"]: crumb_info["crumb"]} # 发送触发请求 trigger_resp = requests.post( trigger_url, auth=JENKINS_AUTH, headers=req_headers, data={"构建参数1": "参数值", "构建参数2": "参数值"} ) # 获取当前请求专属队列地址 queue_url = trigger_resp.headers["Location"]
2. 轮询队列获取对应构建号
队列刚生成时还未分配构建号,轮询队列的API接口,等待executable字段生成后,即可拿到当前请求对应的唯一构建号:
build_num = None build_detail_url = None # 轮询队列最多30次,每次间隔1秒,可根据Jenkins调度速度调整 for _ in range(30): queue_resp = requests.get(f"{queue_url}/api/json", auth=JENKINS_AUTH) queue_data = queue_resp.json() # executable字段生成代表构建已被调度分配构建号 if "executable" in queue_data: build_num = queue_data["executable"]["number"] build_detail_url = queue_data["executable"]["url"] break time.sleep(1) if not build_num: raise TimeoutError("Jenkins队列调度超时,请检查作业是否被阻塞")
3. 追踪构建执行结果
拿到专属构建地址后即可查询构建状态、执行结果等信息,之前获取不到信息是因为请求的是作业总地址,而非单个构建的详情地址:
# 轮询等待构建完成 while True: build_resp = requests.get(f"{build_detail_url}/api/json", auth=JENKINS_AUTH) build_data = build_resp.json() # building字段为False代表构建已结束 if not build_data["building"]: break time.sleep(2) # 构建结果存储在result字段,常见返回值:SUCCESS/FAILURE/ABORTED build_result = build_data["result"] print(f"本次触发构建{build_num}执行结果:{build_result}")
以上方案全程不需要提前预取构建号,每个线程的请求都通过专属队列ID追踪,完全规避并发场景下的构建号匹配错误问题。
内容的提问来源于stack exchange,提问作者Ziv M
相关产品推荐
相关产品推荐

