Jenkins的任务配置修改在界面上是点击按钮、输入文字,但在代码中本质是处理一段xml格式的字符串,如果是你习惯了字符串直接操作,那么这篇文章可以作为一种格式的参考,如果你想要以xml的格式调整,那么这篇文章可以作为你的操作指南。
这篇文章对几个修改场景进行展示和介绍,基本可以涵盖全部的修改类型。
基本条件
这里使用代码调整配置,必然是到了涉及到需要修改配置项目特别多的时候,如果是只有一个两个工程,那么有这个时间还不如直接在界面上调。
基本思路
使用的时候如果对这个项目的修改还不熟练,那么可以复制一个工程出来,手动修改下,看下这两个配置字符串有什么区别。
配置值的修改场景
基本方法是提取到对应值的最后一层节点,然后修改这个值。比如前面提到过的修改任务节点的配置。
# coding:utf-8
from xml.dom.minidom import parseString
import requests
from requests.auth import HTTPBasicAuth
host = '127.0.0.1'
auth = HTTPBasicAuth(username='bob', password='110c70ea8f41063e377aca53007a1ca2e4')
jenkins_url = f'http://{host}:8080'
job_name = 'priority_test'
config_url = f'{jenkins_url}/job/{job_name}/config.xml'
response = requests.get(config_url, auth=auth)
print(response.status_code)
print(response.text)
dt = parseString(response.text)
collection = dt.documentElement
assign_node = collection.getElementsByTagName("assignedNode")[0]
label = assign_node.firstChild.data
print(label)
assign_node.firstChild.data = 'test123'
config_data = dt.toxml().encode('utf-8')
content_length = len(config_data)
headers = {
'Content-Length': str(content_length),
'Host':host
}
response_post = requests.post(config_url,data=config_data,headers=headers,auth=auth)
print(response_post.status_code)
print(response_post.text)
(获取和更新配置的主体框架部分1-16,22-30行后续将不再展示)
在读取配置的时候,打印出这个节点是在assignedNode tag下,所以在代码中提取除了这个标签的第一个对象,得到后修改其中第一个子节点的数据data即可。
无此项配置的场景1
先是项目中没有一类配置,整个配置层级上都是空的情况。
比如刚才的配置文件里没有parameter
参照前面的思路,找到另外一个工程,配置参数后打印配置文件。 可以发现配置参数的最高层级在properties下面,这一层原配置文件是有的,ParametersDefinitionProperty是参数的第一层,parameterDefinitions是第二层,这两层都要自行重建。
我们目前是一个都没有,所以整个层级都要建立起来。采用的是节点附加的方式。
先将这个配置的字符串整个复制过来,再转化为节点后附加到属性节点的后方。取得的上级节点是properties。
parameter_str = """<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.TextParameterDefinition>
<name>name</name>
<defaultValue>tom</defaultValue>
<trim>false</trim>
</hudson.model.TextParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>"""
dt_parameter = parseString(parameter_str)
collection_parameter = dt_parameter.documentElement
properties_node = collection.getElementsByTagName("properties")[0]
properties_node.appendChild(collection_parameter)
无此项配置场景2
前面因为没有参数配置项,所以需要把上级节点建立起来,第二个场景只需要加参数就可以了。以文本参数批量添加为例:
param_template = """<hudson.model.TextParameterDefinition>
<name>{}</name>
<defaultValue>{}</defaultValue>
<trim>false</trim>
</hudson.model.TextParameterDefinition>"""
parameters = {
'age': 2.5,
'hobby': 'basketball',
'action': 'sing,jump,rap',
}
parameter_definitions_node = collection.getElementsByTagName("parameterDefinitions")[0]
for key, value in parameters.items():
parameter_str = param_template.format(key, value)
dt_parameter = parseString(parameter_str)
collection_parameter = dt_parameter.documentElement
parameter_definitions_node.appendChild(collection_parameter)
正常处理完的工程会看到这些。
处理时要自行判断参数是否已经存在。重复操作并不会引发异常,需要特别留意