jpom项目运维

使用目标

将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.top/pages/d0522...

查看效果

开始构建

服务查看

到此结束!!!

jpom产物遗留问题:Dockerfile接docker-compose.yml文件希望从源码拷贝到目标机器,但产物输出这块实现不了,有解决的xdm,麻烦给评下,多谢

相关推荐
Adellle11 分钟前
Java进阶
java·后端·面试
音视频牛哥13 分钟前
Nginx RTMP DASH 模块分析 (ngx_rtmp_dash_module.c)
运维·nginx·大牛直播sdk·dash·nginx rtmp服务器·nginx dash·dash播放
G探险者14 分钟前
项目日志是否应该启用文件压缩?
运维·后端
Asthenia041218 分钟前
Spring Boot 的自动装配原理:@EnableAutoConfiguration/AutoConfigurationImportSelector/条件
后端
Asthenia041220 分钟前
理解 MySQL 的分组机制:GROUP BY、SELECT、HAVING 及索引优化
后端
Edward-tan30 分钟前
Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)
运维·服务器·django
Asthenia04121 小时前
SQL执行顺序与ON vs WHERE:MySQL底层解析与面试记忆法
后端
试水年华1 小时前
鸿蒙Next-集成HmRouter的路由模式
linux·运维·服务器·华为·harmonyos·ark-ts语言
Asthenia04121 小时前
操作系统入门:位示图、主存分配、页面置换与磁盘管理
后端
IT缺脑干1 小时前
CentOS 7 挂载与卸载文件系统
linux·运维·centos