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.rhkb.cn/news/141341.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot集成Prometheus实现监控

SpringBoot配置Prometheus pom.xml 引入监控以及prometheus依赖 <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><dependency><groupId>org.springfram…

中国城市政商关系健康总指数、方面指数及一级指标得分2018

中国城市政商关系健康总指数、方面指数及一级指标得分2018 1、指标&#xff1a;省份代码、省份、城市代码、城市名称、政商关系健康指数、亲近指数、清白指数、政府关心、政府服务、企业税负、政府廉洁度、政府透明度 2、范围&#xff1a;290个地级市 3、数据说明&#xff1…

Django应用及分布式路由

Django应用及分布式路由 应用 应用在Django项目中一个完全独立的业务模块&#xff0c;可以包含自己的路由&#xff0c;视图&#xff0c;模板&#xff0c;模型 应用配置 在这里面添加你自定义的应用 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.cont…

MT1184矩形相交 题解【超详细】

目录 题目 样例 题目解析 代码 图解 矩形相交 题目 输入2个矩形的左上角和右下角两个点的坐标值(x&#xff0c;y)&#xff0c;判断2个矩形是否相交&#xff0c;输出YES或者NO。矩形的边应与x&#xff0c;y轴相平行。假定输入坐标能顺利构成矩形&#xff0c;不考虑无效矩形…

命令执行(rce)

1.命令与代码执行原理 命令执行原理 参数给变量未经过滤&#xff0c;直接使用了不安全的函数处理了变量 127.0.0.1&&ipconfig 有漏洞 常用的函数 assert,system,exec,shell_exec, eval,(反单引号&#xff09; 代码执行原理 参数给变量未经过滤&#xff…

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

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

阿里云服务器使用教程(从购买到配置再到搭建自己的网站)

阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址&#xff0c;最后网站上线全流程&#xff0c;阿小云分享阿里云服务器详细使用教程&#xff1a; 目录 阿里云服务器使用教程 …

PostgreSQL如何支持PL/Python过程语言

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;10.4 文档用途 本文档主要介绍PostgreSQL如何支持PL/Python过程语言&#xff0c;如何创建plpython扩展。 详细信息 一、PostgreSQL支持python语言…

215 数组中的第K个最大元素

满足时间复杂度o(n)的方法&#xff1a; 快排的思想 class Solution{ public:int findKthLargest(vector<int>& nums,int k){return quickSelect(nums,k);} private:int quickSelect(vector<int>& nums,int k){//随机选择基数int privotnums[rand()%nums…

Quartz 体系结构

Quartz的体系结构 Quartz的重要组件 Scheduler 用于与调度程序交互的主程序接口。 Scheduler调度程序-任务执行计划表&#xff0c;只有安排进执行计划的任务Job&#xff08;通过scheduler.scheduleJob方法安排进执行计划&#xff09;&#xff0c;当它预先定义的执行时间到了的时…

华为云云耀云服务器L实例评测|如何保障华为云云耀云服务器L实例的安全和性能

引言 云耀云服务器L实例是华为云提供的高性能计算实例&#xff0c;为用户提供稳定可靠的云计算环境。为了保障实例的安全和性能&#xff0c;用户可以通过设置防火墙和安全组策略来限制网络访问和防止恶意攻击。华为云提供了灵活的管理工具&#xff0c;用户可以通过控制台、API…

tomcat启动,测试被拒绝连接

tomcat镜像下载下来后&#xff0c;启动容器&#xff0c;测试连接被拒绝。也闪退。 报错信息如下&#xff1a; curl: (7) Failed connect to localhost:8888; 拒绝连接解决方式&#xff1a; # 启动时给root实际权限&#xff0c;即可成功连接 docker run -d -p 8888:8080 --pri…

基于微信小程序的线上教育课程付费商城(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

SpringMVC 学习(一)Servlet

1. Hello Servlet (1) 创建父工程 删除src文件夹 引入一些基本的依赖 <!--依赖--> <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

【洛谷 P1644】跳马问题 题解(动态规划)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

Spring Cloud Alibaba Gateway 简单使用

文章目录 Spring Cloud Alibaba Gateway1.Gateway简介2. 流量网关和服务网关的区别3. Spring Cloud Gateway 网关的搭建3.1 Spring Cloud Gateway 配置项的说明3.2 依赖导入3.3 配置文件 Spring Cloud Alibaba Gateway 1.Gateway简介 Spring Cloud Gateway是一个基于Spring F…

变量和配置文件

文章目录 变量和配置文件1. 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量1.1.3 修改系统变量的值 1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量1.2.3 局部变量1.2.4 会话用户变量月局部变量对比 2. 配置文件的使用2.1 配置文件格式2.2 启动命令与选项组2.3 特定…

安卓逆向 - EdXposed LSPosed VirtualXposed

一、引言 接上篇&#xff1a;安卓逆向 - Xposed入门教程_小馒头yy的博客-CSDN博客 我们介绍了Xposed入门安装使用&#xff0c;但是只支持到Android 8&#xff0c;并且安装模块需要重启。今天我们来看看Xposed的其他版本。 二、各种Xposed框架对比 1、Xposed 只支持到安卓8&…

Linux基础指令(五)

目录 前言1. 打包和压缩1.1 是什么1.2 为什么1.3 怎么办&#xff1f; 2. zip & unzip3. tar 指令结语&#xff1a; 前言 欢迎各位伙伴来到学习 Linux 指令的 第五天&#xff01;&#xff01;&#xff01; 在上一篇文章 Linux基本指令(四) 当中&#xff0c;我们学习了 fin…

软考高级架构师下篇-17安全架构设计理论与实践

目录 1. 引言信息安全面临的威胁2. 安全体系架构的范围3.典型安全模型4.信息安全整体架构设计5.数据库系统安全设计6.系统架构脆弱性分析7.安全架构设计实践8. 前文回顾1. 引言 随着科技的发展,信息系统的安全受到诸多方面的威胁,设计信息系统安全架构需要从各个方面考虑,这…