Jenkins通过代码批量修改任务配置时的基本操作场景

286 阅读3分钟

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即可。

image.png  

无此项配置的场景1

先是项目中没有一类配置,整个配置层级上都是空的情况。

比如刚才的配置文件里没有parameter

image.png 参照前面的思路,找到另外一个工程,配置参数后打印配置文件。 可以发现配置参数的最高层级在properties下面,这一层原配置文件是有的,ParametersDefinitionProperty是参数的第一层,parameterDefinitions是第二层,这两层都要自行重建。

image.png

我们目前是一个都没有,所以整个层级都要建立起来。采用的是节点附加的方式。

先将这个配置的字符串整个复制过来,再转化为节点后附加到属性节点的后方。取得的上级节点是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)

正常处理完的工程会看到这些。

image.png

处理时要自行判断参数是否已经存在。重复操作并不会引发异常,需要特别留意

image.png