一、背景
我们使用云效来部署程序,省去了许多基础搭建工作,但是也带来了一些问题,比如程序的版本号、打包时间、启动时间等元数据的展示,需要我们自己去实现。
像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流水线示意图
image.png四、优化后的流水线
image.png image.pngjava编译
image.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
镜像制作
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发布
image.png image.png关于manifests目录下的yaml,后面的文章有空再补充。
五、新的DevOps流程示意图
image.png六、K8S部署界面
image.png七、环境变量
开发人员配置
image.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>
网友评论