Jenkins Job的Migrate之旅

news2024/10/6 12:22:18

场景

使用Jenkins 做为应用的定时任务处理, 在上面建立的800个左右的Job, 这个环境运行了很多年, 当初安装的最新版本是Jenkins 1.642.3, 现在因为OS需要升级等原因, 驻在上面的Jenkins 服务器也需要一并升级,在新的服务器上安装了新的Jenkins版本Jenkins 2.401.3。
新版的Jenkins,界面更为清爽,Jenkins本身的升级很简单, 安装最新版本及相关插件就可以, 问题是对于旧的Job的迁移。
这里迁移的场景相对比较简单,只需要迁移Job的配置就可以,对于构建的历史记录可以忽略。
如果是在页面中进行配置的话, 一笔Job还好,几百笔时间上就是笔不小的开销,而且还要保证不出错,是否有什么快捷的方式呢?
答案当然是肯定的。

Job迁移的最简单方式-复制config.xml

可以通过直接复制config.xml文件实现迁移旧的Job。

config.xml文件包含了Jenkins Job的配置信息,包括源码配置、触发条件、构建步骤等等。迁移过程如下:

  1. 先停止新旧两个Jenkins实例,避免在迁移过程中进行任何更改。
  2. 导出旧Jenkins的Job配置文件,即config.xml,通常在${JENKINS_HOME}/jobs/[job_name]/目录下。
  3. 将config.xml文件复制到新Jenkins实例的相应位置,通常是${JENKINS_HOME}/jobs/[job_name]/。
  4. 重启新的Jenkins实例。
    需要注意的是,这种方法只能迁移Job的配置,不包括构建历史等数据。如果有需要迁移的插件,还需确保新的Jenkins实例有相应的插件。

另外,Jenkins也提供了Job导入/导出插件,例如Jenkins Job Import Plugin,可以方便地实现Job迁移。

快速导出 config.xml

Jobs 的配置文件config.xml位于 ${JENKINS_HOME}/jobs的子目录中, 目录是Jenkins Job的名字,这些目录中除了Job配置文件之外,还有构建的记录等文件,可能内容比较多, 如果快速的将目录名和config.xml 提取出来呢?
使用很多语言编写代码都可以实现这个功能, 比如Java , Python, Perl等, 考虑这台机器只有安装Java ,于是将以下代码复制到 ${JENKINS_HOME}/jobs 目录下:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

public class MigrateJenkins {

    public static void main(String[] args) {
        File jobsDirectory = new File("jobs"); // 指定要遍历的jobs目录
        File targetDirectory = new File("jobsMigrate"); // 指定目标目录

        // 确保目标目录存在
        if (!targetDirectory.exists()) {
            targetDirectory.mkdirs();
        }

        // 获取所有一级子目录
        File[] subDirectories = jobsDirectory.listFiles(File::isDirectory);

        if (subDirectories == null || subDirectories.length == 0) {
            System.out.println("jobs目录中没有子目录");
            return;
        }

        for (File subDirectory : subDirectories) {
            File configFile = new File(subDirectory, "config.xml");

            if (configFile.exists() && configFile.isFile()) {
                try {
                    // 复制子目录及其config.xml文件到目标目录
                    Files.copy(subDirectory.toPath(), new File(targetDirectory, subDirectory.getName()).toPath(),
                            StandardCopyOption.COPY_ATTRIBUTES);

                    Files.copy(configFile.toPath(),
                            new File(targetDirectory, subDirectory.getName() + "/config.xml").toPath(),
                            StandardCopyOption.REPLACE_EXISTING);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("子目录" + subDirectory.getName() + "中不存在config.xml文件");
            }
        }
    }

}

正常状况下执行以下两个命令行就可以完成代码的执行:

javac MigrateJenkins.java
java MigrateJenkins

但是在这里的实际环境中使用javac编译类文件的时候, 出现了 error: unmappable character for encoding Cp1252 错误。

### error: unmappable character for encoding Cp1252 问题解决

unmappable character for encoding Cp1252通常发生在Java源文件包含不支持的字符,并且正在尝试使用Cp1252编码进行编译。Cp1252编码不能映射所有Unicode字符,因此对于某些字符来说可能不适用。

解决这个问题有两种方法:
一种方式是将javac编译器的源代码文件编码设置为UTF-8,这个编码比Cp1252支持更多的字符。要实现这个,你需要在编译时添加"-encoding UTF-8"选项。比如:

javac -encoding UTF-8 MigrateJenkins.java
另一种方法是检查和编辑你的源代码文件,删除那些不被Cp1252编码支持的字符。

也需要确保你的IDE(如Eclipse, IntelliJ等)的字符编码设置和Javac编译器的一致,以避免类似的错误。如果你在使用IDE,你可以在设置中查找encoding或character encoding,然后修改它为UTF-8。

重新执行编译命令,错误信息是不一样了, 但是还是会报 javac error: illegal character: '\ufeff' 的错误。

javac error: illegal character: '\ufeff' 错误解决

这个错误涉及一个特殊的Unicode字符–‘\ufeff’,也被称为"字节顺序标记"(Byte Order Mark,简称BOM)。这经常发生在你的文件是在特定编辑器中保存为UTF-8带BOM的编码,并且当文件被读取时,读取器(在这里是javac)并不能正确处理BOM。

虽然UTF-8编码本质上不需要BOM,一些编辑器(如Windows记事本)仍会在文本开头添加一个BOM。这就可能导致像javac这样的工具出现问题,因为它们并不期望看到BOM。

解决方法有以下两种:

  • 使用能够删除BOM的文本编辑器。有的编辑器选项中可以直接设置保存为UTF-8无BOM编码。例如在PSPPSPad,Sublime Text,Notepadd++这样的编辑器中,都有"UTF-8无BOM"的保存选项。只需将文件以此方式保存,然后再次编译即可。

  • 使用命令行工具删除BOM。例如在Linux中,你可以使用sed工具:

sed '1s/^\xEF\xBB\xBF//' originalFile > newFile
以上的命令会将原文件复制到新文件,同时移除开头的BOM。然后你可以使用新文件进行编译。

无论选择哪种方式,关键要点就是确保你的Java文件是以UTF-8无BOM格式进行保存的。

到这里问题解决,几百个Jenkins Job的Migrate的时间也就10分钟。

关于Jenkins Job Import Plugin

Jenkins Job Import Plugin是Jenkins的一个插件,它允许用户从其它Jenkins实例或XML文件中导入作业配置。这个插件可以简化新的Jenkins实例的配置,使用户能够轻松地重复使用经过测试的作业配置,并快速构建Jenkins实例。它还可以帮助用户在不同的Jenkins实例之间共享和复制作业配置,提高团队的协作效率

安装方式直接搜索Job Import 进行安装

在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DevOps】Docker 容器及其常用命令

Docker 容器及其常用命令 1.容器2.Docker 常用命令2.1 Docker 环境信息2.2 容器生命周期管理2.2.1 docker run2.2.2 docker start / stop / restart 2.3 镜像仓库命令2.3.1 docker pull2.3.2 docker push 2.4 镜像管理2.4.1 docker images2.4.2 docker rmi / rm 2.5 容器运维操…

一键制作纯文字背景视频,让你轻松制作短视频!

你是否曾经被繁琐的视频制作流程所困扰?不用担心,现在有了纯文字视频制作神器,让你成为视频制作大师的梦想不再遥远! 首先,让我们来看看纯文字视频制作神器主要的功能之一:一键生成短视频。只需输入你的文…

已解决: Microservice Error: Timeout Error: Service didn‘t respond in time

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

ubuntu18.04安装docker

ubuntu18.04安装docker 文章目录 ubuntu18.04安装docker一.安装1.更新软件库索引2.安装一些必要的软件包3.添加Docker的官方GPG密钥4.添加Docker软件库5.再次更新软件库索引6.安装Docker CE7.启动Docker并设置开机启动8.验证Docker安装9.(若要让非root用户可以运行Docker命令)可…

【广州华锐互动】马属直肠检查3D虚拟仿真课件

随着科技的发展,医疗行业也在不断地进行创新。其中,广州华锐互动开发的马属直肠检查3D虚拟仿真课件,为医学教育和实践操作带来了新的可能性。它不仅可以帮助医生提高诊断准确率,还可以让医学生在没有真实病人的情况下进行实践操作…

admin后台管理

admin后台管理 django 提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用 django 会搜集所有已注册的模型类,为这些模型类提拱数据管理界面,供开发者使用 admin配置步骤 创建后台管理帐号- 该账号为管理后台最高权限账号…

删除表中的数据

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: delete from 表名 where 记录匹配条件; 说明:如果**不写where**子句,表示无条件,删除表中的**所有记…

9月25日星期一,今日早报简报微语报早读

9月25日,星期一,早报简报微语早读分享。 1、祝贺中国队!开幕首日中国队20金7银3铜,共计30枚奖牌,位列奖牌榜第一名; 2、NBL深蓝官宣:陕西罢赛遭重罚 罚款100万取消评奖资格; 3、中…

NPDP是什么?考了有用吗?

1)NPDP是什么? NPDP,全称为New Product Development Professional,即新产品开发专业人员。NPDP认证是由世界产品开发协会(PDMA)推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…

github代码提交过程详细介绍

1、下载github上面的代码 (1)在github网站上,找到想要下载的代码仓库界面,点击Code选项就可以看到仓库的git下载地址; (2)使用命令下载:git clone 地址; 2、配置本地git…

基于YOLOv8模型的垃圾满溢检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的垃圾满溢检测系统可用于日常生活中检测与定位车辆垃圾(garbage)、垃圾桶(garbage_bin)和垃圾满溢(overflow)目标,利用深度学习算法可实现图片、视频、摄像头等…

离散小波变换(概念与应用)

目录 概念光伏功率预测中,如何用离散小波变换提取高频特征概念 为您简单地绘制一些示意图来描述离散小波变换的基本概念。但请注意,这只是一个简化的示意图,可能不能完全捕捉到所有的细节和特性。 首先,我将为您绘制一个简单的小波函数和尺度函数的图像。然后,我会提供一…

oracle 根据分号分割为多个列

oracle 没有split 函数,因此没法直接使用,但是时间上会遇到需要分割的时候,可以使用正则表达式 SELECT REGEXP_SUBSTR(administration, [^;], 1, 1) AS SKILL1, REGEXP_SUBSTR(administration, [^;], 1, 2) AS SKILL2, REGEXP_SUBSTR(admini…

php万能表单系统源码 支持自定义+收费表单活动报名 适合多行业

在众多的表单系统中,PHP万能表单系统因其灵活性和可扩展性备受开发者的青睐。PHP万能表单系统是一款基于PHP语言的表单生成器,它可以帮助开发者快速生成各种类型的表单,如注册、登录、留言等。下面给大家分享一款php万能表单系统源码&#xf…

Android12之仿Codec2.0实现传递编解码器组件本质(四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

2023-9-25 耍杂技的牛

题目链接&#xff1a;耍杂技的牛 #include <iostream> #include <algorithm>using namespace std;typedef pair<int, int> PII;const int N 50010;int n; PII cow[N];int main() {cin >> n;for(int i 0; i < n; i ){int w, s;cin >> w >…

概率密度函数、分布函数、随机变量、概率函数=概率分布

概率密度函数&#xff1a; 长方形的面积组距*概率/组距&#xff0c;所有长方形之和1 当组距为无穷小的时候&#xff0c;就会生成上图的曲线&#xff0c;曲线的面积为1&#xff0c;而蓝色曲线本身是概率密度函数&#xff0c;可以写作f(x)。 分布函数&#xff1a; 将曲线进行积…

巨人互动|Google海外户Google SEO的技术要素

Google SEO&#xff08;Search Engine Optimization&#xff09;是指通过对网站进行优化&#xff0c;使其在Google搜索引擎中的排名获得提升的一系列技术和策略。随着互联网的快速发展和用户对搜索引擎的依赖程度不断增加&#xff0c;优化网站在搜索引擎中的可见性&#xff0c;…

UNet简单介绍

UNet简单介绍 语义分割&#xff08;Semantic Segmentation&#xff09;是计算机视觉领域的一项基础任务&#xff0c;旨在将图像中的每个像素分配到特定的语义类别中&#xff0c;即对图像中的每个像素进行分类&#xff0c;从而实现对图像像素级别的理解和分析。与图像分类任务不…

12大常用自动化测试工具,请记得转发收藏!

常用自动化测试工具 1、Appium AppUI自动化测试 Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台&#xff0c;支持Python、Java 等语言&#xff0c;即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台&#xff0c;Appium 是一个C/S 架构&…