当前位置: 首页 > article >正文

JPom使用Docker方式构建SpringBoot项目详解

简介

Jpom是一款现代化的开源构建管理系统,专为Java开发的项目设计,提供了在线构建、自动部署、日常运维和项目监控等全面功能。

准备工作

2.1 JPom 安装

先安装JPom,此处选择Docker或docker-compose安装。详见官网Jpom docker-compose安装

2.2 仓库创建

登录JPom管理后台,在“在线构建 -- 仓库信息”中,新增一个仓库地址。

2.3 SSH 添加

登录JPom管理后台,在“资产管理 -- SSH管理”,新增一个SSH节点。

如果和JPom Server在同一台服务器上,Host需要写外网IP,不能用127.0.0.1

2.4 Docker 添加

登录JPom管理后台,在“资产管理 -- Docker管理”,新增Docker

注:在新增Docker之前,需先在Docker中进行配置,详见官网Jpom Docker资产 新增&删除。如果只是测试,只需在docker.service文件中添加修改,如下:

docker.service可以通过systemctl status docker查看

在线构建

3.1 构建方式

通过Docker或docker-compose安装的Jpom,在构建时,构建方式只能选择“容器构建”

3.2 基础信息

选择源仓库、分支。JPom Server通过对应的仓库,将仓库中的代码拉取到服务器。

代码拉取后存放在xxx/docker/volumes目录下,可以通过构建的BUILD_ID值,使用

find / -name "${BUILD_ID}" 命令查询具体的目录。其中${BUILD_ID}要使用如下截图的字符串。

构建创建成功后,会生成一个唯一的构建Id,可通过编辑构建中查看。

3.3 构建流程

构建流程的任务是通过3.1选择的构建方式(以Docker为例),结合3.2中拉取的代码,自动打包,生成可执行的 Jar 包。

3.3.1 DSL配置

1)DSL的说明

a)配置需要声明使用具体的 docker 来执行构建相关操作(建议使用服务端所在服务器中的 docker)

b)容器构建会在 docker 中生成相关挂载目录,一般情况不需要人为操作

c)执行构建时会生成一个容器来执行,构建结束后会自动删除对应的容器

简单理解:DSL配置用于配置一个Docker容器,通过该Docker容器,自动将仓库的代码打包生成可执行文件,并通过挂载卷目录方式,将执行信息及可执行文件存放在Docker的宿主机中。而后自动删除Docker容器。

2)配置说明
# 基础镜像 目前支持 ubuntu-latest、ubuntu-git
# 您还可以自定义基础镜像来实现复杂业务
# 本示例仅供参考实际需要您按照仓库情况和构建流程自行配置
runsOn: ubuntu-latest
# 使用哪个 docker 构建,填写 docker 标签 默认查询可用的第一个,如果 tag 查询出多个也选择第一个结果
fromTag: test
# 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  # 自动在xxx/docker/volumes/中创建下载对应版本的jdk
    version: 8
  - uses: maven  # 自动在xxx/docker/volumes/中创建下载对应版本的maven
    version: 3.9.4  
#  - uses: go
#    version: 1.17.6
#  - uses: python3
#    version: 3.6.6
# 将容器中的 maven 仓库文件缓存到 docker 卷中,前提条件:需将宿主机的/root/.m2和容器的/root/.m2做映射
  - uses: cache
    path: /root/.m2
# 将此目录缓存到全局(多个构建可以共享此缓存目录)
    type: global
#  - run: echo "当前目录:" && pwd && echo "进入docker容器,睡眠1000s" && sleep 1000 && "睡眠结束"
  - run: cd ${JPOM_WORKING_DIR} && mvn clean package -Dmaven.test.skip=true -s /root/.m2/settings.xml
#  - run: echo "当前目录:" && pwd && echo "进入docker容器,睡眠100s" && sleep 1000 && "睡眠结束"
# 宿主机目录和容器目录挂载 /host:/container:ro
binds:
# 指定 settings.xml 文件
#  - /var/lib/docker/volumes/jpom_maven_3.9.4/_data/conf/settings.xml:/root/.m2/settings.xml
  - /root/.m2/:/root/.m2/
#  - /var/lib/docker/volumes/jpom_maven_3.9.4/_data/config/:/home/maven_config/
  # 宿主机文件上传到容器 /host:/container:true
#copy:
#  - /var/lib/docker/volumes/jpom_maven_3.9.4/_data/conf/settings.xml:/home/: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

以上大部分代码都是官网提供的示例代码,以下重点介绍几点:

a)uses: java

配置Java环境,默认会自动下载对应版本的JDK版本到容器,并通过卷(xxx/docker/volumes/)同步到宿主机。如果没有下载成功,也可以在宿主机中找到对应卷,手动下载。

文件格式如下:

maven等其他环境也一样的处理方式。

b)Maven仓库缓存

maven仓库缓存的目的在于无需每次构建都重新下载依赖包,提升构建的下次构建的速度。

在Docker容器构建环境中,通过Maven下载的依赖包,默认存放在/root/.m2/repository/目录中。

注:此处除了配置path为/root/.m2以外,还需要在binds中,配置宿主机和Docker容器该目录的映射

c)打包命令

cd ${JPOM_WORKING_DIR} && mvn clean package -Dmaven.test.skip=true -s /root/.m2/settings.xml

容器启动时,会自动将从仓库中拉取的源代码映射到容器的${JPOM_WORKING_DIR}目录中。

-s /root/.m2/settings.xml:用于指定maven的配置文件,此处必须指定,且该文件必须在容器中存在。 settings.xml文件可以和源码一起提交到仓库中,也可以通过卷映射,从宿主机中获取。

通过DSL配置的use: maven,自动下载maven,但该maven是从官网下载,对应的仓库都为外网,下载很慢,而且项目中可能有自动创建的仓库,所以此处需重新指定settings.xml文件。可在该settigns.xml中配置国内仓库、jdk版本等信息。

d)卷的映射

通过binds,指定宿主机/root/.m2/和容器/root/.m2/的映射。

注:如果c)中的打包命令指定的settings.xml文件为/root/.m2/settings.xml,则需要将该文件先放在宿主机的/root/.m2目录中。

3.3.2 产物目录

指定打包后的可执行文件的目录。如SpringBoot项目的target/xxx.jar

3.4 发布操作

发布操作用于接送3.3中构建后打包生成的可执行文件,执行服务的启动等操作。

1)选择发布的SSH

指定3.3中构建后打包生成的可执行文件要上传到哪一台服务器。

2)发布目录

a)home:示例中的home目录是在添加SSH管理时指定的文件目录。

b)test:示例中的test目录是3.3中构建后打包生成的可执行文件自动上传到SSH的指定目录,本例为 /home/test/ 目录

c)发布前命令

该命令在SSH对应的服务器的/root目录中开始执行

d)发布后命令

该命令同“发布前命令”的环境一样,也在SSH对应的服务器的/root目录中开始执行。

在此示例中,需要先进入/home/test目录,可执行的jar包在该目录中。然后执行 ./start.sh 脚本文件。

start.sh 脚本文件,可以根据自己项目的实际信息进行填写。

本例使用docker-compose创建docker容器,执行mytest服务。

start.sh脚本文件如下:

#!/bin/sh
echo "脚本执行"
# 使用 $() 进行命令替换,并将输出赋值给 CONTAINER_ID 变量
# 查找mytest镜像当前的容器id
containerId=$(docker ps -a | grep mytest | awk '{print $1}')
echo $containerId
if [ "$containerId" != "" ]; then
  echo "容器id存在"
  docker stop $containerId && docker rm $containerId
  echo "停止并删除容器成功"
else
  echo "容器id不存在"
fi
echo "启动容器"
docker-compose up -d
echo "容器启动结束"

结尾

以上为本篇分析的全部内容。

关于本篇内容你有什么自己的想法或独到见解,欢迎在评论区一起交流探讨下吧。


http://www.kler.cn/a/587669.html

相关文章:

  • Word 小黑第27套
  • C#程序员接口调用工具与方法
  • 有关Spring 简介和第一个Spring案例:基于XML配置的IoC容器
  • 鸿蒙 @ohos.animator (动画)
  • 具身沟通——机器人和人类如何通过物理交互进行沟通
  • Ubuntu22.04 安装 Isaac gym 中出现的问题
  • oracle 中创建 socket客户端 监听数据库变动,返回数据给服务端!!!
  • 系统架构设计师—案例分析—数据库篇—关系型数据库设计
  • Java 并发编程——BIO NIO AIO 概念
  • [设计模式]1_设计模式概览
  • FastGPT原理分析-数据集创建第一步
  • RHCE(RHCSA复习:npm、dnf、源码安装实验)
  • 驾驭 DeepSeek 科技之翼,翱翔现代学习新天际
  • Harmony OS NEXT API 12核心API深度解析与开发实践
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)
  • Python 正则表达式模块 re
  • uniapp scroll组件下拉刷新异步更新数据列表
  • 基于SSM + JSP 的图书商城系统
  • 云原生服务网格:微服务通信的智能基础设施
  • Android安全支付-整体架构-KeyStore2-APP到Framework层的调用