一、背景
我们使用云效来部署程序,省去了许多基础搭建工作,但是也带来了一些问题,比如程序的版本号、打包时间、启动时间等元数据的展示,需要我们自己去实现。
像jvm内存、一些三方的密钥,是可以在环境变量里配置,但是像版本号是会随着程序的发版而变化的。
而读取程序的版本,是可以从endpoints的/info获取,但那是程序已启动的情况下。显然并不适用于我们的需求,所以我们得在编译打包的时候输出,办法是有很多,我们这里采用的maven插件 git-commit-id-plugin,默认会在target/classes目录下生成git.properties文件。
在spring boot框架下,你还可以使用'@project.version@'生成程序的版本号,类似git-commit-id-plugin插件,还得把版本写入到某个文件里。
二、目标
- 1、在k8s容器,能看到程序的版本号
- 2、在nacos服务注册中心,能看到程序的版本号(在后面的文章中讲述)
- 3、构建Docker镜像按appName:${version},部署时候拉取的镜像也是根据版本号。
三、DevOps流水线示意图
![](https://img-blog.csdnimg.cn/img_convert/079d53d99b6de4ec21f32ac9a0b15808.webp?x-oss-process=image/format,png)
image.png
四、优化后的流水线
![](https://img-blog.csdnimg.cn/img_convert/2627dd3ec9acb222d134933073709747.webp?x-oss-process=image/format,png)
image.png
![](https://img-blog.csdnimg.cn/img_convert/e1cca51a85dc6f116a2a098ed690a753.webp?x-oss-process=image/format,png)
image.png
java编译
![](https://img-blog.csdnimg.cn/img_convert/d9940e9f0594c0eb1f9a672b16411d35.webp?x-oss-process=image/format,png)
image.png
读取程序版本号
![](https://img-blog.csdnimg.cn/img_convert/198a35a5d033dd139861030c04044e32.webp?x-oss-process=image/format,png)
image.png
# input your command here
version="`grep 'git.build.version' target/classes/git.properties | cut -d'=' -f2 | sed 's/\r//'`"
echo "USER_version=$version" > .env
也可浓缩为一句shell命令
echo USER_version=`grep 'git.build.version' target/classes/git.properties | cut -d'=' -f2 | sed 's/\r//'` > .env
镜像制作
![](https://img-blog.csdnimg.cn/img_convert/c78c0200644a007145ee7edd17f2aba4.webp?x-oss-process=image/format,png)
image.png
这里会传入两个环境变量,跟Dockerfile有关:
FROM openjdk:8u201-jdk-alpine3.9
ARG APPNAME
COPY target/${APPNAME}*.jar /opt/xxx_service/${APPNAME}/packages/${APPNAME}.jar
ARG PORT
EXPOSE ${PORT}/tcp
RUN mkdir -p /opt/xxx_service/${APPNAME}/dump
补充一点,启动jar的命令和参数,配置在deployment.yaml中。
k8s发布
![](https://img-blog.csdnimg.cn/img_convert/df5f1fafa339e69e6e69740b24bdc788.webp?x-oss-process=image/format,png)
image.png
![](https://img-blog.csdnimg.cn/img_convert/8faca051666e8267d5c48730ecb82e7d.webp?x-oss-process=image/format,png)
image.png
关于manifests目录下的yaml,后面的文章有空再补充。
五、新的DevOps流程示意图
![](https://img-blog.csdnimg.cn/img_convert/2e1662e490c7927a8816b6c1313fd904.webp?x-oss-process=image/format,png)
image.png
六、K8S部署界面
![](https://img-blog.csdnimg.cn/img_convert/a5cd231c0a935313e95ef9206b39aac3.webp?x-oss-process=image/format,png)
image.png
七、环境变量
开发人员配置
![](https://img-blog.csdnimg.cn/img_convert/69e14c051dac6d0407bc15c32bdd3a1b.webp?x-oss-process=image/format,png)
image.png
运维管理人员配置
![](https://img-blog.csdnimg.cn/img_convert/17afbc13d1887a4215951e63b0a1eba8.webp?x-oss-process=image/format,png)
image.png
八、打包生成的git.properties文件
#Generated by Git-Commit-Id-Plugin
#Tue Feb 14 15:12:20 CST 2023
git.build.time=2023-02-14T15\:12\:20+0800
git.build.version=5.0.6
git.commit.id.abbrev=e316e29
git.commit.id.full=e316e290ed8f7ec322d9d4c69e49f10dd1b0705f
九、maven插件:git-commit-id-plugin
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>${git-commit-id-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
<generateGitPropertiesFile>true</generateGitPropertiesFile>
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties
</generateGitPropertiesFilename>
<includeOnlyProperties>
<includeOnlyProperty>^git.build.(time|version)$</includeOnlyProperty>
<includeOnlyProperty>^git.commit.id.(abbrev|full)$</includeOnlyProperty>
</includeOnlyProperties>
<commitIdGenerationMode>full</commitIdGenerationMode>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
</configuration>
</plugin>