[CI]Docker构建时传递CI的唯一生成号作为版本号(SpringBoot、Vue)

平台操作以AzureDevOps为例

CI配置

复制代码
arguments: '--build-arg BUILD_NUMBER=$(Build.BuildNumber)'

前端

Dockerfile配置

复制代码
# 动态更新 .env 文件
ARG BUILD_NUMBER
# 使用 sed 命令更新 .env 文件中的 VUE_APP_BUILD_NUMBER 变量
RUN sed -i "s/^VUE_APP_BUILD_NUMBER=.*/VUE_APP_BUILD_NUMBER=${BUILD_NUMBER}/" /app/.env

.env配置

复制代码
VUE_APP_BUILD_NUMBER=unknown

代码

html 复制代码
      <span style="margin-left: 8px;">
        服务版本:{{backend_version}}
        前端版本:{{front_version}}
      </span>
javascript 复制代码
  data() {
      return {
        backend_version: "-",
        front_version:process.env.VUE_APP_BUILD_NUMBER
      }
  },
  mounted() {
    this.getDockerBuildId();
  },
  methods: {
    getDockerBuildId() {
      fetch('/api/sys/common/build')
          .then(response => response.json())
          .then(data => {
            this.backend_version = data.message;
          })
          .catch(error => {
            console.error('Error:', error);
          });
    }

后端

Dockerfile配置

复制代码
# 定义构建参数
ARG BUILD_NUMBER
ENV BUILD_NUMBER=${BUILD_NUMBER}

# 使用传递的 BUILD_NUMBER 参数进行 Maven 构建
RUN mvn install -Dbuild.number=${BUILD_NUMBER}

pom.xml配置

复制代码
    <properties>
        <build.number>0</build.number>
    </properties>

		  <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <!-- 使用 build.number 参数作为版本号 -->
                            <Build-Version>${build.number}</Build-Version>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

读取

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
public class BuildInfoController {

    @Autowired
    private ResourceLoader resourceLoader;

    @GetMapping("/build-id")
    public ResponseResult getBuildId() {
        String buildId = "unknown";
        try {
            // 加载 MANIFEST.MF 文件
            Resource resource = resourceLoader.getResource("classpath:META-INF/MANIFEST.MF");
            Manifest manifest = new Manifest(resource.getInputStream());
            Attributes attributes = manifest.getMainAttributes();

            // 获取 Build-Version 属性
            buildId = attributes.getValue("Build-Version");
            if (buildId == null) {
                buildId = "unknown";
            }
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
        }

        return ResponseResult.info(Objects.equals(buildId, "unknown") ? 0 : 1, buildId, buildId);
    }
}

效果

相关推荐
螺蛳粉 螺蛳粉4 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
wefg15 小时前
【Docker】镜像相关指令
运维·docker·容器
java_logo6 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
死磕音视频6 小时前
Open WebUI 入门:用 Docker 装上本地对话界面并连接 Ollama
docker·ollama·本地大模型·open webui
分布式存储与RustFS6 小时前
CI 老被 Docker Hub 的 429 卡住,自建 Registry 把镜像搬进内网
运维·docker·开源·镜像仓库·对象存储·ci·rustfs
paopaokaka_luck6 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
n112127 小时前
Docker 容器时区错 8 小时:3 个坑
运维·docker·容器·故障排查·服务器运维·容器时区
慈云数据8 小时前
用 DSH 辅助部署一个网站监控平台:Uptime Kuma + Docker 实战
运维·docker·容器
软件技术NINI8 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
螺蛳粉 螺蛳粉8 小时前
第 03 篇:为什么 K8s 的最小调度单元是 Pod 而不是容器:pause 容器与边车模式(底座认知 03)
docker·云原生·容器·kubernetes·etcd·运维排障·kube-apiserver