Jenkins 导出、导入 Job Pipeline

Jenkins 网页上可以手动修改 Job Pipeline 配置 ,但是修改大量 Job 时比较麻烦。有几种批量修改的方法:
- 到 jenkins_home 安装目录下,执行 zip -r jobs.zip jobs/*/config.xml ,可以导出 Job 配置文件。不过修改了配置文件之后,需要重启 Jenkins 才会生效。
- 通过 Jenkins 的 HTTP API 导出、导入 Job 配置文件。

本文给出第二种方法的 Python 示例代码:

"""
- 该脚本用于导出、导入 Jenkins 的 Pipeline 脚本
- 需要安装 pip install jenkinsapi==0.3.13
"""

import os
import re

from jenkinsapi.jenkins import Jenkins

config_suffix = '.xml'

def export_job(job_pattern='.*', work_dir='.'):
    """ 导出 Jenkins 的 Job ,保存为 work_dir 目录下 XML 格式的配置文件 """
    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)
            print('已导出Job:', job_name)

def import_job(job_pattern='.*', work_dir='.'):
    """ 读取 work_dir 目录下的 Job 配置文件,导入 Jenkins
    - 为了允许 Job 配置文件包含非 ASCII 码字符,需要修改 jenkinsapi 源代码 job.py 中 update_config() 的代码,将 data=config 改为 data=config.encode('utf-8') 。详见 https://github.com/pycontribs/jenkinsapi/pull/840
    """
    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
            # Jenkins 上创建的 Job ,可以位于 Folder 文件夹之下。因此这里的 job_name 是指 Job 的全名,等于 job_folder 加上 job_short_name
            # 从 sub_dir 的前缀中去掉 work_dir ,剩下的路径就是 job_folder
            job_folder = os.path.normpath(sub_dir).removeprefix(os.path.normpath(work_dir)).replace('\\', '/').removeprefix('/')
            job_short_name = file.removesuffix(config_suffix)
            job_name = job_folder + '/' + job_short_name
            # 读取 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)
            else:
                print('Jenkins不存在该Job,正在自动创建:', job_name)
                # 这里可以调用 jk.create_job(job_name, config.encode('utf-8')) 来创建 Job ,但是不支持创建在 folder 中的 Job ,因此调用更底层的 jk.requester
                jk.requester.post_xml_and_confirm_status(
                    '{}/job/{}/createItem'.format(jk.baseurl, job_folder),
                    data=config.encode('utf-8'),
                    params={'name': job_short_name}
                )
            print('已导入Job:', job_name)


# 执行导出、导入
jk = Jenkins(baseurl='http://jenkins.test.com', username='***', password='***', timeout=10, use_crumb=True)
# export_job('test/.*', '/tmp')
export_job('.*')
import_job('.*')
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Jenkins 中有两种不同的工作类型:Freestyle JobPipeline Job。Flow Pipeline Job 其实是指 Pipeline Job,只是在某些文档或文章中可能会使用不同的术语来描述。 下面是 Freestyle JobPipeline Job(Flow Pipeline Job)之间的一些区别: 1. 配置方式:Freestyle Job 使用基于表单的可视化界面进行配置,你可以通过简单的 UI 操作来定义构建步骤、参数、触发器等。而 Pipeline Job 使用一种基于 Groovy 的脚本语言(Jenkins Pipeline DSL)来定义整个持续交付流水线。它的配置是以代码的形式来描述的,可以更灵活地定义复杂的构建和部署流程。 2. 可读性和可维护性:由于 Pipeline Job配置是以代码形式存在的,它具有更好的可读性和可维护性。你可以将整个流水线定义存储在代码仓库中,与应用代码一起进行版本控制和持续集成。这样可以方便团队共享和合作,并且更容易进行代码审查和故障排查。 3. 高级功能:Pipeline Job 提供了更多高级功能,如并行构建、循环迭代、条件逻辑、错误处理等。它还支持通过多个阶段(stage)来组织和控制流水线的执行顺序。 4. 可扩展性:Pipeline Job 具有更强的可扩展性,你可以使用丰富的 Jenkins 插件来扩展其功能,也可以编写自定义的 Groovy 脚本来实现特定的需求。 总的来说,Pipeline Job 提供了更高级的功能和更灵活的配置方式,适用于复杂的持续交付流程。而 Freestyle Job 则更简单直观,适用于简单的构建和部署任务。选择哪种类型取决于你的需求和团队的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值