如何通过Jenkins API筛选带指定参数的正在构建任务(Bash脚本场景)
解决Jenkins API获取指定参数的正在运行任务问题
嘿,我帮你梳理下问题所在,然后给你可行的解决方案!
首先,你之前的API请求有两个核心问题:
- 你调用的是
computer端点,但XPath却试图从/hudson/job节点查询,这完全不匹配——computer端点返回的是Jenkins节点和执行器的结构,根节点下是computer列表,不是job列表。 - 你的
tree参数没有包含任务的actions/parameters数据,就算路径对了,也拿不到参数信息,根本没法过滤。
下面是具体的解决步骤和脚本示例:
1. 修正API请求,获取带参数的运行中任务
首先要调整API的tree参数,确保能拿到每个运行中任务的参数信息:
curl -s "https://jenkins.{company}.com/computer/api/xml?tree=computer[executors[currentExecutable[actions[parameters[name,value]],name,url]],oneOffExecutors[currentExecutable[actions[parameters[name,value]],name,url]]]"
这个请求会返回所有Jenkins节点上,普通执行器和临时执行器中正在运行的任务,包含任务名、URL,以及任务的参数列表(name和value)。
2. 在Bash中过滤指定参数的任务
我们可以用xmlstarlet(一个轻量的XML处理工具)来过滤XML数据,筛选出TAG参数值为web-2773的任务。
完整Bash脚本示例
#!/bin/bash # 配置你的Jenkins地址和目标TAG JENKINS_BASE_URL="https://jenkins.{company}.com" TARGET_TAG_VALUE="web-2773" # 如果Jenkins需要认证,取消下面的注释并替换为你的账号和API Token # AUTH="-u your_jenkins_username:your_api_token" # 获取运行中任务的XML数据 RUNNING_JOBS_XML=$(curl -s $AUTH "${JENKINS_BASE_URL}/computer/api/xml?tree=computer[executors[currentExecutable[actions[parameters[name,value]],name,url]],oneOffExecutors[currentExecutable[actions[parameters[name,value]],name,url]]]") # 过滤并输出符合条件的任务 echo "$RUNNING_JOBS_XML" | xmlstarlet sel -t \ -m "//currentExecutable[actions/parameters[name='TAG' and value='${TARGET_TAG_VALUE}']]" \ -v "name" -o " | 任务地址: " -v "url" -n
没有xmlstarlet?用xmllint替代
如果你的系统没有安装xmlstarlet,也可以用xmllint(大部分Linux系统默认自带),不过输出需要简单格式化:
# 提取符合条件的任务名和URL RESULTS=$(echo "$RUNNING_JOBS_XML" | xmllint --xpath "//currentExecutable[actions/parameters[name='TAG' and value='${TARGET_TAG_VALUE}']]/name/text() | //currentExecutable[actions/parameters[name='TAG' and value='${TARGET_TAG_VALUE}']]/url/text()" -) # 格式化输出(每两行一组:任务名+URL) echo "$RESULTS" | paste - - | awk '{print $1 " | 任务地址: " $2}'
关键说明
- 为什么用
computer端点?因为它能覆盖所有Jenkins节点(包括主节点和代理节点)上的所有运行中任务,不管是普通执行器还是临时执行器的任务都能拿到。 - 认证问题:如果你的Jenkins开启了权限验证,一定要在curl命令中加上
-u 用户名:API_TOKEN,API Token可以在Jenkins个人设置中生成。
内容的提问来源于stack exchange,提问作者XorX
相关产品推荐
相关产品推荐

