Jenkins Job的Migrate之旅

场景

使用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.xdnf.cn/news/141826.html

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

相关文章

[LLM+AIGC] 01.应用篇之中文ChatGPT初探及利用ChatGPT润色论文对比浅析(文心一言 | 讯飞星火)

近年来,人工智能技术火热发展,尤其是OpenAI在2022年11月30日发布ChatGPT聊天机器人程序,其使用了Transformer神经网络架构(GPT-3.5),能够基于在预训练阶段所见的模式、统计规律和知识来生成回答&#xff0c…

Requests项目如何使用pytest进行单元测试

前言 Pytest是python的单元测试框架,简单易用,在很多知名项目中应用。requests是python知名的http爬虫库,同样简单易用,是python开源项目的TOP10。关于这2个项目,之前都有过介绍,本文主要介绍requests项目…

LLM-TAP随笔——有监督微调【深度学习】【PyTorch】【LLM】

文章目录 5、 有监督微调5.1、提示学习&语境学习5.2、高效微调5.3、模型上下文窗口扩展5.4、指令数据构建5.5、开源指令数据集 5、 有监督微调 5.1、提示学习&语境学习 提示学习 完成预测的三个阶段:提示添加、答案搜索、答案映射 提示添加 “[X] 我感到…

苹果Vision Pro头显内置AI芯片

苹果首席执行官蒂姆库克近日在接受采访时确认,备受瞩目的Vision Pro头显将按计划于明年初在美国上市。这款头显被认为是苹果自iPhone以来最重要的产品之一,售价高达3499美元。 蒂姆库克在接受CBS Sunday Morning的采访时透露,他的团队对Visi…

二叉树进阶

目录 1. 二叉搜索树的概念及结构 1.1. 二叉搜索树的概念 1.2. 二叉搜索树的结构样例: 2. 二叉搜索树实现 2.1. insert的非递归实现 2.2. find的非递归实现 2.3. erase的非递归实现 2.3.1. 第一种情况:所删除的节点的左孩子为空 2.3.1.1. 错误的代…

PTE深度了解(一)

目录 PTE模板开始大审查吗?我的模板还能用吗? 使用模版,不会额外扣你分 类型一(前20秒说模版) 类型二(老实巴交) 类型三(就是都说简单句) 1.查重复 2.增加内容分识…

设备自动化系统EAP在晶圆厂的关键作用

在现代晶圆厂中,设备自动化系统(Equipment Automation Programming,EAP)已经成为了不可或缺的关键要素。EAP系统不仅是生产自动化的重要组成部分,更是连接制造执行系统(MES)与设备之间的桥梁&am…

XUI - 一个简洁而优雅的Android原生UI框架

官网 GitHub - xuexiangjys/XUI: 💍A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架,解放你的双手!) XUI | 💍A simple and elegant Android native UI framework, fre…

OpenCV项目开发实战--主成分分析(PCA)的特征脸应用(附C++/Python实现源码)

什么是主成分分析? 这是理解这篇文章的先决条件。 图 1:使用蓝线和绿线显示 2D 数据的主要组成部分(红点)。 快速回顾一下,我们了解到第一个主成分是数据中最大方差的方向。第二主成分是空间中与第一主成分垂直(正交)的最大方差方向,依此类推。第一和第二主成分红点(2…

robotframework在Jenkins执行踩坑

1. Groovy Template file [robot_results.groovy] was not found in $JENKINS_HOME/email_template 1.需要在managed files 添加robot_results.groovy。这个名字需要和配置在构建项目里default content一致(Extended E-mail Notification默认设置里Default Content…

一文搞懂UART通信协议

目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信…

Python:pyts库中的GramianAngularField

您想要使用pyts库中的GramianAngularField类,这是一个用于时间序列数据图像转换的工具。要使用这个类,首先确保您已经安装了pyts库。如果尚未安装,您可以使用以下命令来安装它: pip install pyts一旦安装完成,您可以通…

基于微信小程序的健身房私教预约平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

力扣刷题-链表-删除链表的倒数第N个节点

19.删除链表的倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2:输入:head [1], n 1 输出&…

深度学习中什么是embedding

使用One-hot 方法编码的向量会很高维也很稀疏。假设我们在做自然语言处理(NLP)中遇到了一个包含2000个词的字典,当使用One-hot编码时,每一个词会被一个包含2000个整数的向量来表示,其中1999个数字是0,如果字典再大一点&#xff0c…

笔记1-2:

一、磁荷与磁流的引入 麦克斯韦方程组: 引入磁荷和磁流的概念,上述方程可以写成对称形式: 磁荷和磁流实际上不存在,只具有某种等效意义,可以把某个区域中的电磁场看成是由一组等效磁型源所产生。 对于均匀和各向同性…

PHP8的类与对象的基本操作之成员变量-PHP8知识详解

成员变量是指在类中定义的变量。在类中可以声明多个变量,所以对象中可以存在多个成员变量,每个变量将存储不同的对象属性信息。 例如以下定义: public class Goods { 关键字 $name; //类的成员变量 }成员属性必须使用关键词进行修饰&#xf…

LRU、LFU 内存淘汰算法的设计与实现

1、背景介绍 LRU、LFU都是内存管理淘汰算法,内存管理是计算机技术中重要的一环,也是多数操作系统中必备的模块。应用场景:假设 给定你一定内存空间,需要你维护一些缓存数据,LRU、LFU就是在内存已经满了的情况下&#…

负载均衡器监控

什么是负载均衡器 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企…

华为存储培训

01 存储前沿技术和发展趋势 狭义的存储定义 CD、DVD、ZIP、磁带、硬盘等 广义的存储定义 存储硬件系统(磁盘阵列,控制器,磁盘柜,磁带库等) 存储软件(备份软件;管理软件,快照&…