[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);
        });
    }
  }
};
posted @ 2025-04-15 15:38  萌狼蓝天  阅读(19)  评论(0)    收藏  举报