前言: 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 中配置的),从而引发了这个问题,踩到了这个深埋多年的坑~~ 问题得到解答,顿时一块石头落地,心情放松~~