V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huyangq
V2EX  ›  Java

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

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

    前提:

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

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

    17 条回复    2022-07-28 10:24:21 +08:00
    XiLingHost
        1
    XiLingHost  
       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 库撑爆了?
    XiLingHost
        7
    XiLingHost  
       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   ·   实用小工具   ·   2957 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:06 · PVG 16:06 · LAX 00:06 · JFK 03:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.