发布 jar 包到 maven 私服的时候 怎么通过 maven 的 version 就能快速定位到改 jar 包是基于哪个 git 的版本打包的?

2022-07-26 17:37:58 +08:00
 huyangq

前提:

maven 中的 pom.xml 是受 git 版本控制的,现在希望有这样一个脚本(或者是其他,目的是做到全自动完成),当上传 jar 包到私服之后,能够直接根据 maven 的 version 定位到是基于哪个 git 版本提交的? maven 的 version 生成策略可以任意,没有要求。

2538 次点击
所在节点    Java
17 条回复
XiLingHost
2022-07-26 17:39:54 +08:00
在 version 末尾加上 commit 的 id 试试
humpy
2022-07-26 17:43:08 +08:00
git-commit-id-plugin
huyangq
2022-07-26 17:48:01 +08:00
重新编辑了一下
前提:

- 构建工具:maven
- 版本管理工具:git

maven 中的 pom.xml 是受 git 版本控制的,现在希望有这样一个脚本(或者是其他,目的是做到全自动完成),能够自动生成 maven 的 version 。并且当上传 jar 包到私服之后,能够直接根据 maven 的 version 定位到是基于哪个 git 版本提交的? maven 的 version 生成策略可以任意,没有要求。

我自己想了一个方法,但是有个不好的地方。

方法:如果我在需要编译打包并上传的时候,将当前的 git 的 hash 作为 maven 的 version 值,然后将改值写进 pom.xml 的 version 节点,然后编译打包上传到私服。这样直接看到 maven 的 version 就知道是哪个版本编译的了。

不好的地方:因为 pom.xml 是要受 git 版本控制的,如果将 hash 值写进 pom.xml 中的 version 中,那么 pom.xml 又改动了,此时就需要再上传到 git ,上传到 git ,那么 git 的版本号又变动了。。。。这样就 tm 递归下去了。

找不到啥友好的方法了。
guxingke
2022-07-26 17:54:23 +08:00
路子有点野啊,为啥需要每个 commit 一个版本

---
合适的操作

- 开发中使用 xxx-SNAPSHOT 版本号
- release 就去掉 SNAPSHOT
misaka19000
2022-07-26 18:00:07 +08:00
你把 maven 的 jar 包版本和 git 的 tag 设置为一样的不就行了
winglight2016
2022-07-26 18:05:50 +08:00
要么改 version ,加时间戳,要么直接在 jar 里专门放一个 version.txt 文件

我也不太明白,为什么需要这么细的版本,按照这种搞法,不是很快就把 maven 库撑爆了?
XiLingHost
2022-07-26 18:16:06 +08:00
我记得 pom.xml 里的内容是可以从环境变量读取的啊,你在构建环境里把 commit 的 hash 写入环境变量不就好了
LeegoYih
2022-07-26 20:23:20 +08:00
反向操作....
正常应该是 jar 包发布后,保留对应版本的分支或者打 tag ,这样通过版本号可以找到 git history
sujin190
2022-07-26 22:42:37 +08:00
打包时提交个对应版本的 tag 呗
huyangq
2022-07-27 10:06:09 +08:00
@winglight2016 不是每次生成一个版本就提交到 maven 库的
huyangq
2022-07-27 10:19:23 +08:00
可能还是我表达的不清楚的需求,造成大家的疑惑了,不过想到方案了
弄一个文件 version.txt 里头放一个初始值,比如 1
脚本伪代码如下:
读取 version.txt 中的值,然后 + 1 得到 thisVersion
将 thisVersion 写入 version.txt 覆盖掉原来的值
newVersion="1.0.0."$thisVersion
mvn versions:set -DnewVersion=$newVersion 也就是写进 pom.xml 中的<version>标签
然后 git commit -m "发布版本:"$newVersion && git tag -a $newVersion
最后 mvn deploy
whatiam
2022-07-27 11:23:58 +08:00
我有一个方法,但是用的不是 maven ,而是 gradle 。思路是:
1. groovy 脚本在编译器查找到 git 信息,包含 commitIt ,branch ,提交时间,提交人 等。写入到一个文件,比如 info.yml 里面。
2. 将 info.yml 添加到 gitignore 里面。( info.yml 本身可以放到 resource 里面)也就是这个文件是每次运行任何 build java 相关的指令,都会重新生成一次,不用担心失效问题。
3. (可选)用 一个单例 Bean 提取 info.yml
4. (可选)在一个通用 module 里面引入 Swagger ,然后建立一个 Controller ,能返回这个 Bean

效果:
1. 无论 Devops 用什么形式打包,jar 包里面都会包含这个 info.yml
2. 最差的情况,编译环境用了 git + scp 来转移编译路径,也只会导致 info 丢失而不是编译失败。这一点很容易规避
3. 如果程序可以运行起来,那么就可以通过 controller 接口来返回 info.yml ,里面包含了所有你想在编译期间收集的信息。
4. 如果程序没法起来,或者只是一个 library ,那么只需要打开 jar 包也能手动找到这个 info.yml

以上方式稳定运行了很久了,应用到了我个人的大部分项目中。如果你是用 maven 的话,可以将步骤 1 改为 maven 插件,会麻烦很多,效果一样。但是我还是觉得应该尽早切换 gredle ,因为你要在编译器做的事情,只有 gradle 能方便轻松的完成。
whatiam
2022-07-27 11:25:10 +08:00
最后一句改为:但是我还是觉得应该尽早切换 [gradle] ,因为你要在编译 [期] 做的事情,只有 gradle 能方便轻松的完成。
NoahNye
2022-07-27 12:15:54 +08:00
用 git 打 tag ,然后 jar 包版本和 tag 关联起来。
ql562482472
2022-07-28 09:48:39 +08:00
在 pom.xml 中增加一个 properties ,比如
<properties>
<!-- 最后一次提交的 git hash 值-->
<code.id></code.id>
</properties>

mvn 构建时,增加-Dcode.id=xxx 构建时 jenkins 脚本一定能获取到 git hash 的,放进去。
ThreeK
2022-07-28 10:20:44 +08:00
maven-release-plugin 这插件绝对适合你。
ThreeK
2022-07-28 10:24:21 +08:00
@huyangq 递归了加个 skip ci 就好了啊。老哥 CI 是不刚接触。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX