背景

废话少说, 在新建一个jenkins流水线时, 碰到了打包死活无法成功的问题, 相关配置如下图

运行后最后的日志如图

定位问题

通过查看日志, 发现报错的模块是构建后执行shell的时候, 但是由于我的shell没有输出, 还不明确是哪行出的问题.

仔细观察了下shell, 发现并没有任何的语法与逻辑问题, 这就让我感到有点奇怪了: 真的是执行shell出错了吗? 这么简单的shell在哪出错的?

通过看jenkins日志, 连问题出在哪都不太明确, 所以我到应用服务器上确认下, 通过查看jar包的更改时间, 发现jar包已经被更新; 再通过ps -ef查看进程, 发现没有这个jar包对应的进程; 查看日志文件, 发现应该被重命名的日志文件没有被重命名.

通过上述情况可以得知, 应该是kill命令到mv命令这一段shell出错了, 但是怎么看都没有问题, 我还是无法想象这么简单的脚本哪里出错了.

排查问题

第一感觉

既然shell的语法和逻辑没问题, 那么我第一时间想到的是环境有问题, 翻译一下就是mv命令或者kill命令不存在??? 登录应用服务器, 执行type mvtype kill命令, 发现都是正常的.

但是此时我的是交互式shell, jenkins执行shell用的是非交互式shell, 二者环境还是有点差细微异的, 但是不至于连这么基础的命令都有差异, 不过既然想到了, 就要验证一下.

在jenkins的shell中, 加入了type mvtype 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只是简单的一行执行脚本的命令, 这样也可以避免上述的问题, 原来还有这层考虑, 学习到了

相关链接

jenkins打包报错的排查思路与解决的更多相关文章

  1. 在Windows平台下Qt的exe报错问题排查步骤

    在Windows平台下Qt的exe报错问题排查步骤 工具介绍: 1. Dependency Worker Dependency Worker是一个免费的用具用来扫描任何的32bit 或者64bit 的 ...

  2. 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 ...

  3. 解决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 ...

  4. jenkins编辑报错Exception when publishing, exception message的解决办法

    jenkins编辑报错Exception when publishing, exception message的解决办法 查看目标主机的磁盘空间是否占满,清理磁盘空间即可

  5. maven install 打包 报错 Cannot run program "gpg.exe": CreateProcess error

    打包报错, mvn install后加上参数-Dgpg.skip,例如:mvn install -Dgpg.skip   即可解决. 我们也可以去掉 这个 插件   <plugin>    ...

  6. 【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. 而此时 ...

  7. Jenkins构建报错(Jenkins is reserved for jobs with matching label expression)解决办法

    Jenkins构建报错Jenkins is reserved for jobs with matching label expression 原因节点配置导致 修改配置

  8. vue-cli 打包报错:Unexpected token: punc (()

    vue-cli 打包报错: ERROR in static/js/vendor.ed7d2353f79d28a69f3d.js from UglifyJs Unexpected token: punc ...

  9. [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>',这怎么破? 解 ...

  10. Mac Angular打包报错xcode-select: error: tool 'xcodebuild' requires Xcode

    Mac Angular打包报错: Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer ...

随机推荐

  1. 一文彻底搞懂ZAB算法,看这篇就够了!!!

    最近需要设计一个分布式系统,需要一个中间件来存储共享的信息,来保证多个系统之间的数据一致性,调研了两个主流框架Zookeeper和ETCD,发现都能满足我们的系统需求.其中ETCD是K8s中采用的分布 ...

  2. Java并发(四)----线程运行原理

    1.线程运行原理 1.1 栈与栈帧   Java Virtual Machine Stacks (Java 虚拟机栈 JVM) 我们都知道 JVM 中由堆.栈.方法区所组成,其中栈内存是给谁用的呢?其 ...

  3. ai问答:vue3+pinia+WebSocket 封装断线重连(实战)

    把socket实例 挂载到全局 为方便梳理,请忽略typescript # main.ts import {createApp} from 'vue' import App from './App.v ...

  4. 关于PM系统以及OA系统的工作基本心态

    这个系统的目的是什么? 这个系统的初衷是好的,是一个信息化管理的数据科学系统,目的是更好的累计公司的业务数据. 但实际操作过程中,包括推广过程中,你能看到上层人员对于这个系统的态度,更像是一个个人企业 ...

  5. 2023-05-11:给你一个 m x n 的二进制矩阵 grid, 每个格子要么为 0 (空)要么为 1 (被占据), 给你邮票的尺寸为 stampHeight x stampWidth。 我们想将

    2023-05-11:给你一个 m x n 的二进制矩阵 grid, 每个格子要么为 0 (空)要么为 1 (被占据), 给你邮票的尺寸为 stampHeight x stampWidth. 我们想将 ...

  6. LeetCode 周赛 345(2023/05/14)体验一题多解的算法之美

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 往期回顾:LeetCode 双周赛第 104 场 · 流水的动态规划,铁打的结构化思考 周赛概览 T1. 找 ...

  7. y总算法基础课+算法提高课+算法进阶课超全模板

    y总超全算法模板 y总模板自取 喜欢的可以点个赞支持一下^-^ 模板展示

  8. uniapp主题切换功能的第二种实现方式(scss变量+require)

    在上一篇 "uniapp主题切换功能的第一种实现方式(scss变量+vuex)" 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接 ...

  9. 深入解析React DnD拖拽原理,轻松掌握拖放技巧!

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值.. 本文作者:霁明 一.背景 1.业务背景 业务中会有一些需要实现拖拽 ...

  10. 智能合约HardHat框架环境的搭建

    1.首先创建一个npm项目 PS C:\Users\lcds\blockchainprojects> mkdir hardhatcontract PS C:\Users\lcds\blockch ...