共计 2136 个字符,预计需要花费 6 分钟才能阅读完成。
一、项目结构
该教程基于文章 Docker 搭建 jenkins 并配置 jdk、maven和node环境,这里默认已经配置好了环境,且微服务项目结构如下:
web-platform
- system
- gateway-service
- admin-service
- monitor
- log-service
二、项目配置
1. General
这里填项目的相关描述、丢弃旧的构建、参数化构建。
丢弃旧的构建让 jenkins 历史构建不会占用很大空间。
参数化构建使这个配置作为通用的配置,可以打包该微服务下所有模块,这里正确填写很重要。
将目标服务器也作为参数,这样可以单独更新一台服务器的程序,同时指定了项目所用 jdk 版本。
2. 源码管理
这里需要配置 gitlab 的源码地址和指定分支(一般为main或者master),并且 Credentials 指定拉项目代码的账号密码,自行添加即可。
3. 构建触发器
这里根据需要配置触发器,根据某些事件触发打包,比如 git push
动作。
4. 构建环境
这里配置构建环境,没有必要配置,根据自己需要。
5. 构建前步骤
maven -pl -am
的意思是在构建指定项目之前,先构建其所有依赖项,并且只构建指定的项目而不是整个多模块项目。选项"-am" 和"-pl" 可以单独使用,也可以组合使用。
6. 项目构建
指定打包所需的 pom 文件,并指定打包命令。
7. 构建后操作
打包镜像
打包后需要将 jar 包做成 docker 镜像。
Dockerfile 内容:
FROM acaiee/alpine-java:cst
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /app/${JAR_FILE}
# 设置环境变量
ENV TZ="Asia/Shanghai" \
JAR_NAME=/app/${JAR_FILE} \
JAVA_OPTS="\
-Xms128m \
-Xmx512m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m"
ENTRYPOINT java ${JAVA_OPTS} -jar ${JAR_NAME}
以下是脚本内容:
## 构建镜像
cd ${module}
serviceName=${module#*/}
## 根据容器内的时间具体决定使用哪个时间
current=$(date +"%Y%m%d-%H%M")
imageName=${serviceName}:${current}
tarName=${serviceName}-${current}.tar
jarFile=$(ls target/ | grep \.jar$)
mv target/${jarFile} .
docker build --build-arg JAR_FILE=${jarFile} -t ${imageName} .
## 保存镜像-保存在 jenkins 主目录下的 images 文件夹
imagesDir=${JENKINS_HOME}/images/$JOB_NAME/${serviceName}
mkdir -p ${imagesDir}
docker save -o ${imagesDir}/${tarName} ${imageName}
cp ${imagesDir}/${tarName} target/${tarName}
## 清理镜像
docker rmi -f $(docker images | grep ${serviceName} |awk 'NR>0 {print $3}')
## tar包保留指定数量
cd ${imagesDir}
retainNumber=3
rm -f $(ls -t | awk "NR>${retainNumber}")
运行镜像
选择目标服务器,并将镜像发送到目标服务器,导入后运行镜像。
以下是脚本内容,docker run
的参数根据需要调整。
#!/bin/bash
cd /tmp/robot-patrol-platform
tarName=$(ls -1t | head -n 1)
imageName=$(docker load -i ${tarName} | cut -d' ' -f3)
containerName=$(echo ${imageName} | cut -d: -f1)
# 删除原来的容器,并新建一个容器
if docker ps | grep "${containerName}" >/dev/null 2>&1; then docker rm -f ${containerName} ; fi
docker run -d --net host --restart=unless-stopped --name ${containerName} ${imageName}
# 删除无用的镜像,只保留最新的镜像
serviceName=${containerName}
if docker images | grep "${serviceName}" >/dev/null 2>&1; then docker rmi -f $(docker images | grep ${serviceName} |awk 'NR>1 {print $3}'); fi
# 删除临时文件
rm -rf /tmp/robot-patrol-platform/${tarName}
可以给目标服务器配置标签,只有标签匹配前面参数化构建传递的参数才会发送到目标服务器。
以上就是微服务打包的完成流程。
提醒:本文发布于640天前,文中所关联的信息可能已发生改变,请知悉!