用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文件夹

流水线jenkins docker前端 jenkins复制流水线_运维

看到上图里的jobs了么?就是他了,把里面的东西复制到新jenkins目录下,任务完成

方法2用rest api请求获取

实在不想复制任务,还可以用jenkins提供的rest api,也可以获取任务配置(当然这只是jenkins提供的api用途之一,通过rest api还能获取jenkins上其他配置信息,这里没涉及,就不多描述了)

流水线jenkins docker前端 jenkins复制流水线_运维_02

注意看上图的右下角的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

流水线jenkins docker前端 jenkins复制流水线_xml_03

这里并不容易获取到这个描述目录的配置文件,所以我们偷个懒,不迁移了~,直接为每个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 docker前端 jenkins复制流水线_ci_04

流水线jenkins docker前端 jenkins复制流水线_jenkins_05

现在就可以愉快的使用jenkins了

总结和备注

  1. jenkins任务里的目录是有描述和配置的,方法2偷懒跳过了这部分,可能导致迁移缺少一些应有的内容,需要手工搞
  2. 方法2更多的是加深对jenkins用法的认识,除非确定这样不会造成严重后果,否则还是尽量少用
  3. 如果意见和问题,欢迎讨论~