Jenkins使用问题记录

2023-11-13

1. 启动

使用Jenkins的版本为2.138.3,下载war包后启动即可运行:

# 指定使用8080端口,可自定义
java -jar jenkins.war --httpPort=8080

建议后台启动,命令如下:

# 1. 启动
# 指定后台启动
nohup java -jar jenkins.war --httpPort=8080 &
# 再指定日志路径
appending output to nohup.out

# 2. 停止
# 查看进程号
jobs -l
# 杀死
kill -9 进程号

默认使用Jenkins内置的Jetty,也可以根据自己需求放入其他的Servlet容器(如Tomcat)中。启动后,它会给一个初始密码,访问jenkins需要这个密码,访问后安装社区推荐的插件,最好修改一下密码;

注:我这边Jenkins的war包是直接放在/root/jenkins目录下的,默认Jenkins构建的工作区在/root/.jenkins/workspace目录下,相对配置文件也都在/root/.jenkins目录下,必要时可以查看。

2. “构建”模块中没有“Maven Version”选项

 在构建时,控制台出现如下的报错信息:

[my-jenkins] $ mvn -f SpringData/pom.xml -s /usr/local/apache-maven-3.6.0/conf/settings.xml -gs /usr/local/apache-maven-3.6.0/conf/settings.xml clean package -Dmaven.test.skip=true
FATAL: 命令执行失败
java.io.IOException: error=2, 没有那个文件或目录
	at java.lang.UNIXProcess.forkAndExec(Native Method)
	at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
	at java.lang.ProcessImpl.start(ProcessImpl.java:134)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
Caused: java.io.IOException: Cannot run program "mvn" (in directory "/root/.jenkins/workspace/my-jenkins"): error=2, 没有那个文件或目录
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
	at hudson.Proc$LocalProc.<init>(Proc.java:249)
	at hudson.Proc$LocalProc.<init>(Proc.java:218)
	at hudson.Launcher$LocalLauncher.launch(Launcher.java:935)
	at hudson.Launcher$ProcStarter.start(Launcher.java:454)
	at hudson.Launcher$ProcStarter.join(Launcher.java:465)
	at hudson.tasks.Maven.perform(Maven.java:367)
	at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
	at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:744)
	at hudson.model.Build$BuildExecution.build(Build.java:206)
	at hudson.model.Build$BuildExecution.doRun(Build.java:163)
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504)
	at hudson.model.Run.execute(Run.java:1819)
	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
	at hudson.model.ResourceController.execute(ResourceController.java:97)
	at hudson.model.Executor.run(Executor.java:429)
Build step '调用顶层 Maven 目标' marked build as failure
SSH: Current build result is [FAILURE], not going to run.
Finished: FAILURE

尝试解决:到/root/.jenkins/workspace中任务下的模块中的target目录下,发现确实没有jar包,定位到maven出现问题,配置没有生效。

解决方案:在配置任务时,选择“调用顶层Maven目标”,发现没有“Maven版本”(或Maven version)这个选项,系统管理–>全局工具配置–>Maven–>点击“Maven安装”–>将“自动安装”选项改为非选中状态–>填写Maven的NameMAVEN_HOME保存,最后回到任务配置中查看,即可出现“Maven版本这个选项”,然后选择刚刚填写的Maven别名再次构建即可。

3. 构建时提示没有Java环境

 在解决了上述问题后,尝试进行构建,控制台又出现下面的异常信息:

[my-jenkins] $ /root/.jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven-3.6.0/bin/mvn -f SpringData/pom.xml -s /usr/local/apache-maven-3.6.0/conf/settings.xml -gs /usr/local/apache-maven-3.6.0/conf/settings.xml clean package -Dmaven.test.skip=true
which: no java in (/root/.jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven-3.6.0/bin:/bin:/bin:/root/apache-maven-3.6.0//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE

根据信息提示是没有JDK,或者是错误的将JAVA_HOME设置成了JRE目录而非JDK目录,检验虚拟机环境,正常配置,系统可以识别javajavac命令,郁闷中。

解决方案:Jenkins不能识别自动找到JDK的目录,需要手动配置,进入系统管理–>全局工具配置,进行如下操作:

配置Jenkins中JDK路径

再次构建,操作成功。

注:这里提一点JDK和JRE的概念区别,妈的,以前学java没搞那么多,也知道java是用于运行jav程序的命令,javac是用于编译java程序的,简单的说JRE是java的运行环境,而JDK是包含了java编译和运行的环境,即它们都包含java的运行环境JRE,至于编译环境只有JDK才会提供,所以现在JDK和JRE的概念应该会分的很清楚。

4. 通过SSH上传到远程部署机器

 具体任务配置的时候有多个地方可以配置,建议在Build Environment中勾选Send files or execute commands over SSH after the build runs进行SSH上传的具体配置:

在这里插入图片描述

注:使用这个插件上传的前提是首先将jenkins所在机器和远程部署机器之间配置好SSH免密登录(将jenkins所在机器的公钥追加到远程部署机器上的authorized_keys文件中即可)

4.1 配置SSH

 远程部署:简单点说就是,在机器A上打包好了之后,将jar包上传到机器B上,这里使用的SSH Server,所以在Jenkins上首先需要安装“publish over ssh”插件,重启即可(前提是两台机器已经配置了SSH登录),关于通过SSH将打包好的jar包上传到SSH Server时的具体配置如下:

系统管理–>全局设置–>Publish over SSH填写相关信息即可:

SSH配置

注:上述配置SSH Server时如果填写远程机器的登录密码(即这里的Passphrase),那么在上传时,只能通过执行Shell命令来远程复制;建议直接填写主机私钥文件的位置Path to key(正常为/root/.ssh/id_rsa),不要填写Passphrase,然后通过插件直接帮我们复制即可,不需要再写shell命令,在具体任务配置Send build artifacts over SSH时,只需要填写Name、Source files(Transfers)、Exec command(Transfers)这三项即可,不要作死去点“高级”勾选里面的选项(除Verbose output in console,勾选这个可以打印SSH操作日志)。

4.2 编码问题

 在构建完后推送到SSH Server时,出现诡异字符bash^M,具体如下:

编译报错

原因:原来的重启shell脚本太长,为了方便我直接在windows环境下更改过内容,编码有问题导致shell脚本执行错误,可以用vi或vim打开文本时进行验证,使用:set ff?命令查看文本类型,如果结果为fileformat=dos那就是windows平台创建的文件;

解决方案:如果为fileformat=dos继续执行:set ff=unix修改,然后保存退出即可,或者直接将原文件删除,在Linux中直接使用重新创建;

4.3 远程机器上目标目录中没有上传的文件

 这个问题就有点坑了,原来配置SSH Server中Transfers选项的时候,里面的源文件位置“Source files: ”我写的是/root/.jenkins/workspace/my-jenkins/SpringData/target/springdata-1.0-SNAPSHOT.jar,然后勾选“Verbose output in console”查看SSH上传的日志,发现如下输出:

SSH: Connecting from host [localhost.localdomain]
SSH: Connecting with configuration [jenkins-test] ...
SSH: Creating session: username [root], hostname [10.4.37.124], port [22]
SSH: Connecting session ...
SSH: Connected
SSH: Opening SFTP channel ...
SSH: SFTP channel open
SSH: Connecting SFTP channel ...
SSH: Connected
SSH: cd [/usr/local/test]
SSH: OK
SSH: Opening exec channel ...
SSH: EXEC: channel open
SSH: EXEC: STDOUT/STDERR from command [/usr/local/java/jdk1.8.0_191/bin/javac /usr/local/test/Hello.java] ...
SSH: EXEC: connected
SSH: EXEC: completed after 801 ms
SSH: Disconnecting configuration [jenkins-test] ...
SSH: Transferred 0 file(s)

发现SSH是连接成功的,但是在远程复制的时候发现只有cd(即进入远程机器的指定目录),并没有将文件放进目标目录(即没有put操作)中,而且最后一行Transferred 0 file(s)也告诉我们确实是没有上传文件,考虑是源文件路径写法有问题,查找官方文档,有如下的举例说明:

*可以匹配0个或多个字符,比如*.java可以匹配.javax.javaFooBar.java但不包括FooBar.xml(即不匹配任何不以.java结尾的字符串);

?可以仅且可以匹配1个字符,比如x.javaA.java,但不能匹配.javaxyz.java

**可以匹配多级路径,比如/test/**可以匹配所有test目录下的文件或目录,比如/test/x.java/test/foo/bar/xyz.html……需要注意的是,如果一个字符串以\/结尾,那么自动在其后面追加**,比如mypackage/test/实际就是mypackage/test/**,可以认为是一种缩写;

对于Transfers中整体的配置有如下栗子:

栗子1 Transfer directory

Source files: target/classes/**/*
Remove prefix:
Remote directory:

结果:

target/classes/my/code/HelloWorld.class
target/classes/my/code/HelloWorldImpl.class
target/classes/my/code/Main.class

栗子2 Remove prefix

Source files: target/classes/
Remove prefix: target
Remote directory:

结果:

classes/my/code/HelloWorld.class
classes/my/code/HelloWorldImpl.class
classes/my/code/Main.class
target/classes/ == target/classes/** == target/classes/**/*

栗子3 Environment variables

为了传输一个目录下的所有文件和文件夹,并将它们放在一个名字为工作目录的目录下(下面栗子中给的job名字为Hello World),然后构建数字(不懂):

Source files: target/classes/
Remove prefix: target/classes
Remote directory: $JOB_NAME/$BUILD_NUMBER

结果:

Hello World/99/my/code/HelloWorld.class
Hello World/99/my/code/HelloWorldImpl.class
Hello World/99/my/code/Main.class

栗子4 Transfer .class files

Source files: target/**/*.class
Remove prefix: target
Remote directory:

结果:

classes/my/code/HelloWorld.class
classes/my/code/HelloWorldImpl.class
classes/my/code/Main.class
test-classes/my/code/HelloWorldImplTest.class

栗子5 Transfer files with flatten

Source files: **/*.java
Remove prefix:
Remote directory: /java

结果:

java/HelloWorld.java
java/HelloWorldImpl.java
java/Main.java
java/HelloWorldImplTest.java

栗子6 Remote directory是日期格式的

Source files: target/**/*.jar
Remove prefix:
Remote directory: 'builds/'yyyy/MM/dd/‘build-$BUILD_NUMBER’
Flatten files: checked
Remote directory: is a date format checked

结果:

builds/2010/11/07/build-99/hello-world.jar

注意:The whole of Remote directory is quoted appart from the date tokens and the separators (which are not letters)

看完上述的内容,琢磨着Source files应该是填项目的相对路径(支持字符串匹配),不能填绝对路径,有点奇葩,我这里项目有点乱,具体目录结构见CodeRepository(其实这个项目我是把他作为一个代码分享仓库,并不是正规的项目结构形式),然后我要构建的是里面SpringData项目,maven构建后的jar的位置为SpringData/target/springdata-1.0-SNAPSHOT.jar,所以Source files应该填写SpringData/target/springdata-1.0-SNAPSHOT.jar,这里有一点需要说明的是如果只是这样,那么传输到远程部署机器上的将会保持源文件的目录结构,即在目标目录中依次创建SpringDatatarget文件夹,然后再将springdata-1.0-SNAPSHOT.jar放进去,但正常我是不需要这样的目录结构的,我只需要把jar包传输过去就行了,所以这时就可以利用Remove prefix将上述外面包裹的两层文件夹去除,直接传输jar包,如下:

在这里插入图片描述

最终构建后,可以发现在远程机器中的/usr/local/test目录中只用一个jar包,很舒服!

注:这里除了这种做法外,还可以使用下面一种很搓的方式。在配置好了SSH Server后,写远程复制命令,如下:

SSH上传

注:本地复制命令命令为cp file1 file2,相应的SSH远程复制命令:scp local_file remote_username@remote_ip:remote_file,手动写scp远程复制命令,但不建议这么干。

5 远程机器无法执行上传的jar包

 这个问题其实很脑残,在执行的时候提示我“没有这个目录”,然后检查的时候发现,SSH Server上没有JDK,当时也没反应过来,后来一想也是,你上面都没有java环境怎么运行jar程序,对吧,所以也安装一下JDK即可,安装好了之后,发现无法识别java命令(环境已配置),最后发现必须使用绝对绝对路径,如下:

# 两者都要指定绝对路径
/usr/local/java/jdk1.8.0_191/bin/java -jar /usr/local/test/hello.jar

6 无法识别Shell命令

 无法执行Shell命令,在命令的首行加上#!/bin/sh指定解释器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins使用问题记录 的相关文章

  • PCL只获取点云中一个点的法向量之computePointNormal

    PCL只获取点云中一个点的法向量computePointNormal 最近用点云图做应用的时候想只获取点云中一个点的法向量 然后就在网络上搜索 搜索了半天只能找到一些看似成功 实则语焉不详的文章 甚至是纯照搬 抄袭的文章 所以写下这篇文章供
  • 实体化视图

    Oracle 的实体化视图是包括一个查询结果的数据库对像 它是远程数据的本地副本 或者用来 生成基于数据表求和的汇总表 实体化视图存储基于远程表的数据 也可以称为快照 实体化视图可用于预先计算并保存表连接或聚集等耗时较多的操作的结果 这样
  • OLED透明屏曲面技术:创新突破引领显示行业未来

    OLED透明屏曲面技术作为一项重要的显示技术创新 正在成为显示行业的焦点 其引人注目的优势和广泛应用领域使其备受关注 本文将详细介绍OLED透明屏曲面技术的优势 应用领域以及市场前景 同时展望其未来的发展趋势 以期带给读者全面而深入的了解
  • intellij idea 打可运行scala jar 包的两种方式

    今天折腾了一天 研究 idea 打可运行scala 代码的 jar 包 有些心得记录下来 供大家参考 希望能帮助到一些同事 此前在网络上有一些关于打jar 包的资料 大都是一些转载 或者介绍的不是很详细 此篇是详细介绍打包过程以及思考推导方
  • 扩展应用功能的无限可能——UniApp生态系统中的插件探索(二)

    文章目录 自定义插件的开发与应用案例 自定义插件的需求分析 第一部分 引言和背景 第二部分 确定插件的目标和范围 第三部分 定义插件的功能和特性 第四部分 界面设计和交互流程 第五部分 技术实现和开发计划 第六部分 测试和质量保证 第七部分
  • 教你写只爬虫

    在从零开始教大家写个小爬虫前先说一说爬虫是什么东西吧 百度就不百度了 想把我所认为的爬虫给大家说一下吧 以前学爬虫之前觉得爬虫感觉好牛逼的样子 认为这东西和骇客差不多似的 偷取别人信息 其实学完之后慢慢思考下 我觉得爬虫就是一段脚本程序 作
  • 输出3行,第一行打印一遍输入的数,第二行打印两遍,第三行打印三遍。 第二行和第三行,用空格分隔同一行的数字。 实数用"6.2f"格式输出。

    import java util Scanner public class Main public static void main String args Scanner scanner new Scanner System in dou
  • 【综合题】【数据库原理】

    文章目录 一 属性集合的闭包计算 二 确定候选码并进行范式级别的判断 2 1 确定候选码讲解 2 2 范式级别的判断讲解 三 根据要求写SQL语句 四 关系代数运算和画E R图并进行关系模式转换 4 1 关系代数运算 4 2 E R图向关系
  • 最新最全论文合集——基于统计学习的关系抽取

    AMiner平台 https www aminer cn 由清华大学计算机系研发 拥有我国完全自主知识产权 平台包含了超过2 3亿学术论文 专利和1 36亿学者的科技图谱 提供学者评价 专家发现 智能指派 学术地图等科技情报专业化服务 系统
  • compare4密钥过期解决方案

    删除C Users 用户名 AppData Roaming Scooter Software Beyond Compare 4下的所有文件 重启Beyond Compare 4即可 注意 用户名下的AppData文件夹有可能会被隐藏起来 其
  • 新手看过来----讨厌的运算符

    在计算机的世界里 虽然有很多数学的影子 但在计算公式转换为计算机语言时 很多表达方式并 不一致 这导致新手们初期不习惯 很容易用错 需要一个记忆的过程 就像学习英文 主谓宾定状补的先后顺序于中文是不一致的 在翻译句子时很容易产生中式英语 本
  • 【leetcode】1052. 爱生气的书店老板

    题目 解法 class Solution def maxSatisfied self customers grumpy X gt int 固定窗口最大和 param customers param grumpy param X return
  • hibernate查询方式

    1 OID 主键 查询 使用get方法 Customer customer session get Customer class 1l 使用load方法 Customer customer session load Customer cla
  • level2买股技巧_同花顺Level-2教你看清个股真实交易数据

    您可能感兴趣的话题 同花顺 核心提示 近几天 笔者在对比普通行情软件和同花顺Level 2行情软件在成交明细上的区别 发现这里面的学问非常大 近几天 笔者在对比普通行情软件和同花顺Level 2行情软件在成交明细上的区别 发现这里面的学问非
  • 贪心算法-背包问题C++

    1 问题 给定n种物品和一个背包 物品i的重量是Wi 其价值为Vi 背包的容量为C 应如何选择装入背包的物品 使得装入背包中物品的总价值最大 2 算法解析 此算法的贪心策略在于Sort排序函数 背包问题与0 1背包问题不同在于背包问题可以将
  • 【EI核心检索】第六届算法、计算与系统国际会议(ICACS 2022)

    会议官网 http icacs org 会议时间 2022年9月16 18日 主办单位 希腊色萨利大学数字系统学院 学术支持单位 英国斯特拉斯克莱德大学 会议地点 线上线下 希腊色萨利大学 会议出版 ACM会议论文集 会议收录 Ei Com
  • 单件模式:确保一个类只有一个实例,并提供一个全局访问点。

    问题 一个类只有一个实例的用处 线程池 缓存 对话框 处理偏好设置以及注册表等 全局变量的缺点 1 程序一开始就要创建好对象 一直未使用的话 就会浪费资源 2 全局变量只能约定只有一个实例 但是如果new新的实例 也是可以办到的 1 单件模
  • 最全面的Python重点知识汇总,建议收藏!

    这是一份来自于 SegmentFault 上的开发者 二十一 总结的 Python 重点 由于总结了太多的东西 所以篇幅有点长 这也是作者 缝缝补补 总结了好久的东西 Py2 VS Py3 print成为了函数 python2是关键字 不再

随机推荐

  • [DNN]CNN的结构分析和参数量计算

    文章目录 1 概述 1 1参数量计算方法 1 2神经元数量计算 1 3 连接数量计算 FLPOS 2 LeNet5结构和参数量计算 2 1 结构 2 2 对应的参数量计算 2 3 连接数量 FLOPS 资料来源 LeNet5分析 CNN参数
  • Mybatis-plus使用wrapper实现分页查询

    pom xml
  • 数据分级分类实施指南_逆袭!对数据分类分级治理快速提高企业数据管理水平...

    点击蓝色字免费订阅 每天收到这样的好信息 一 数据治理与数据分类分级 DAMA 数据管理知识体系指南 给出的定义 数据治理是对数据资产管理行使权力和控制的活动集合 规划 监控和执行 数据治理的职能是指导其他数据管理职能如何执行 数据治理就是
  • TeX Live for windows 安装及更新

    下载 install tl windows exe 或者install tl zip压缩包 解压之后右键以管理员身份运行install tl advanced bat 可以从官网下载 国内有镜像安装源 例如 https mirrors tu
  • Python智能合约开发指南(以太坊+web3py)

    在以太坊上获得一个基本的智能合约是一个很简单的事 只需google查询 ERC20代币教程 你会发现有关如何做到这一点的大量信息 以编程方式与合约交互完全是另一回事 如果你是一个Python程序员 那么教程就很少 所以写这个Python中的
  • java的队列实现方法_Java实现队列的三种方法集合

    数组实现队列 数组实现队列 class queue int a new int 5 int i 0 入队操作 public void in int m a i m 出队列操作 取出最前面的值 通过循环遍历把所有的数据向前一位 public
  • fairygui简单使用(unity)

    本文主要是引导怎么从fairygui页面ui编辑到unity的过程 如果想详细的那种 最好下载一个官方案例 里面都有详细的教程 不过这个对于新手来说还是挺好的 因为我刚开始以为是自己创建代码 自己写 先去官网下载一个gui编辑器 这是API
  • utf-8和gb2312的相互转换

    最近老是涉及到编码与解码的问题 GB2312转UTF 8 又或者UTF 8转GB2312 无意中在CSDN闲逛发现了一个CString 转UTF 8的思路 现摘寻下来 免得到时又找不着了 CString UTF8Convert CStrin
  • GDB 调试过程

    一 gdb 1 gdb 启动gdb 2 gdb tui 启动gdb 并且分屏显示源代码 3 gdb app 启动gdb调试指定程序app 4 gdb
  • WebSocket 前端使用

    h5提供了WebSocket网络协议 可以实现浏览器与服务器的双向数据传输 构造函数 WebSocket url protocol url WebSocket API URL URL之前需要添加ws 或者wss 类似http https p
  • FastICA代码(matlab版本)

    icasig A W fastica eegdata approach symm g tanh function Out1 Out2 Out3 fastica mixedsig varargin FASTICA Fast Independe
  • 后端开发学习Vue(一)

    Vue的介绍 官网 https cn vuejs org Vue是一个简单容易上手前端框架 例如 下面的代码可以快速构建一个表格
  • Redis数据结构存储系统:第二章:如何使用,BAT等大厂必问技术面试题

    public class RedisUtil private JedisPool jedisPool public void initPool String host int port int database 一线大厂Java面试题解析
  • map与java bean相互转换

    map与java对象的相互转换 1 使用org apache commons beanutils转换 2 使用Introspector转换 3 使用reflect转换 4 使用net sf cglib beans BeanMap转换 5 使
  • ubuntu 强制关闭卡死的pycharm

    ubuntu 环境是 16 04 终端输入 monitor 点击 System monitor 之后输入java 上图是已经删除过的 找到java之后右键点击kill OK
  • Vue(五)&&git

    Vue 三十二 git 1 概述 Git和代码托管中心 2 常用命令 3 本地仓库 4 远程仓库 5 团队内协作 1 非冲突 2 冲突 3 可视化 6 跨团队协作 7 分支 1 分支的好处 2 分支的构建 3 合并分支 8 SSH免密登录
  • html方框打勾字段,HTML+CSS入门 如何设置 checkbox复选框控件的对勾√样式

    本篇教程介绍了HTML CSS入门 如何设置 checkbox复选框控件的对勾 样式 希望阅读本篇文章以后大家有所收获 帮助大家HTML CSS入门 lt 我们要创建方框中的对勾 对于这一点 我们可以使用 after伪类创建一个新的元素 为
  • echarts中toolbox增加自定义图标和事件

    1 echarts提供了丰富的图标 如提供了 saveAsImage保存图片 restore 配置项还原 dataView数据视图工具 dataZoom 数据区域缩放 magicType 动态类型切换 brush 选择组件的控制按钮等 2
  • 开学第五周刷题记录

    Crypto Windows系统密码 首先拿到题目 我们打开看一下 它后缀是 hash 双击之后我们发现打不开 这种情况有两种原因 一是我们没有安装相应的软件 二是该文件被毁坏了 然后我们尝试用记事本打开看一下 结果发现原来重点在这 Adm
  • Jenkins使用问题记录

    1 启动 使用Jenkins的版本为2 138 3 下载war包后启动即可运行 指定使用8080端口 可自定义 java jar jenkins war httpPort 8080 建议后台启动 命令如下 1 启动 指定后台启动 nohup