java工程构建时带上分支,commit等信息

news2025/1/25 4:30:09

背景:

线上部署的jar包(不管是直接运行jar包,还是通过容器运行的jar)有时出现问题时需要查看源代码,需要知道该jar包是从哪个分支、哪个commit、哪个时间打包的。 有了这些信息能更好辅助我们分析判断问题。 这里以gradle工程为例子,给出一种简单添加构建信息的例子。 go工程可以参看k8s的源码中的构建脚本

具体步骤

这里是一个springboot工程,使用gradle. 只有运行打包好的jar请求api才有信息,直接在IDE中启动时,请求时没有构建信息返回,因为这些信息读取的jar包中的资源文件。所以必须是jar启动的才行

1, 在build.gradle中添加如下内容

备注:内容简单,就不添加注释了,就是执行gradle bootJar进行打包时,将这些git-branch、git-commit、git-commit-time.


  // 将Git信息和构建时间等元数据注入MANIFEST.MF文件
  manifest {
    attributes(
            'Implementation-Title': project.name,
            'Implementation-Version': project.version,
            'Built-By': System.getProperty('user.name'),
            'Built-Time': new Date(),
            'Git-Branch': getGitBranch(),
            'Git-Commit': getGitCommit(),
            'Git-Commit-Time': getGitCommitTime()
    )
  }
}


// 获取当前分支名称
static def getGitBranch() {
  try {
    def branch = 'git rev-parse --abbrev-ref HEAD'.execute().text.trim()
    return branch ?: 'unknown'
  } catch (Exception e) {
    System.err.println("fail to get branch, errMsg:" + e.getMessage())
    return 'unknown'
  }
}

// 获取当前提交的记录的commitId
static def getGitCommit() {
  try {
    def commit = 'git rev-parse  HEAD'.execute().text.trim()
    return commit ?: 'unknown'
  } catch (Exception e) {
    System.err.println("fail to get commit id, errMsg:" + e.getMessage())
    return 'unknown'
  }
}

// 获取当前Git提交的时间
static def getGitCommitTime() {
  try {
    def commitTime = 'git show -s --format=%ct HEAD'.execute().text.trim()
    return commitTime ? new Date(Long.parseLong(commitTime) * 1000L) : 'unknown'
  } catch (Exception e) {
    System.err.println("fail to get commit time, errMsg:" + e.getMessage())
    return 'unknown'
  }
}

2, 增加一个MyBuildInfo类

@Getter
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
@AllArgsConstructor
public class MyBuildInfo
{
  String gitBranch;
  String gitCommitId;
  String gitCommitTime;
  String builtTime;
}

3, 在service层提供构建信息

在对对应的service类方法中添加如下代码

  static final String GIT_BRANCH = "Git-Branch";
  static final String GIT_COMMIT_ID = "Git-Commit";
  static final String GIT_COMMIT_TIME = "Git-Commit-Time";
  static final String BUILD_TIME = "Built-Time";

  @Override
  public Response<MyBuildInfo> getBuildInfo()
  {
    String gitBranch = BuildUtils.getManifestAttribute(GIT_BRANCH);
    String gitCommitId = BuildUtils.getManifestAttribute(GIT_COMMIT_ID);
    String gitCommitTime = BuildUtils.getManifestAttribute(GIT_COMMIT_TIME);
    String builtTime = BuildUtils.getManifestAttribute(BUILD_TIME);

    gitBranch = StringUtils.isNoneBlank(gitBranch) ? gitBranch : UNKNOWN;
    gitCommitId = StringUtils.isNoneBlank(gitCommitId) ? gitCommitId : UNKNOWN;
    gitCommitTime = StringUtils.isNoneBlank(gitCommitTime) ? gitCommitTime : UNKNOWN;
    builtTime = StringUtils.isNoneBlank(builtTime) ? builtTime : UNKNOWN;

    MyBuildInfo buildInfo =  new MyBuildInfo(gitBranch, gitCommitId, gitCommitTime, builtTime);
    // 这里的new Response(buildInfo, "buildInfo done");以每个具体项目为准,这里这是实例返回符合工程规范的resp格式信息
    return new Response(buildInfo, "buildInfo done");
  }

其中BuildUtils是读取jar中资源的文件的具体类

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.Manifest;

@Slf4j
public class BuildUtils
{
  public static String getManifestAttribute(String attributeName)
  {
    try {
      Manifest manifest = new Manifest(BuildUtils.class.getResourceAsStream("/META-INF/MANIFEST.MF"));
      Attributes attributes = manifest.getMainAttributes();
      return attributes.getValue(attributeName);
    } catch (IOException e) {
        log.warn("fail to get info from manifest file, errMsg:{}", e.getMessage(), e);
        return "unknown";
    }
  }
}

jar包中资源文件实际是构建的这个文件
在这里插入图片描述

4, 在controller中暴露构建信息

在某个controller中添加可以查询构建信息的api。 其中@Operation是swagger的注解信息,如果没有使用swagger, 需要删除。

 @Operation(
    summary = "查询具体构建信息"
  )
  @GetMapping("/buildInfo")
  public Response<MyBuildInfo> getBuildInfo()
  {
    Response res = xxxService.getBuildInfo();
    return res;
  }

5, 最终效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【.NET基础加强第九课--事件】

.NET基础加强第九课--事件 Event 关键字委托,事件对比举例: 音乐播放事件用户对象&#xff0c;登录程序集反射 Event 关键字 委托,事件对比 委托是一种数据类型&#xff0c;可以用调用。 事件:对象&#xff08;对委托的一种封闭装&#xff09;。只能在类内部&#xff0c;只能…

基于Java的企业员工管理系统的设计与实现(论文+源码)_kaic

基于Java的企业员工管理系统的设计与实现 摘 要 随着电子信息的飞速发展&#xff0c;计算机已经融入到了生活的各个方面&#xff0c;越来越多的企业开始使用电子计算机来对企业进行管理&#xff0c;信息化的时代已经到来&#xff0c;各个企业无论大小都需要一个信息化的管理系…

模拟实现qsort函数(采用冒泡排序的方式)

前言&#xff1a; 之前我在C语言&#xff1a;指针详解【进阶】后篇中提到了qsort函数,qsort函数作为一个库函数&#xff0c;在我们日常的代码编写中可能会用到&#xff0c;在上面提到的文章中我们也进行使用了这个函数&#xff0c;大家也了解了一些这个函数的使用方法&#xff…

English Learning - L3 作业打卡 Lesson1 Day4 2023.5.8 周一

English Learning - L3 作业打卡 Lesson1 Day4 2023.5.8 周一 引言&#x1f349;句1: They may say they are red hot about something unfair.成分划分弱读连读爆破语调 &#x1f349;句2: When they are red hot, they are very angry about something.成分划分弱读连读爆破语…

【Ansys】mechanical和fluent求解器中使用的迭代方法-待补充

一、mechanical求解器 这个求解器&#xff0c;在网上很容易查到&#xff0c;迭代求解时用的就是牛顿-拉夫逊方法&#xff08;Newton-Raphson&#xff09;。 这是因为牛顿法求解非线性问题非常优秀。 而mechanical使用这个方法就能实现对几何非线性、材料非线性、接触非线性、…

Java入门和背景知识

文章目录 &#x1f525;常见编程语言介绍&#x1f525;Java 发展史&#x1f525;Java 的核心优势&#x1f525;Java 各版本的含义&#x1f525;Java 的特性和优势&#x1f525;Java 运行机制&#x1f525;JVM、JRE 和 JDK&#x1f525;Java 开发环境搭建&#x1f525;openJDK 和…

网络购物商场系统的设计与实现(论文+源码)_kaic

网络购物商场系统 摘 要 近年来&#xff0c;随着网络购物的兴起和普及&#xff0c;针对该市场需求开发一款在线购物系统是大势所趋。和实体店对比&#xff0c;在线购物系统商品种类齐全&#xff0c;价格优惠、还能够送货上门等优势。在此类系统中&#xff0c;用户能够在网上…

潍坊这一城市商业综合体有奖征名

云创金谷项目商业购物中心名称及IP形象征集开始啦&#xff01;&#xff01;你有什么好想法&#xff1f;快来参与吧&#xff01;&#xff01; 云创金谷&#xff0c;是奎文区重点打造的城市更新代表力作&#xff0c;位于文化路以东、新华路以西&#xff0c;北宫街以北、卧龙东街以…

如何在vue中使用dayjs修改日历组件的星期名称

在vue中使用日历组件Calendar时&#xff0c;头部的星期默认展示为[日, 一, 二, 三, 四, 五, 六]&#xff0c;如下图所示。 如何改变头部的星期展示呢&#xff0c;可以通过以下方法实现&#xff1a; const weekdaysShort [周日, 周一, 周二, 周三, 周四, 周五, 周六]; dayjs.l…

每日学术速递5.10

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.ZipIt! Merging Models from Different Tasks without Training 标题&#xff1a;压缩它&#xff01;无需训练即可合并来自不同任务的模型 作者&#xff1a;George Stoica, Danie…

MLF(中期借贷便利)[Medium-term lending facility],俗称麻辣粉

MLF麻辣粉是什么&#xff1f;简述MLF的作用以及对股市的影响&#xff01;_哔哩哔哩_bilibili 简述 中期借贷便利&#xff08;Medium-term lending facility&#xff0c;简称MLF&#xff09;是中国人民银行提供给商业银行的一种货币政策工具&#xff0c;能够向商业银行提供一…

BFT 最前线 | 谷歌举办 I/O 23 发布会,对标必应,百度搜索小范围公测对话功能,盖茨称AI利大于弊

文 | BFT机器人 01 谷歌举办 I/O 23 发布会&#xff0c;以 AI 为核心发布一系列新工具 北京时间 5 月 11 日凌晨&#xff0c;谷歌举办了今年的 Google I/O 开发者大会。比起去年&#xff0c;强调「整合全球信息&#xff0c;使人人都能从访问中受益」的使命&#xff0c;谷歌 CEO…

xxl-job2.1.2定时任务使用教程

一、配置xxl-job页面调度器 1.先下载2.1.2版本xxl-job的源码&#xff0c;地址&#xff1a;https://github.com/xuxueli/xxl-job/tree/2.1.2 2.下载完&#xff0c;用idea打开&#xff0c;配置jdk1.8、配置maven&#xff0c; 3.导入MySQL数据库xxl-job的一些表&#xff0c;导入的…

点餐小程序实战教程02-店铺数据源设计

我们上一篇分析了点餐小程序的功能点,有了功能就好往下开发了。低代码开发是模型驱动开发,啥是模型驱动呢?就是要求你先设计好表结构,然后再开发页面。 那要如何设计数据源呢?其实就是将信息分门别类的拆分到不同的数据源中。要拆分到哪些数据源是由我们页面上的信息决定…

真题详解(索引查询)-软件设计(七十三)

外观、装饰、策略模式代码详解-软件设计&#xff08;七十二)https://blog.csdn.net/ke1ying/article/details/130628033 关于一个类的静态成员描述中&#xff0c;不正确的是&#xff1a; 错误&#xff1a;一个类的静态数据成员值不可以被修改。 java语言特性是有________和 垃…

django基础知识详解

1. 安装与介绍 课程特点&#xff1a; 学习难度大&#xff0c;大部分内容需要理解并记忆文件较多易混淆学习阶段注重框架使用&#xff0c;工作阶段注重实现业务逻辑综合应用强&#xff0c;小练习少 1.1 Django框架的介绍 2005年发布,采用Python语言编写的开源web框架早期的时…

JVM垃圾收集器(二)

目录 1、Serial 2、ParNew 3、Parallel Scavenge 4、Serial Old 5、Parallel Old 6、CMS 1、为什么需要两次“stop the world” 2、CMS的并发带来的问题 3、CMS的触发时机 4、CMS的缺陷 5、为什么CMS用清除算法 7、G1 1、Region 2、设计Region的意义 3、G1的三种…

【C++】——类与对象(中)+日期类对象的实现

文章目录 1. 前言2. 类的6个默认成员函数3. 构造函数4. 析构函数5. 拷贝构造函数6. 运算符重载6.1 赋值运算符重载 7. const成员8. 取地址及const取地址操作符重载9. 日期类对象的完整实现9.1 头文件9.2 源文件9.3 测试代码 10. 结尾 1. 前言 今天我们来继续学习C类与对象&…

网安学习路线!史上最详细没有之一

我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后&…

医日健自助售药机

产品概述 医日健智能自助售药机整合了信息化管理技术 、远程监控管理技术 、自动化技术、人脸识别技术等多种先进技术 &#xff0c;结合药品零售的特点 &#xff0c;通过在医院、诊所、药店、便利店、社区等场所部署药品自助售药机 &#xff0c;为用户提供自选购药服务&#x…