用jenkins时会遇到复制任务的需求,将任务配置迁移到另一个部署了jenkins的机器上,这里记录下用到的方法
目录
方法1直接从机器上复制
方法2用rest api请求获取
复制jenkins配置到目录并加载
总结和备注
方法1直接从机器上复制
首先找到jenkins的安装路径,通常情况下默认的安装路径如下:
系统 | jenkins配置的路径 | 描述 |
win | %USERPROFILE%\.jenkins\ | 路径示例: C:\Users\DELL\.jenkins\jobs 其中%USERPROFILE%是win提供的路径变量,直接填进文件资源管理器就能访问到(win上还有很多这种路径变量) |
mac | ~/.jenkins/ | 路径示例: /home/macuser/.jenkins/jobs 其中~是用户路径 |
linux | ~/.jenkins/ | 路径示例: /home/DELL/.jenkins/jobs 其中~是用户路径 |
找到了jenkins目录,下一步就是复制其中jobs文件夹
看到上图里的jobs了么?就是他了,把里面的东西复制到新jenkins目录下,任务完成
方法2用rest api请求获取
实在不想复制任务,还可以用jenkins提供的rest api,也可以获取任务配置(当然这只是jenkins提供的api用途之一,通过rest api还能获取jenkins上其他配置信息,这里没涉及,就不多描述了)
注意看上图的右下角的rest api,可以用http方式获取到任务配置文件config.xml,那么我们可以用比较方便的获取任务到配置了,这里可以考虑用
直接请求或者用python+jenkinsapi插件(Python-Jenkins插件也是相似用法,因为没试过,就不写了)
import os
from jenkinsapi.jenkins import *
url = "http://127.0.0.1:8080/" # jenkins url地址,自行填写,注意要从有job目录开始填
username = "" # jenkins用户名,自行填写
password = "" # jenkins密码,自行填写
job_name_dir_path = "D:\Tools\Temp" # 保存的路径,自行修改填写
jenkins = Jenkins(url, username, password)
job_list = jenkins.get_jobs_list()
print(job_list)
for job_name in job_list:
job = jenkins.get_job(job_name)
# 读取任务目录 比如 Directory1/Job_d_1
xml_string = job.get_config()
# 分割目录结果为 ['Directory1', 'Job_d_1']
path_array: list = job_name.split("/")
# 倒序为每个目录插入 jobs,转换为实际的目录 ['jobs','Directory1','jobs','Job_d_1']
for a in range(len(path_array) - 1, -1, -1):
path_array.insert(a, "jobs")
# 拼接路径 成预期的路径 "D:\Tools\Temp\jobs\Directory1\jobs\Job_d_1\config.xml"
config_xml_path = os.path.join(job_name_dir_path, *path_array, "config.xml")
# 提前创建好目录
parent_dir = os.path.dirname(config_xml_path)
if not os.path.exists(parent_dir):
os.makedirs(parent_dir)
# 写入文件
with open(config_xml_path, "w", encoding="utf8") as f:
print(config_xml_path)
f.write(xml_string)
到这里所有任务config.xml就获取好了,但是还没结束,因为这种方式会少一种配置文件,这里看jenkins的目录结构可以很清楚的发现,需要为每个jobs目录平级加一个用于表示目录的config.xml
这里并不容易获取到这个描述目录的配置文件,所以我们偷个懒,不迁移了~,直接为每个jobs平级创建一个config.xml,至于文件内容可以直接本地jenkins新建个空目录,然后拷贝出来当模板用,遍历所有名字为jobs的文件夹,复制一份config.xml(注意这里有个小问题,不要让工程里有名为jobs的任务或者目录,否则这招就不灵了)
书接上文,这两段代码顺序放一起也行
job_name_dir_path = "D:\Tools\Temp" # 保存的路径,自行修改填写
config_xml_template_path = "D:\Tools\config.xml" # 文件夹jobs的描述,从jenkins里复制出一份作为模板用
for root, dirs, files in os.walk(job_name_dir_path):
for d in dirs:
if d == "jobs":
target_path = os.path.join(root, "config.xml")
print(target_path)
shutil.copy(config_xml_template_path, target_path)
复制jenkins配置到目录并加载
现在我们有了jenkins需要的目录结构,将保存的文件内容放到jenkins/jobs目录就可以了。之后,打开jenkins,点击Manage Jenkins(管理jenkins),拖到最下方,点击重新从磁盘加载配置,等jenkins重启后一切完成
现在就可以愉快的使用jenkins了
总结和备注
- jenkins任务里的目录是有描述和配置的,方法2偷懒跳过了这部分,可能导致迁移缺少一些应有的内容,需要手工搞
- 方法2更多的是加深对jenkins用法的认识,除非确定这样不会造成严重后果,否则还是尽量少用
- 如果意见和问题,欢迎讨论~