使用目标
将springboot项目自动构建,以docker方式部署到指定服务节点,和jenkins一样的;
jpom的特点及和jenkins对比资料很多,不在重复说明了。
docker安装jpom服务
bash
docker run --privileged=true -p 2122:2122 --name jpom
-v /root/services/jpom/logs:/usr/local/jpom-server/logs
-v /root/services/jpom/data:/usr/local/jpom-server/data
-v /root/services/jpom/conf:/usr/local/jpom-server/conf
-v /root/services/jpom/script:/home/jpom/script
-d jpomdocker/jpom
资产管理
SSH管理
分组设置为默认
Docker管理
分组设置为默认
添加Docker服务
给docker服务添加标签
在线构建
仓库信息
构建列表
然后保存!!!
DSL内容
yaml
# 基础镜像 目前支持 ubuntu-latest、ubuntu-git
# 您还可以自定义基础镜像来实现复杂业务
# 本示例仅供参考实际需要您按照仓库情况和构建流程自行配置
runsOn: ubuntu-latest
# 使用哪个 docker 构建,填写 docker 标签 默认查询可用的第一个,如果 tag 查询出多个也选择第一个结果
fromTag: local
# version 需要在对应镜像源中存在
# java 镜像源 https://mirrors.tuna.tsinghua.edu.cn/Adoptium/
# maven 镜像源 https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/
# node 镜像源 https://registry.npmmirror.com/-/binary/node/
# 目前支持的 uses 插件端 java、maven、node、go、python3、gradle 。如果不满足需求,可自行配置插件
steps:
- uses: java
version: 17
- uses: maven
version: 3.9.4
# - uses: node
# version: 16.3.0
# - uses: go
# version: 1.17.6
# - uses: python3
# version: 3.6.6
# 将容器中的 maven 仓库文件缓存到 docker 卷中
- uses: cache
path: /root/.m2
# 将此目录缓存到全局(多个构建可以共享此缓存目录)
type: global
# 将容器中的 node_modules 文件缓存到 docker 卷中
# - uses: cache
# path: ${JPOM_WORKING_DIR}/web-vue/node_modules
# 使用 copy 文件的方式缓存,反之使用软链的形式。copy 文件方式缓存 node_modules 可以避免 npm WARN reify Removing non-directory
# mode: copy
# - run: npm config set registry https://registry.npmmirror.com
# 内置变量 ${JPOM_WORKING_DIR} ${JPOM_BUILD_ID}
# - run: cd ${JPOM_WORKING_DIR}/web-vue && npm i && npm run build
# - run: cd ${JPOM_WORKING_DIR} && mvn package -s /home/jpom/script/settings.xml
- run: cd ${JPOM_WORKING_DIR} && mvn package -DskipTests
# 宿主机目录和容器目录挂载 /host:/container:ro
# binds:
# - /Users/user/.m2/settings.xml:/root/.m2/
# 宿主机文件上传到容器 /host:/container:true
# dirChildrenOnly = true will create /var/data/titi and /var/data/tata dirChildrenOnly = false will create /var/data/root/titi and /var/data/root/tata
# copy:
# - /Users/user/.m2/settings.xml:/root/.m2/:false
# 给容器新增环境变量
env:
NODE_OPTIONS: --max-old-space-size=900
#配置说明:https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerCreate
#hostConfig:
# CpuShares: 1
91节点构建脚本整理
服务发布目录
Dockerfile内容
bash
FROM hzkjhub/java17:17.0.4
COPY api-server.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java -jar /app/app.jar"]
docker-compose.yml内容
yaml
version: '3.9'
services:
mock:
image: mock:pro
privileged: true
container_name: mock
environment:
TZ: Asia/Shanghai
ports:
- "9002:9002"
ms脚本内容
脚本位置:/usr/local/bin/ms
bash
#!/bin/bash
# 检查参数数量是否为 2
if [ $# -ne 2 ]; then
echo "用法: <服务名称> deploy"
exit 1
fi
# 解析参数
service_name="$1"
action="$2"
# 基础服务目录
base_service_dir="/home/services"
# 定义制作镜像的函数
build_docker_image() {
local image_name="$1"
local tag="$2"
echo "开始构建 Docker 镜像: $image_name:$tag"
docker build -t "$image_name:$tag" .
if [ $? -ne 0 ]; then
echo "错误: Docker 镜像构建失败。"
exit 1
fi
echo "Docker 镜像 $image_name:$tag 构建成功"
}
# 定义删除旧镜像的函数
delete_old_image() {
local image_name="$1"
local tag="$2"
local old_image_id=$(docker images -q "$image_name:$tag")
if [ -n "$old_image_id" ]; then
echo "开始删除旧的镜像: $image_name:$tag (ID: $old_image_id)"
docker rmi "$old_image_id"
if [ $? -ne 0 ]; then
echo "错误: 删除旧镜像 $image_name:$tag 失败。"
exit 1
fi
echo "旧的镜像 $image_name:$tag (ID: $old_image_id) 删除成功"
else
echo "未找到旧的镜像: $image_name:$tag,跳过删除操作"
fi
}
# 定义 deploy 操作的函数
deploy_service() {
local service_name="$1"
# 服务所在完整目录
local service_dir="$base_service_dir/$service_name"
echo "开始检查服务目录: $service_dir"
if [ ! -d "$service_dir" ]; then
echo "错误: 服务目录 $service_dir 不存在。"
exit 1
fi
echo "服务目录 $service_dir 检查通过"
# 检查 Dockerfile 是否存在
local dockerfile_path="$service_dir/Dockerfile"
echo "开始检查 Dockerfile 文件: $dockerfile_path"
if [ ! -f "$dockerfile_path" ]; then
echo "错误: Dockerfile 文件 $dockerfile_path 不存在。"
exit 1
fi
echo "Dockerfile 文件 $dockerfile_path 检查通过"
# 检查 docker-compose.yml 文件是否存在
local docker_compose_path="$service_dir/docker-compose.yml"
echo "开始检查 docker-compose.yml 文件: $docker_compose_path"
if [ ! -f "$docker_compose_path" ]; then
echo "错误: docker-compose.yml 文件 $docker_compose_path 不存在。"
exit 1
fi
echo "docker-compose.yml 文件 $docker_compose_path 检查通过"
# 进入服务目录
echo "尝试进入服务目录: $service_dir"
cd "$service_dir" || {
echo "错误: 无法进入服务目录 $service_dir。"
exit 1
}
echo "成功进入服务目录: $service_dir"
# 停止当前正在运行的容器
echo "开始停止当前正在运行的容器"
docker-compose -f "$docker_compose_path" down
if [ $? -ne 0 ]; then
echo "错误: 停止容器失败。"
exit 1
fi
echo "容器停止成功"
# 删除旧的镜像
local image_name="$service_name"
local tag="pro"
delete_old_image "$image_name" "$tag"
# 构建 Docker 镜像,使用 :pro 标签
build_docker_image "$image_name" "$tag"
# 启动容器
echo "开始启动容器"
docker-compose -f "$docker_compose_path" up -d
if [ $? -ne 0 ]; then
echo "错误: 启动容器失败。"
exit 1
fi
echo "容器启动成功"
echo "服务发布成功。"
}
# 处理不同的操作
case "$action" in
"deploy")
deploy_service "$service_name"
;;
*)
echo "错误: 未知操作。目前支持的操作是 'deploy'。"
exit 1
;;
esac
jpom产物说明
查看效果
开始构建
服务查看
到此结束!!!
jpom产物遗留问题:Dockerfile接docker-compose.yml文件希望从源码拷贝到目标机器,但产物输出这块实现不了,有解决的xdm,麻烦给评下,多谢