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 ...
随机推荐
- 2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的
2022-04-07:给定一个只由'a'和'b'组成的字符串str, str中"ab"和"ba"子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消 ...
- 2021-08-11:按要求补齐数组。给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用
2021-08-11:按要求补齐数组.给定一个已排序的正整数数组 nums,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 ...
- Golang接收者方法语法糖
1.概述 在<Golang常用语法糖>这篇博文中我们讲解Golang中常用的12种语法糖,在本文我们主要讲解下接收者方法语法糖. 在介绍Golang接收者方法语法糖前,先简单说下Go 语言 ...
- linux中使用jenkins自动部署前端工程
1.去年在自己的服务器上安装了jenkins,说用来自己研究一下jenkins自动化部署前端项目,jenkins安装好了,可是一直没管,最近终于研究了一下使用jenkins自动化部署,以此记录下来. ...
- 洛谷 - P1030 求先序
Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8≤8). Input 共两行,均为大写字母组成的字符串,表示一棵二叉 ...
- 计算机网络 传输层协议TCP和UDP
目录 一.传输层协议 二.tcp协议介绍 三.tcp报文格式 四.tcp三次握手 五.tcp四次挥手 六.udp协议介绍 七.常见协议和端口 八.有限状态机 一.传输层协议 传输层协议主要是TCP和U ...
- 基于.NetCore开源的Windows的GIF录屏工具
推荐一个Github上Start超过20K的超火.好用的屏幕截图转换为 GIF 动图开源项目. 项目简介 这是基于.Net Core + WPF 开发的.开源项目,可将屏幕截图转为 GIF 动画.它的 ...
- 连接内网 SSH 新姿势,告别慢速度及防火墙限制
近些年,因为某些原因,我们常常在家远程研发业务,当某些程序或业务代码在公司电脑上时,就需要访问公司电脑远程操作, SSH 登录 Linux 是一种非常常见的方式,但是在一些情况下,SSH 无法直接连接 ...
- 6.4. HttpClient
1. 什么是HttpClient? HttpClient是Java 11中引入的一个新特性,用于支持同步和异步发送HTTP请求以及处理HTTP响应.它提供了简单易用的API,使得发送HTTP请求变得非 ...
- 完成第一个 Vue3.2 项目后,使用体会
第一次Composition API 在vue3.2中,正式支持了script setup的写法,这样可以大大简化组件的代码量,减少一些重复操作,我认为当你写vue3时,应该把这当作默认写法.在vue ...