在开发团队的日常工作中,常常面临这样的困境:缺少专职的运维人员,开发人员不得不身兼多职,既要编写代码,又要负责从构建、部署到监控的繁琐运维工作。不同项目需要不同的构建命令和部署脚本,开发、测试、生产多环境的管理更是增加了复杂性。团队往往需要借助多个独立工具——SSH工具远程连接、FTP传输文件、手动同步多台服务器的账号密码——这些重复且分散的操作,不仅效率低下,也容易出错。虽然市面上存在一些自动化部署工具,但往往对服务器资源要求高、搭建复杂,且难以根据团队实际需求进行个性化定制或二次开发。JPom,一种轻量、易用、可自主掌控的解决方案,能够让开发人员从这些重复劳动中解放出来。

安装部署

截至目前,官网的版本为2.11.12,接下来将按照该版本进行部署。

环境要求:

  • JDK 8+ 

  • 内存:512MB以上

  • MYSQL (建议)

安装步骤

官网已提供相关的安装步骤,以下是我个人在安装过程中的更详细说明。

下载安装包

 https://jpom.top/pages/all-downloads/

解压文件

得到2个安装包 server-2.11.12-release.zipagent-2.11.12-release.zip

安装服务端(192.168.0.95)

上传 server-2.11.12-release.zip 到安装目录 /opt/soft/jpom 并解压 ,得到文件目录如下

├── bin
├    ├── BlockListener.sh
├    ├── Server.bat
├    ├── Server.sh
├    ├── Service.sh
├── conf
├    ├── application.yml
├    ├── logback.xml
├── lib
├    ├── server-2.11.12.jar
├── LICENSE

在├── conf 目录下,新增一个文件application-mysql.yml 用来做数据持久化。这一步可选,根据自己的要求选择适当的数据存储,默认是H2。

jpom:
  db:
    # 数据库默认 支持 :H2、MYSQL、MARIADB、POSTGRESQL
    mode: MYSQL
    url: jdbc:mysql://127.0.0.1:3306/jpom
    # 数据库账号 默认 jpom
    user-name: jpom
    # 数据库密码 默认 jpom 如果自行配置请保证密码强度
    user-pwd: jpom

更改目录权限,执行安装服务脚本。

sudo chmod -R 755 /opt/soft/jpom/bin

/opt/soft/jpom/bin/Service.sh install

这样,服务就已经安装好了,设置自启动

systemctl enable jpom-server

    启动服务

    systemctl start jpom-server

    安装代理端(192.168.0.236)

     上传 agent-2.11.12-release.zip 到安装目录 /opt/soft/jpom 并解压 ,得到文件目录如下

    ├── bin
    ├    ├── Agent.bat
    ├    ├── Agent.sh
    ├    ├── BlockListener.sh
    ├    ├── Service.sh
    ├── conf
    ├    ├── application.yml
    ├    ├── logback.xml
    ├── lib
    ├    ├── agent-2.11.12.jar
    ├── LICENSE
    

    在├── conf 目录下,修改application-mysql.yml,主要是密码设置一个,这样不用每次都生成随机的,不好维护,其他配置可以不改变。

    jpom:
      # jpom 数据存储路径, 如果调试模式运行默认路径为【${user.home}/jpom/】,安装运行默认为jar包文件的父级
      path:
      authorize:
        # agent 端管理账号,必填。
        agent-name: jpomAgent
        # agent 端管理密码,非必填,如果为空Jpom 会自动生成一串随机字符串当密码
        agent-pwd: 123456

    更改目录权限,执行安装服务脚本。

    sudo chmod -R 755 /opt/soft/jpom/bin
    
    /opt/soft/jpom/bin/Service.sh install

    这样,服务就已经安装好了,设置自启动

    systemctl enable jpom-agent

      启动服务

      systemctl start jpom-agent

      常用功能与实战示例

      默认系统Web管理后台端口是2122。浏览器输入 http://192.168.0.95:2122/ (换成你的IP)

      服务器维护

      SSH管理

      Docker管理

      如果docker配置报错,需要修改的地方,进入/etc/systemd/system/multi-user.target.wants目录,修改docker.service 文件

      然后修改/etc/docker/daemon.json文件,修改如下

      仓库信息

      脚本列表

      这里的脚本需要分发到每个节点。这样分发到脚本的服务器就可以运行这个脚本文件。

      脚本的内容就是用来启动某个微服务的jar包,仅供参考,具体根据实际项目。

      #!/bin/bash
      export JAVA_HOME=/usr/local/soft/jdk1.8.0_351
      export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
      export PATH=$JAVA_HOME/bin:$PATH:
      
      log_file="${PROJECT_PATH}/../${PROJECT_ID}.log"
      
      #是否开启skywalking
      SKYWALKING_PARAM=""
      if [[ "${SKYWALKING}" = "y" ]]; then 
      	echo "开启skywalking探针"
      	SKYWALKING_PARAM="-javaagent:/opt/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=${PROJECT_ID} -Dskywalking.agent.instance_name=${DEFAULT_ENV} -Dskywalking.collector.backend_service=elk.homgar.com:11800"
      fi
      
      #是否自定义端口号
      PORT_PARAM=""
      if [[ "${PORT}" != "" ]]; then 
      	PORT_PARAM="--server.port=${PORT}"
      fi
      
      # See how we were called.
      function start() {
      	  PIDS=`ps -ef | grep java | grep "$PROJECT_PATH" |awk '{print $2}'`
          if [ -n "$PIDS" ]; then
              echo "> 进程运行中PID: $PIDS"
          fi
      
          if [ ! -f $Log ]; then
              touch $Log
          fi
          
          #获取JAR包的名称以及版本号,按文件名从小到大排序| head -n 3 
          LOCAL_JARS=(`ls -l ${PROJECT_PATH} | awk '{print $9}'| sort -k1.1r | grep -E "*-[0-9]+.[0-9]+.[0-9]+.jar"`)
          if [[ ${#LOCAL_JARS[@]} == 0 ]]
          then 
          	echo "ERROR:没有找到JAR包"
          	exit 0
          else 
          	echo "共查找到以下JAR包 >>>>> ${LOCAL_JARS[@]}"
          fi
          #取最新的JAR包
      	TARGET_JAR=${LOCAL_JARS[0]}
          
          RUN_TEXT="java ${SKYWALKING_PARAM} -Duser.timezone=Asia/Shanghai -jar  ${JVM_PARAM} ${PROJECT_PATH}/${TARGET_JAR} --spring.profiles.active=${DEFAULT_ENV} ${PORT_PARAM}"
          #echo "${RUN_TEXT}"
          nohup ${RUN_TEXT} > $log_file 2>&1 &
          sleep 1
          local line_count=1
          local found=false
      
          while ! $found; do
              local content=$(sed -n "${line_count},\$p" "$log_file")
              # 检查是否读到内容
              if [ -z "$content" ]; then
                  empty_count=$((empty_count + 1))  # 空内容计数器+1
                  if [ $empty_count -ge 5 ]; then
                      echo "连续5次读取到空内容,文件已读完"
                      break
                  fi
              else
                  empty_count=0  # 重置计数器(读到有效内容)
      
                  # 统计实际读取的行数并更新行号
                  local lines_read=$(echo "$content" | wc -l)
                  line_count=$((line_count + lines_read))
      
                  # 检查是否包含“启动成功”
                  if echo "$content" | grep -q "启动成功"; then
                      found=true
                  fi
      
                  # 输出当前读取的内容(可选)
                  echo "$content"
              fi
          	sleep 3  # 每次读取间隔3秒
          done
      }
      
      function restart() {
      	stop
          start
      }
      
      
      function stop() {
      	PIDS=`ps -ef | grep java | grep "$PROJECT_PATH" |awk '{print $2}'`
          if [ -n "$PIDS" ]; then
              echo "> 停止进程PID: $PIDS"
      		kill -9 $PIDS
          else 
              echo "服务未启动" 
          fi
      }
      
      function status()
      {
      		PIDS=`ps -ef | grep java | grep "$PROJECT_PATH" | awk '{print $2}'`
          if [ -n "$PIDS" ]; then
          # 检查进程是否有监听端口
          PORT_INFO=$(ss -tunlp | grep "pid=$PIDS" | awk '{print $5}' | awk -F: '{print $NF}')
          
          if [ -n "$PORT_INFO" ]; then
            echo "running:$PIDS"
          else
            echo "not running:$PIDS (no listening port detected) boot is stopped"
          fi
        else 
          echo "boot is stopped"
        fi
      }
      
      # See how we were called.
      
      case "$1" in
          start)
              start
              ;;
          restart)
              restart
              ;;
          stop)
              stop
              ;;
          status)
              status
              ;;
          *)
            usage
            ;;
      esac
      
      exit 0
      

      项目管理

      上面配置需要提前为机器配置授权目录(如项目路径),后面的DSL配置如下

      description: h------------n
      run:
        start:
          scriptId: 5aa----------------------f3b5ce
          scriptArgs: start
          scriptEnv:
            "DEFAULT_ENV": dev
            "JVM_PARAM": '-Xms256M -Xmx512M'
            "SKYWALKING": 'y'
        restart:
          scriptId: 5aa----------------------f3b5ce
          scriptArgs: restart
          scriptEnv:
            "DEFAULT_ENV": dev
            "JVM_PARAM": '-Xms256M -Xmx512M'
            "SKYWALKING": 'y'
        status:
          scriptId: 5aa----------------------f3b5ce
          scriptArgs: status
        stop:
          scriptId: 5aa----------------------f3b5ce
          scriptArgs: stop
      file:
      # 备份文件保留个数
      #  backupCount: 5
      # 限制备份指定文件后缀(支持正则)
      #  backupSuffix: [ '.jar','.html','^.+\.(?i)(txt)$' ]
      # 项目文件备份路径
      #  backupPath: /data/jpom_backup
      # 是否开启差异备份(仅备份变动过的文件)
      #  diffBackup: true
      config:
      # 是否开启日志备份功能
      #  autoBackToFile: true
      
      

      构建列表

      服务监控

      假如配置5秒钟监控一次服务的健康情况,出问题发到企业微信群。

      如果你给用户配置了邮箱,它也同时给用户发送邮件。前提是你要配置服务器的邮件地址(在配置管理--邮箱配置里面设置)

      常见问题解决

      Q1:JPom服务无法启动

      # 检查端口占用
      netstat -tlnp | grep 2122
      
      # 查看日志
      tail -f /opt/jpom/logs/application.log
      
      # 常见原因:JDK版本不兼容、端口被占用、权限不足

      Q2:SSH连接服务器失败

      # 检查项:
      1. 服务器SSH服务是否运行:systemctl status sshd
      2. 防火墙是否开放22端口
      3. JPom服务器能否ping通目标服务器
      4. SSH密钥是否正确配置

      Q3:构建过程内存不足

      # 修改JPom启动参数
      vim /opt/soft/jpom/bin/start.sh
      # 增加JVM参数
      JAVA_OPTS="-Xmx1024m -Xms512m"

      总结

      JPom以其轻量、易用、灵活的特点,为缺少专业运维团队的中小型开发团队提供了完美的解决方案。它降低了运维门槛,提高了部署效率,让开发者能够从繁琐的运维工作中解放出来,更专注于业务代码的编写。

      无论是个人开发者、创业团队还是中小型企业,如果你正在寻找一款简单实用的项目部署管理工具,JPom都值得尝试。它的开源特性还意味着你可以根据团队的具体需求进行定制开发,打造最适合自己的自动化部署平台。

      Logo

      这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

      更多推荐