前提:
maven 中的 pom.xml 是受 git 版本控制的,现在希望有这样一个脚本(或者是其他,目的是做到全自动完成),当上传 jar 包到私服之后,能够直接根据 maven 的 version 定位到是基于哪个 git 版本提交的? maven 的 version 生成策略可以任意,没有要求。
1
XiLingHost 2022-07-26 17:39:54 +08:00
在 version 末尾加上 commit 的 id 试试
|
2
humpy 2022-07-26 17:43:08 +08:00
git-commit-id-plugin
|
3
huyangq OP 重新编辑了一下
前提: - 构建工具: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 递归下去了。 找不到啥友好的方法了。 |
4
guxingke 2022-07-26 17:54:23 +08:00
路子有点野啊,为啥需要每个 commit 一个版本
--- 合适的操作 - 开发中使用 xxx-SNAPSHOT 版本号 - release 就去掉 SNAPSHOT |
5
misaka19000 2022-07-26 18:00:07 +08:00
你把 maven 的 jar 包版本和 git 的 tag 设置为一样的不就行了
|
6
winglight2016 2022-07-26 18:05:50 +08:00
要么改 version ,加时间戳,要么直接在 jar 里专门放一个 version.txt 文件
我也不太明白,为什么需要这么细的版本,按照这种搞法,不是很快就把 maven 库撑爆了? |
7
XiLingHost 2022-07-26 18:16:06 +08:00
我记得 pom.xml 里的内容是可以从环境变量读取的啊,你在构建环境里把 commit 的 hash 写入环境变量不就好了
|
8
LeegoYih 2022-07-26 20:23:20 +08:00
反向操作....
正常应该是 jar 包发布后,保留对应版本的分支或者打 tag ,这样通过版本号可以找到 git history |
9
sujin190 2022-07-26 22:42:37 +08:00 via Android
打包时提交个对应版本的 tag 呗
|
10
huyangq OP @winglight2016 不是每次生成一个版本就提交到 maven 库的
|
11
huyangq OP 可能还是我表达的不清楚的需求,造成大家的疑惑了,不过想到方案了
弄一个文件 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 |
12
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 能方便轻松的完成。 |
13
whatiam 2022-07-27 11:25:10 +08:00
最后一句改为:但是我还是觉得应该尽早切换 [gradle] ,因为你要在编译 [期] 做的事情,只有 gradle 能方便轻松的完成。
|
14
NoahNye 2022-07-27 12:15:54 +08:00 via iPhone
用 git 打 tag ,然后 jar 包版本和 tag 关联起来。
|
15
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 的,放进去。 |
16
ThreeK 2022-07-28 10:20:44 +08:00
maven-release-plugin 这插件绝对适合你。
|