jenkins api调用
实现逻辑:
1.判断是否有这个view,没有就创建
2.找出old view视图下所有的job
3.将old view视图下所有的job复制一份并且修改成自己想要的名字
4.将修改好的job加入到新创建的view视图当中
5.批量修改jenkins pipline流水线内容
需要pip install requests python-jenkins模块
代码如下:
import jenkins import requests from xml.etree import ElementTree class Jenkins(object): def __init__(self, url, username, password): self.url = url self.username = username self.password = password self.server = jenkins.Jenkins(url=url, username=username, password=token) def get_jobs_for_view(self,view): jobs = self.server.get_jobs(view_name=view) for job in jobs: yield job["name"] def create_new_view(self, view_name): res = self.server.view_exists(view_name) if res: print(f"{view_name}视图已存在,无法创建") else: self.server.create_view(view_name, jenkins.EMPTY_VIEW_CONFIG_XML) def copy_job(self, old_job_name, old_prefix, new_prefix): new_job_name = old_job_name.replace(old_prefix, new_prefix) is_exists = self.server.job_exists(new_job_name) if is_exists: print(f"{new_job_name}---job已存在,无法创建") else: self.server.copy_job(old_job_name, new_job_name) print(new_job_name, "创建成功") return new_job_name def job_add_view(self, view, job_name): data = { "name": job_name } response = requests.post(url=f"{self.url}/view/{view}/addJobToView", data=data, auth=(self.username,self.password)) if response.status_code == 200: print(f"{job_name}---添加到---{view}---视图成功") else: print(f"{job_name}---添加到---{view}---视图失败") def update_pipline(self,url, job_name, old_string, new_string): try: res = requests.get(url=f"{url}/job/{job_name}/config.xml", auth=(self.username, self.password)) if res.status_code == 200: xml_content = res.text xml_root = ElementTree.fromstring(xml_content) pipeline_element = xml_root.find('./definition/script') pipeline_element.text = pipeline_element.text.replace(old_string,new_string) data = ElementTree.tostring(xml_root, encoding='UTF-8') update = requests.post(url=f"{url}/job/{job_name}/config.xml", data=data, auth=(self.username, self.password)) if update.status_code == 200: print(f"{job_name}更新成功") else: print(f"{job_name}更新失败") else: print("获取xml失败") except: print(f"{job_name}出错,可能是没有用到pipline,请检查job") if __name__ == '__main__': url = "http://xxxxxx:8888/" token = "1134bc9b170xxxxxxxxx" username = 'admin' old_view = "xxx-测试环境-NEW" new_view = "test10" old_prefix = "xxx-testplat-test" new_prefix = "mytest" obj = Jenkins(url=url, username=username, password=token) #创建视图,批量复制job,批量添加到view视图中 # obj.create_new_view(view_name=new_view) # for old_job in obj.get_jobs_for_view(old_view): # new_job = obj.copy_job(old_job_name=old_job, old_prefix=old_prefix,new_prefix=new_prefix) # obj.job_add_view(view=new_view, job_name=new_job) #批量修改pipline流水线内容 old_string = "xxxxx:8888" new_string = "xxxxx:7777" for job in obj.get_jobs_for_view(new_view): obj.update_pipline(url=url, job_name=job, old_string=old_string, new_string=new_string)
继上面代码,新增添加git构建参数需求
#添加git参数 old_string = '''</jenkins.model.BuildDiscarderProperty>''' new_string = '''</jenkins.model.BuildDiscarderProperty> <hudson.model.ParametersDefinitionProperty> <parameterDefinitions> <net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition plugin="git-parameter@0.9.17"> <name>branch</name> <uuid>b93ce858-739b-4c16-8ef8-fd7fa1a877d9</uuid> <type>PT_BRANCH</type> <branch></branch> <tagFilter>*</tagFilter> <branchFilter>.*</branchFilter> <sortMode>NONE</sortMode> <defaultValue>origin/master</defaultValue> <selectedValue>NONE</selectedValue> <quickFilterEnabled>false</quickFilterEnabled> <listSize>5</listSize> <requiredParameter>false</requiredParameter> </net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition> </parameterDefinitions> </hudson.model.ParametersDefinitionProperty>''' for job in obj.get_jobs_for_view(myobject): job_config_xml = obj.server.get_job_config(job) if "设置环境变量" in job_config_xml: if "<branch></branch>" not in job_config_xml: new_xml = job_config_xml.replace(old_string,new_string) obj.server.reconfig_job(job, new_xml) print(f"{job}添加参数完毕!!")