一、场景介绍

  在项目开发过程中,项目版本号的管理和维护对于开发人员来说是一个非常不愿意去维护的事情。特别是微服务盛行的今天,子模块独立开发,子模块独立升级。各种版本之间的交叉并行,老虎、老鼠、傻傻分不清楚。

  不同的企业对项目的版本管理有不同的规定,我们应该根据不同的需求去指定版本管理流程。本次主要以每一次的 Jenkins 编译为一个版本号为例,来阐述采用 Version Number Plug 做版本管理的实现细节。

  在实践过程中遇到一个问题,就是每次采用 Jenkins 编译 pom.xml 的时候,Version Number Plug 的版本号总会比 build 出来的 jar 项目大一个版本号,网上寻觅出来的原因是因为在采用 Jenkins 构建编译的时候,Jenkins 会将 pom.xml 先加载到内存中,然后通过 setversion 命令进行版本设置,但是实际打包的时候,还是读取的内存中的 pom.xml 文件导致。目前还没有找到合适的解决方案,希望广大嫖友集思广益,为我解决这个问题,在此谢过~!

二、插件安装
  1. Jenkins 的插件管理中安装 Version Number 插件

    在这里插入图片描述

  2. 重启 Jenkins 服务,使该插件为 Jenkins 服役

三、插件配置
  1. 找到需要采用该插件进行版本管理的项目模块 → 配置 → 构建环境

    在这里插入图片描述

    P.S

    Jenkins 中直接调用 Shell 脚本中调用 echo ${BUILD_VERSION} 查看版本的效果是否和自己的预设一致。

  2. 构建设置

    pom.xml
    
    # ${BUILD_VERSION} 获取上一步骤的版本号,采用该版本号进行打包(但是存在文档开头说到的坑)
    versions:set -DnewVersion=${BUILD_VERSION} clean compile install -Dmaven.test.skip=true
    

    此坑的解释

    解决此坑的办法应该是在上面的命令行中,如何设置两次执行构建打包的 mvn 命令即刻解决,但是笔者才疏学浅,暂时没有想到好的方案。

    在这里插入图片描述

  3. 构建效果

    在这里插入图片描述

  4. 参数说明

    变量名称功能说明
    BUILD_DATE_FORMATTED如果此参数是用引号硬起来的 JAVA 日期格式字符串,则它将替换为以该字符串格式设置的构建日期。
    如果没有参数,则将是标准简单的日期格式。如:{BUILD_DATE_FORMATTED,“yyyy-MM-dd”}
    BUILD_DAY没有参数,它只是返回构建的一天作为一个整数。如果有一个参数,它需要参数中的字符数,
    并使用填充日期字符串。例如,如果是本月的第三天,$ {BUILD_DAY}将返回3,
    B U I L D D A Y , X 将 返 回 3 , {BUILD_DAY,X}将返回3, BUILDDAYX3{BUILD_DAY,XX}将返回03。
    BUILD_WEEK返回BUILD_DAY的相同参数约定
    BUILD_MONTH返回月份,使用与BUILD_DAY相同的参数约定
    BUILD_YEAR返回BUILD_DAY的相同参数约定
    BUILDS_TODAY返回今天发生的构建的数量,包括这个。这在午夜重置。参数约定与BUILD_DAY相同
    BUILDS_THIS_WEEK返回本周发生的构建数量,包括这一个。这在一周的开始重置。参数约定与BUILD_DAY相同
    BUILDS_THIS_MONTH返回本月发生的构建数量,包括这一个。这在本月的第一个月重置。参数约定与BUILD_DAY相同
    BUILDS_THIS_YEAR返回今年发生的构建数量。这在今年的第一个重置。参数约定与BUILD_DAY相同。
    BUILDS_ALL_TIME返回自项目开始以来发生的构建数量。这与hudson内部版本号不同,因为它可以定期重置
    (例如,从1.0. B U I L D S A L L T I M E 移 到 2.0. {BUILDS_ALL_TIME}移到2.0. BUILDSALLTIME2.0.{BUILDS_ALL_TIME},
    并且可以配置为以任意数字开始而不是标准开始日期。
    MONTHS_SINCE_PROJECT_START自项目开始日期以来的月数。这严格依赖于当前版本的月份和项目开始日期的月份;
    如果项目在10月31日开始,并且构建在11月1日,
    那么这将返回1.如果项目从10月1日开始,
    并且构建在11月30日,这也将返回1.参数约定与BUILD_DAY相同。
    YEARS_SINCE_PROJECT_START项目开始日期以来的年数。像MONTHS_SINCE_PROJECT_START一样,这仅取决于年份;
    其他在$ {}中包含的任何其他参数被替换为具有相同名称的环境变量(如果有的话),
    或者失败,则被忽略。例如,这可以用来集成源代码控制版本号。
四、缺陷说明

  如文章开头所说,每次构建出来的版本都会小于 Version Number 插件设置的版本,原因在于在 Jenkins 中执行 mvn 打包脚本的时候,将 pom.xml 结构加载到了内存,所以,通过命令修改版本号的时候,确实是将版本配置到了 pom.xml 文件中,但是在 package 的时候拿的还是内存中的 pom.xml 文件,具体请看此处解释

  如果在 Jenkins 的构建中执行 mvn 可以分开执行,就可以解决这个问题了。目前还没有找到合适的解决方案,希望广大嫖友集思广益,为我解决这个问题,在此谢过~!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐