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

通过REST API修改Jenkins节点标签:curl命令修复及Python实现咨询

原curl命令错误原因
  • 身份认证格式错误:--user参数需要用用户名:密码格式,而非用户名@密码
  • 接口调用逻辑错误:Jenkins的/configure是页面接口,不支持直接通过query参数提交标签更新,需要向/configSubmit接口提交结构化参数,且默认需要携带CSRF校验头
修复后的curl实现

首先执行命令获取CSRF校验凭证(Jenkins默认开启CSRF防护,必须携带):

curl -k --user 你的用户名:你的密码 "https://jenkins-automation.itero.net/crumbIssuer/api/json"

返回结果示例:

{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"xxxxxxxxxxxx","crumbRequestField":"Jenkins-Crumb"}

取返回结果中的crumb和crumbRequestField值,执行标签更新命令:

注意:提交的json参数里的labelString是全量覆盖节点标签,如需新增/删除,要先获取当前节点的现有标签,修改后再提交

curl -k -X POST \
--user 你的用户名:你的密码 \
-H "Jenkins-Crumb: 上面拿到的crumb值" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "json={\"labelString\": \"现有标签 新标签lb\"}" \
"https://jenkins-automation.itero.net/computer/JL_private/configSubmit"
Python脚本实现方案

方案1:用requests原生调用接口(无需额外依赖功能库)

import requests
from requests.auth import HTTPBasicAuth

JENKINS_URL = "https://jenkins-automation.itero.net"
USERNAME = "你的用户名"
PASSWORD = "你的密码"
NODE_NAME = "JL_private"
# 要新增的标签
ADD_LABEL = "lb"
# 要删除的标签示例:DEL_LABEL = "old_label"

auth = HTTPBasicAuth(USERNAME, PASSWORD)

# 1. 获取CSRF crumb
crumb_resp = requests.get(f"{JENKINS_URL}/crumbIssuer/api/json", auth=auth, verify=False)
crumb_info = crumb_resp.json()
headers = {
    crumb_info["crumbRequestField"]: crumb_info["crumb"],
    "Content-Type": "application/x-www-form-urlencoded"
}

# 2. 获取节点当前标签
node_resp = requests.get(f"{JENKINS_URL}/computer/{NODE_NAME}/api/json", auth=auth, verify=False)
current_labels = node_resp.json()["assignedLabels"]
current_label_str = " ".join([lab["name"] for lab in current_labels if lab["name"] != NODE_NAME])

# 3. 生成新的标签字符串(新增逻辑,删除的话把对应标签从current_label_str移除即可)
new_label_str = f"{current_label_str} {ADD_LABEL}".strip()

# 4. 提交更新
update_resp = requests.post(
    f"{JENKINS_URL}/computer/{NODE_NAME}/configSubmit",
    auth=auth,
    headers=headers,
    data={"json": f'{{"labelString": "{new_label_str}"}}'},
    verify=False
)
update_resp.raise_for_status()
print("标签更新成功")

方案2:用python-jenkins库实现(更简便)

先安装依赖:pip install python-jenkins

import jenkins

JENKINS_URL = "https://jenkins-automation.itero.net"
USERNAME = "你的用户名"
PASSWORD = "你的密码"
NODE_NAME = "JL_private"
ADD_LABEL = "lb"

# 初始化连接
server = jenkins.Jenkins(JENKINS_URL, username=USERNAME, password=PASSWORD)
# 获取节点现有标签
old_label = server.get_node_info(NODE_NAME)["labelString"]
new_label = f"{old_label} {ADD_LABEL}".strip()
# 获取节点配置并更新标签字段
node_config = server.get_node_config(NODE_NAME)
new_config = node_config.replace(f"<label>{old_label}</label>", f"<label>{new_label}</label>")
# 提交配置更新
server.reconfig_node(NODE_NAME, new_config)
print("标签更新成功")

注意:两种方案都是全量覆盖标签,操作前务必确认修改后的标签内容正确,避免误删原有业务标签

内容的提问来源于stack exchange,提问作者Julya Levin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:03