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

news/2024/11/16 3:24:19/

背景:

线上部署的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";@Overridepublic 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.ppmy.cn/news/68911.html

相关文章

Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式(C++)(Mono)

Baumer工业相机堡盟工业相机使用BGAPI SDK将图像数据转换为Bitmap的几种方式&#xff08;C&#xff09; Baumer工业相机Baumer工业相机图像数据转为Bitmap的技术背景Baumer工业相机使用BGAPISDK将图像数据转换为Bitmap的几种方式1.引用合适的类文件2.BGAPI SDK原始图像数据为Bi…

docker安装mysql并修改远程登陆权限

一、docker 安装 启动容器 sudo docker start 831316f3ca61查看容器 sudo docker ps -a进入容器 sudo doker exec -it cf49e8f51a31 /bin/bash删除容器 sudo docker rm 831316f3ca61根据Dockerfile 创建镜像 sudo docker build -t solidifi .运行某个容器 sudo docker run -it…

边缘计算的挑战与未来:探索物联网、自动驾驶和智能城市的边缘计算应用

随着移动互联网、物联网和5G技术的发展&#xff0c;边缘计算正在成为一种重要的计算范式&#xff0c;越来越多的企业和组织开始将其应用于实际业务中。边缘计算旨在将计算和数据存储推向离用户更近的边缘设备&#xff0c;以提高响应速度、降低成本和提高用户体验。在本次研讨会…

【Swift】Swift和Objective-c混编

1.介绍 Swift和Objective-C都是苹果公司的编程语言&#xff0c;它们可以在同一个项目中同时使用。这种混编方式被称为“混合编程”&#xff08;Mixed Programming&#xff09;。 在混合编程时&#xff0c;我们需要用到一个桥接文件&#xff08;Bridging Header&#xff09;&a…

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道!

尽管 Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…

Maven下载安装及IDEA配置Maven的超详细教程

Maven下载安装及IDEA配置Maven的超详细教程 1、IntelliJ IDEA 下载、安装及配置过程2、maven下载、安装、配置过程2.1 mavan下载2.2 安装2.3 配置 3、在IDEA中配置Maven3.1 进入设置界面3.2 maven配置 4、IDEAmaven创建工程示例 Maven是一个能使我们的java程序开发节省时间和精…

【软考|软件设计师】某计算机系统的CPU主频为2.8GHz

目录 题&#xff1a; CPI MIPS 题&#xff1a; 某计算机系统的CPU主频为2.8GHz。某应用程序包括3类指令&#xff0c;各类指令的CPI &#xff08;执行每条指令所需要的时钟周期&#xff09;及指令比例如下表所示。执行该应用程序时 的平均CPI为______&#xff1b; 运算速度…

Spring 拦截器

目录 今日良言&#xff1a;心若有所向往&#xff0c;何惧道阻且长 一、Spring 拦截器 1.拦截器简介 2.实现自定义拦截器 今日良言&#xff1a;心若有所向往&#xff0c;何惧道阻且长 一、Spring 拦截器 1.拦截器简介 Spring Boot 拦截器是面向切面编程-----AOP 的具体实现…