jenkins打包报错的排查思路与解决
背景
废话少说, 在新建一个jenkins流水线时, 碰到了打包死活无法成功的问题, 相关配置如下图

运行后最后的日志如图

定位问题
通过查看日志, 发现报错的模块是构建后执行shell的时候, 但是由于我的shell没有输出, 还不明确是哪行出的问题.
仔细观察了下shell, 发现并没有任何的语法与逻辑问题, 这就让我感到有点奇怪了: 真的是执行shell出错了吗? 这么简单的shell在哪出错的?
通过看jenkins日志, 连问题出在哪都不太明确, 所以我到应用服务器上确认下, 通过查看jar包的更改时间, 发现jar包已经被更新; 再通过ps -ef查看进程, 发现没有这个jar包对应的进程; 查看日志文件, 发现应该被重命名的日志文件没有被重命名.
通过上述情况可以得知, 应该是kill命令到mv命令这一段shell出错了, 但是怎么看都没有问题, 我还是无法想象这么简单的脚本哪里出错了.
排查问题
第一感觉
既然shell的语法和逻辑没问题, 那么我第一时间想到的是环境有问题, 翻译一下就是mv命令或者kill命令不存在??? 登录应用服务器, 执行type mv和type kill命令, 发现都是正常的.
但是此时我的是交互式shell, jenkins执行shell用的是非交互式shell, 二者环境还是有点差细微异的, 但是不至于连这么基础的命令都有差异, 不过既然想到了, 就要验证一下.
在jenkins的shell中, 加入了type mv和type kill语句, 看日志发现也是正常的.
在应用服务器上执行shell
既然不知道哪里出问题了, 那我只有祭出最后的绝招了: debug shell脚本! 没错, shell脚本也是可以debug的, debug脚本可以清楚的看到每行执行的过程以及每个变量.
我在应用服务器上新建了一个 test.sh 文件, 并将jenkins中的shell写入文件中, 通过执行bash -x test.sh来debug脚本, 然而结果是, 脚本执行成功了!!! shell脚本所有逻辑都执行成功了!!!???
不死心的我执行了echo $?, 发现结果是一个大大的0, 脚本真的执行成功了(苦涩+绝望)

找到并解决问题
应用服务器上的脚本执行成功真的给我很大的冲击, 但是冷静下来之后, 觉得我手动执行脚本和jenkins执行shell可能还是有差异的, 所以放弃了在应用服务器上debug脚本, 直接在jenkins中手动添加echo语句做为调试日志, 添加调试语句后的shell如下图所示:

然后再次构建, 查看jenkins日志, 仔细观察日志后终于发现问题在哪了!!!

通过日志可以看到执行完for循环后就不往下继续执行了, for循环中的kill也是执行了的, 但是! kill执行了两次, 其中一次kill 8214是kill原本运行的jar包, 还有一次kill 8301, 8301这个进程是? 观察前面ps -ef的结果, 发现8301这个进程是bash -c ......一大串, 这一大串不就是我在jenkins中写的shell命令吗? 原来jenkins执行shell命令是通过bash -c ......的方式来执行, 原来for循环中的kill自己把自己杀了, 到这里一切都真相大白了!
既然知道了原因, 那修改起来也很简单了, 将for循环的ps -ef | grep java | grep $JAR_NAME | awk '{print $2}'修改为ps -ef | grep java | grep $JAR_NAME | grep -v grep | awk '{print $2}', 多添加一个| grep -v grep就可以解决这个问题
总结与感悟
公司里启动应用都是将命令写到脚本里, 将启动脚本放在应用服务器上, jenkins的shell只是简单的一行执行脚本的命令, 这样也可以避免上述的问题, 原来还有这层考虑, 学习到了
相关链接
- 交互式shell: https://www.cnblogs.com/wbourne/p/15228515.html
- debug shell脚本: https://www.cnblogs.com/wbourne/p/16468485.html
jenkins打包报错的排查思路与解决的更多相关文章
- 在Windows平台下Qt的exe报错问题排查步骤
在Windows平台下Qt的exe报错问题排查步骤 工具介绍: 1. Dependency Worker Dependency Worker是一个免费的用具用来扫描任何的32bit 或者64bit 的 ...
- webpack 打包报错:One CLI for webpack must be installed. These are recommended choices, delivered as separate packages
webpack 打包报错: One CLI for webpack must be installed. These are recommended choices, delivered as sep ...
- 解决xcode10打包报错:That command depends on command in Target ‘xxx’:scrpit phase"[CP] Copy Pods Resources"
问题:使用xcode10打包报错,提示 error:Multiple commands produce ‘xxxx/xxx.app’ 1)Target ‘xx’ has create director ...
- jenkins编辑报错Exception when publishing, exception message的解决办法
jenkins编辑报错Exception when publishing, exception message的解决办法 查看目标主机的磁盘空间是否占满,清理磁盘空间即可
- maven install 打包 报错 Cannot run program "gpg.exe": CreateProcess error
打包报错, mvn install后加上参数-Dgpg.skip,例如:mvn install -Dgpg.skip 即可解决. 我们也可以去掉 这个 插件 <plugin> ...
- 【Devops】【docker】【CI/CD】Jenkins源码管理,设置gitlab上项目的clone地址 + jenkins构建报错:Please make sure you have the correct access rights and the repository exists.
注意,如果 jenkins构建报错:Please make sure you have the correct access rights and the repository exists. 而此时 ...
- Jenkins构建报错(Jenkins is reserved for jobs with matching label expression)解决办法
Jenkins构建报错Jenkins is reserved for jobs with matching label expression 原因节点配置导致 修改配置
- vue-cli 打包报错:Unexpected token: punc (()
vue-cli 打包报错: ERROR in static/js/vendor.ed7d2353f79d28a69f3d.js from UglifyJs Unexpected token: punc ...
- [one day one question] webpack 打包报错 Cannot assign to read only property 'exports' of object '#<Object>'
问题描述: webpack 打包报错 Cannot assign to read only property 'exports' of object '#<Object>',这怎么破? 解 ...
- Mac Angular打包报错xcode-select: error: tool 'xcodebuild' requires Xcode
Mac Angular打包报错: Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer ...
随机推荐
- 终端命令行前出现(base)
原因 (base) 的出现是因为电脑安装了conda后,每次打开终端都会自动启动conda的base环境 解决 取消自动启动base环境:conda config --set auto_activat ...
- 2020-10-24:go中channel的recv流程是什么?
福哥答案2020-10-24: ***[评论](https://user.qzone.qq.com/3182319461/blog/1603496305)
- 2020-11-27:go中,map的读流程是什么?
福哥答案2020-11-27:[答案来自此链接:](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=12)源码位于runtime/map.go文件中的map ...
- Django4全栈进阶之路5 Model模型
在 Django 中,模型(Model)是用于定义数据结构的组件,其作用如下: 定义数据结构:模型用于定义数据库中的表格和表格中的字段(列),其中每个模型类对应一个表格,模型中的每个字段对应表格中的一 ...
- 代码随想录算法训练营Day38 动态规划
代码随想录算法训练营 代码随想录算法训练营Day38 动态规划|理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 理论基础 动态规划,英文:Dynamic Programm ...
- python利用subprocess执行shell命令
subprocess以及常用的封装函数 运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python中 ...
- CANoe _ Panel面板的创建过程
在Canoe中创建Panel面板,用于显示和操作CAN网络的数据和信号,遵循以下步骤: 1.打开Canoe 启动Canoe软件. 2.打开项目 在Canoe的菜单栏中,选择"File&quo ...
- 如何让别人访问你本地允许的Vue本地项目
步骤一: 将config/index.js 中的host: localhost 改为 host:'0.0.0.0'步骤二:在package.json 将scripts 下面的dev 后 ...
- 这就是艺术,优雅的二维码生成器「GitHub 热点速览」
平时如果没有需要一般那团黑乎乎的二维码,估计路过的人看见第一眼就不会再看第二眼.但是假若,它是个帅哥靓妹,估计就不同了,更别提像是艺术画一样,将编码图案融入到画里的二维码生成器 qrbtf 作者的新作 ...
- 云原生时代崛起的编程语言Go远程调用gRPC实战
@ 目录 概述 定义 背景 特点 四种服务方法 实战 环境配置 proto文件 简单RPC Token认证 服务器流式RPC 客户端流式RPC 双向流式RPC 概述 定义 gRPC 官网地址 http ...