[CI]Vue+SpringBoot项目显示CI构建号(补充)
请先查阅:
[CI]Docker构建时传递CI的唯一生成号作为版本号(SpringBoot、Vue)
https://blog.csdn.net/ks2686/article/details/147066204
如果你不想看CSDN话也可以看,我在博客园发的是前后端分开的两篇,同步CSDN的时候整合为一篇了
【Java】maven打包时自定义版本号,并通过接口返回前端(MANIFEST.MF法)
https://www.cnblogs.com/zwj/p/18814139
【Vue】CI - Docker构建传递版本号到.env
https://www.cnblogs.com/zwj/p/18814249
本文主要是做一些补充,因为我后续做了一些优化。
Dockerfile的优化
为了更好的定位问题,可以加上一句RUN echo "Build Number: ${BUILD_NUMBER}"
也就是
# 定义构建参数
ARG BUILD_NUMBER
ENV BUILD_NUMBER=${BUILD_NUMBER}
RUN echo "Build Number: ${BUILD_NUMBER}"
这样构建的时候你就知道dockerfile有没有成功从CI获取到构建版本号了
后端代码
之前的后端代码是就返回了构建版本号(buildId)或者unknown,以至于出现问题的时候就会有点懵,不知道哪个环节出错了。
所有后续做了个优化,如果获取失败了返回一下获取失败的原因
下面代码仅供参考,因为我直接让AI帮我优化的。(笑)
@GetMapping("/build")
public Result<String> getBuildId() {
// 定义默认值
final String DEFAULT_BUILD_ID = "unknown";
final String MANIFEST_PATH = "classpath:META-INF/MANIFEST.MF";
final String BUILD_VERSION_KEY = "Build-Version";
String buildId = DEFAULT_BUILD_ID;
AtomicReference<String> resultMessage = new AtomicReference<>("");
try {
// 加载 MANIFEST.MF 文件并获取 Build-Version 属性
Resource resource = resourceLoader.getResource(MANIFEST_PATH);
if (!resource.exists()) {
resultMessage.set("MANIFEST.MF file not found");
} else {
Manifest manifest = new Manifest(resource.getInputStream());
Attributes attributes = manifest.getMainAttributes();
// 使用 Optional 避免空指针检查
buildId = Optional.ofNullable(attributes.getValue(BUILD_VERSION_KEY))
.orElseGet(() -> {
resultMessage.set("Build-Version not found in MANIFEST.MF");
return "unknown";
});
}
} catch (IOException e) {
// 记录详细的错误日志
log.error("Error while reading MANIFEST.MF: {}", e.getMessage(), e);
resultMessage.set("Failed to read MANIFEST.MF: " + e.getMessage());
}
// 构造返回结果
Result<String> result = Result.ok(String.valueOf(resultMessage));
result.setResult(buildId); // 辅助信息帮助定位问题
return result;
}
假设你不想弄maven,你最多就改个dockerfile,那你可以考虑一下,使用@value的方式,直接获取docker的环境变量。
举个例子
@Value("${BUILD_ID:unknown}")
private String buildId;
@GetMapping("/build-id")
public String getBuildId() {
return buildId;
}
这个也是我用的第一个办法,只是boss觉得不合理,因此换成了MANIFEST.MF法子。有需要的小伙伴可以看看。
前端代码
因为后端现在msg返回的是提示信息,result返回的才是版本号,因此做了些修改。如果你在抄代码的话别忘了改。
// 获取项目构建id
const getBuildId = () => getAction("/sys/common/build");
methods: {
getDockerBuildId() {
getBuildId()
.then(data => {
this.backend_version = data.result;
})
.catch(error => {
console.error("Error:", error);
});
}
}
};

浙公网安备 33010602011771号