重启了下Jenkins,踩到了一个深埋多年的坑
前言:
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。
Jenkins的主要功能包括:
1、持续的软件版本发布/测试项目。
2、监控外部调用执行的工作。
问题描述
业务方反馈,Jenkins 上某个 job 没有将 release 版本的组件发布到 maven 私服,以致依赖方无法引用依赖。
了解这个问题的更多信息:
该 job 构建状态为 success,它使用 maven-release-plugin 时,没有将 release 版本的组件发布到 maven 私服,而是将 SNAPSHOT 版本的包发布到 maven 私服,同时 git 仓库的 pom.xml 版本也没升级,但是倒是打了 tag。
初步定位,切换备份
为什么会出现这个问题呢?
回顾最近 对 Jenkins 做的修改,共有两项
曾修改了 maven 工具的位置,难道是这个影响了?
也曾修改了 Jenkins 的 JVM 参数,然后重启了 Jenkins,难道是这个影响了?
理论上,修改 maven 工具的位置和修改 Jenkins 的 JVM 参数,和这个没关系的
恢复 maven 工具的位置,问题没有解决
恢复 Jenkins 的 JVM 参数,然后重启了 Jenkins,问题依旧
那那到底是什么原因呢?经过一段时间定位,这个奇怪的问题并没有得到解决,一时找不到答案
而同事在 Jenkins 备机构建该 job,表现正常,于是紧急切换备机,先让业务正常运行,然后继续定位问题
进一步定位,有所眉目
定位问题的过程并非一帆风顺,不断推测验证,有的时候会焦急不安,也难免陷入思维误区~~
所幸有备无患,可以静下心来深入分析问题~~
仔细查看 Jenkins 构建日志,对比正常的和有问题的日志:
正常的日志如下:
有问题的日志如下:
发现正常的在执行 mvn release:prepare 命令时少了某些步骤,如 git commit、git push。
同时,这步有问题也导致执行 mvn release:perform 时出现了问题,将SNAPSHOT 版本的包发布到 maven 私服。
查阅官网,借力搜索
查看 maven-release-plugin 官方文档,查看 prepare 步骤具体做的事情:
通过 bing 搜索 mvn release prepare not Commit the modified POMs,在 stackoverflow 找到一个相关问答:
https://stackoverflow.com/questions/15166781/mvn-releaseprepare-not-committing-changes-to-pom-xml
投票最高的答案截图如下:
问题解决,原来是环境兼容性问题
在上面的答案中,通过在 pom.xml 中通过 dependency 指定了 maven-scm-provider-gitexe 的版本为 1.8.1
难道是 maven-release-plugin 和 git 版本兼容性有关系?
对比服务器的 git 版本:
一个是 git-1.8.13,一个是 git- 2.1.0
备份机器是 git-1.8.13,这个环境环境下表现正常
将原 Jenkins 服务器 git 版本降到 1.8.13,终于终于,表现正常了~~~
追本溯源,为何此坑深埋多年?
但是这次出现的问题实在是很诡异,根源依旧未知,服务器上以前怎么就没问题呢?
后来发现服务器上有两个版本的 git,一个是 git-1.8.4.2,一个是 git-2.1.0
这应该是当时启动 Jenkins 的时候,当时环境下 git 的版本是 1.8.4.2
并且Jenkins 服务自从2014年运行以来从来没有重启过,所以这个问题一直没有出现
而在重启 Jenkins 的时候,git 是 2.1.0(这个环境变量是在 /etc/profile 中配置的),从而引发了这个问题,踩到了这个深埋多年的坑~~
问题得到解答,顿时一块石头落地,心情放松~~