前提:主要是以最后一次构建参数为模板,覆盖本地的config.xml 覆盖之前会备份一个config_temp.xml 防止出现意外
环境:3.7.3
引用的库: python-jenkins,requests
# 改变初始的build 用最新的重新写
import os.path
import time
import jenkins
import requests
import xml.etree.cElementTree as ET
project_path = 'C:\\Users\\WIN10\\.jenkins\\jobs\\build_wujinta'
# 修改xml 用当前的构建复制给本地xml
def xiugai_xml(local: ET.ElementTree, current: ET.ElementTree):
if local.find('name').text != current.find('name').text:
return
defaultValue = local.find('defaultValue')
value = current.find('value')
defaultValue.text = value.text
def get_xml(path: str):
tree = ET.parse(path)
return tree
def load_build_number():
with open(os.path.join(project_path, 'nextBuildNumber'), 'r', encoding='utf-8') as f:
return f.read().replace('\n', '').strip()
def update_local_config():
# 获取下次构建配置索引,用来寻找最后一次构建配置
build_number = load_build_number()
local_xml_path = os.path.join(project_path, 'config.xml')
# 获取本地build初始config.xml配置
local_tree = get_xml(local_xml_path)
local_root = local_tree.getroot()
#如果本地没有备份 则默认备份一下config.xml 以防出问题
config_temp = os.path.join(project_path,'config_temp.xml')
if not os.path.exists(config_temp):
local_tree.write(config_temp,encoding='utf-8')
# 寻找构造参数的父节点 根据key=value保存节点 用来赋值
parameterDefinitions = local_root.find(
'./properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions')
local_map = {}
for param in parameterDefinitions:
local_map[param.find('name').text] = param
# 根据下次构建的索引-1 得到最后一次构建的xml 数据
current_xml_path = os.path.join(project_path, 'builds', str(int(build_number) - 1), 'build.xml')
current_xml = get_xml(current_xml_path)
current_root = current_xml.getroot()
# 寻找修改后构造参数的父节点 根据key=value保存节点 用来赋值
parameters = current_root.find('./actions/hudson.model.ParametersAction/parameters')
current_map = {}
for param in parameters:
current_map[param.find('name').text] = param
# 根据配置的key 找到对应的初始配置,进行修改
for k, v in current_map.items():
if k not in local_map:
print(f"本地配置找不到这个key:{k}")
continue
xiugai_xml(local_map.get(k), v)
# 把修改的值写入本地初始的config.xml中, 这样下次构建就是上次配置的最新参数
local_tree.write(local_xml_path, encoding='utf-8')
# 链接jenkins 启动调用reload 重启jenkins 重新读取config.xml初始配置
jenkins_server_url = 'http://127.0.0.1:8080'
admin = "账号"
token = "token或者密码"
server = jenkins.Jenkins(jenkins_server_url, username=admin, password=token)
server._request(requests.Request(
'POST', server._build_url("manage/reload")))
if __name__ == '__main__':
update_local_config()