前提:
maven 中的 pom.xml 是受 git 版本控制的,现在希望有这样一个脚本(或者是其他,目的是做到全自动完成),当上传 jar 包到私服之后,能够直接根据 maven 的 version 定位到是基于哪个 git 版本提交的? maven 的 version 生成策略可以任意,没有要求。
![]() | 1 KagurazakaNyaa 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 KagurazakaNyaa 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 这插件绝对适合你。 |