当前位置:网站首页>Jenkins 导出、导入 Job Pipeline
Jenkins 导出、导入 Job Pipeline
2022-08-04 04:01:00 【LeoHsiao1】
Jenkins 网页上可以手动修改 Job Pipeline 配置 ,但是大批量修改时比较麻烦。有几种批量修改的方法:
- 到 jenkins_home 安装目录下,执行 zip -r jobs.zip jobs/*/config.xml ,可以导出 Job 配置文件。不过修改了之后,需要重启 Jenkins 才会生效。
- 通过 Jenkins API 导出、导入 Job 配置文件。
本文给出第二种方法的 Python 示例代码:
""" - 该脚本用于导出、导入 Jenkins 的 Pipeline 脚本,保存为 XML 文件 - 需要安装 pip install jenkinsapi - 导入的配置文件包含非 ASCII 码时,需要修改 update_config() 的定义代码,注释 config = str(config) 一行 """
import os
import re
from jenkinsapi.jenkins import Jenkins
# 连接 Jenkins
jk = Jenkins('https://jenkins.test.com/', username='***', password='***', timeout=10, useCrumb=True)
config_suffix = '.xml'
def export_job(job_pattern='.*', work_dir='.'):
for job_name in jk.keys():
if not re.findall(job_pattern, job_name):
continue
config = jk.get_job(job_name).get_config()
config_file = os.path.normpath(os.path.join(work_dir, job_name + config_suffix))
os.makedirs(os.path.dirname(config_file), exist_ok=True)
with open(config_file, 'w', encoding='utf-8') as f:
f.write(config)
def import_job(job_pattern='.*', work_dir='.'):
for line in os.walk(work_dir, onerror=print):
sub_dir,dir_list,file_list = line
for file in file_list:
if file[-len(config_suffix):] != config_suffix:
continue
# 获取 job name
path_fileds = list(os.path.split(sub_dir)) + [file]
job_name = '/'.join(path_fileds).removeprefix(work_dir.replace('\\', '/')).removeprefix('/').removesuffix(config_suffix)
# 读取 job 的配置文件
if not re.findall(job_pattern, job_name):
continue
config_file = os.path.join(sub_dir, file)
with open(config_file, 'r', encoding='utf-8') as f:
config = f.read()
# 导入 job 配置
if jk.has_job(job_name):
jk.get_job(job_name).update_config(config.encode('utf-8'))
print('已导入Job:', job_name)
else:
print('Jenkins不存在该Job:', job_name)
# 自动创建 Job 会失败,目前只能导入 Jenkins 上已创建的 Job
# jk.create_job(job_name, config)
# 执行导出、导入
export_job('test.*')
import_job('test.*')
边栏推荐
- sql语句查询String类型字段小于10的怎么查
- 函数,递归以及dom简单操作
- 怎么把elastic中的异常登录ip和日志自动导出或抓取到数据库中?
- SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropri
- SQL interview Questions
- typescript type 和 interface 的区别
- kingbaseES V8R2/R3 表在指定表空间,为何显示为默认表空间?
- XSS相关知识点
- Mockito单元测试
- if,case,for,while
猜你喜欢

八年软件测试工程师带你了解-测试岗进阶之路

pnpm 是凭什么对 npm 和 yarn 降维打击的

案例 | 重庆银行流动数据安全挑战及应对实践

docker+bridge+redis master-slave+sentry mode

什么是数字孪生智慧城市应用场景

深度学习之 10 卷积神经网络3

2 Gigabit Optical + 6 Gigabit Electric Rail Type Managed Industrial Ethernet Switch Supports X-Ring Redundant Ring One-key Ring Switch

自定义通用分页标签01

2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机

4-way two-way HDMI integrated business high-definition video optical transceiver 8-way HDMI high-definition video optical transceiver
随机推荐
Introduction to the memory model of the JVM
复现20字符短域名绕过
The Shell function
【id类型和NSObject指针 ObjectIve-C中】
内网服务器访问远程服务器的端口映射
JVM内存和垃圾回收-07.堆
说说数据治理中常见的20个问题
基于 SSE 实现服务端消息主动推送解决方案
哎,又跟HR在小群吵了一架!
劝退背后。
XSS相关知识点
十一种概率分布
拿捏JVM性能优化(自己笔记版本)
sql注入一般流程(附例题)
SQL injection in #, - +, - % 20, % 23 is what mean?
深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型
4-way two-way HDMI integrated business high-definition video optical transceiver 8-way HDMI high-definition video optical transceiver
Hey, I had another fight with HR in the small group!
Mockito unit testing
一文详解DHCP原理及配置