发布 jar 包到 maven 私服的时候 怎么通过 maven 的 version 就能快速定位到改 jar 包是基于哪个 git 的版本打包的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huyangq
V2EX    Java

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

  •  
  •   huyangq 2022-07-26 17:37:58 +08:00 3056 次点击
    这是一个创建于 1180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前提:

    • 构建工具:maven
    • 版本管理工具:it

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

    17 条回复    2022-07-28 10:24:21 +08:00
    KagurazakaNyaa
        1
    KagurazakaNyaa  
       2022-07-26 17:39:54 +08:00
    在 version 末尾加上 commit 的 id 试试
    humpy
        2
    humpy  
       2022-07-26 17:43:08 +08:00
    git-commit-id-plugin
    huyangq
        3
    huyangq  
    OP
       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
        4
    guxingke  
       2022-07-26 17:54:23 +08:00
    路子有点野啊,为啥需要每个 commit 一个版本

    ---
    合适的操作

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

    我也不太明白,为什么需要这么细的版本,按照这种搞法,不是很快就把 maven 库撑爆了?
    KagurazakaNyaa
        7
    KagurazakaNyaa  
       2022-07-26 18:16:06 +08:00
    我记得 pom.xml 里的内容是可以从环境变量读取的啊,你在构建环境里把 commit 的 hash 写入环境变量不就好了
    LeegoYih
        8
    LeegoYih  
       2022-07-26 20:23:20 +08:00
    反向操作....
    正常应该是 jar 包发布后,保留对应版本的分支或者打 tag ,这样通过版本号可以找到 git history
    sujin190
        9
    sujin190  
       2022-07-26 22:42:37 +08:00 via Android
    打包时提交个对应版本的 tag 呗
    huyangq
        10
    huyangq  
    OP
       2022-07-27 10:06:09 +08:00
    @winglight2016 不是每次生成一个版本就提交到 maven 库的
    huyangq
        11
    huyangq  
    OP
       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
        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 能方便轻松的完成。
    whatiam
        13
    whatiam  
       2022-07-27 11:25:10 +08:00
    最后一句改为:但是我还是觉得应该尽早切换 [gradle] ,因为你要在编译 [期] 做的事情,只有 gradle 能方便轻松的完成。
    NoahNye
        14
    NoahNye  
       2022-07-27 12:15:54 +08:00 via iPhone
    用 git 打 tag ,然后 jar 包版本和 tag 关联起来。
    ql562482472
        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 的,放进去。
    ThreeK
        16
    ThreeK  
       2022-07-28 10:20:44 +08:00
    maven-release-plugin 这插件绝对适合你。
    ThreeK
        17
    ThreeK  
       2022-07-28 10:24:21 +08:00
    @huyangq 递归了加个 skip ci 就好了啊。老哥 CI 是不刚接触。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1442 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 16:52 PVG 00:52 LAX 09:52 JFK 12:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86