Jenkins构建微服务架构项目使用Supervisord进行启动

supervisorctl 是 Supervisor 的管理命令行工具,用于控制 Supervisor 管理的进程。下面为您详细解释:

Supervisor 组成

  • supervisord: 服务端/守护进程,负责启动和管理子进程
  • supervisorctl: 客户端命令行工具,用于控制supervisord 管理的进程

常用 supervisorctl 命令

# 查看所有进程状态
supervisorctl status

# 启动指定程序
supervisorctl start 程序名称

# 停止指定程序
supervisorctl stop 程序名称

# 重启指定程序
supervisorctl restart 程序名称

# 重新加载配置
supervisorctl reload

# 查看所有进程日志
supervisorctl tail -f 程序名称

在 CentOS 7 中配置 Spring Boot 程序

1. 安装 Supervisor

yum install -y supervisor
systemctl enable supervisord
systemctl start supervisord

2. 创建 Spring Boot 配置文件

在 /etc/supervisord.d/目录下创建配置文件,如 myapp.conf:

[program:geomdata-gateway]
directory=/home/project/geomdata/gateway
command=/usr/bin/java -jar -Xms512m -Xmx1024m geomdata-gateway.jar
autostart=true
autorestart=true
startsecs=10
startretries=3
user=root
stdout_logfile=/var/log/supervisor/geomdata-gateway.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
redirect_stderr=true
environment=JAVA_HOME="/home/jdk-21.0.9",PATH="/home/jdk-21.0.9/bin:%(ENV_PATH)s"

3. 使用 supervisorctl 管理

# 重新加载配置
supervisorctl reread
supervisorctl update

# 启动 Spring Boot 应用
supervisorctl start my-springboot-app

# 查看状态
supervisorctl status
# 输出示例:my-springboot-app  RUNNING   pid 12345, uptime 0:10:00

# 查看日志
supervisorctl tail -f my-springboot-app

4. 配置 Jenkins 用户权限

为了让 Jenkins 用户可以执行 sudo supervisorctl命令,需要配置 sudo 权限:

# 编辑 sudoers 文件
sudo visudo

在文件末尾添加:

# Jenkins 用户可以在不输入密码的情况下执行 supervisorctl
jenkins ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl

注意:如果您的 Jenkins 以其他用户运行,请替换 jenkins为实际用户。

5. 验证安装

# 检查 Supervisor 服务状态
sudo systemctl status supervisord

# 检查 Supervisor 版本
supervisorctl --version

# 查看所有进程状态
sudo supervisorctl status

备用方案:如果没有安装 Supervisor
如果您不想使用 Supervisor,可以修改脚本使用 systemd 或其他方式管理服务:

方案1:使用 systemd(如果未安装 Supervisor)

#!/bin/bash

set -e

# 临时切换到 JDK 21
export JAVA_HOME=/home/jdk-21.0.9
export PATH=$JAVA_HOME/bin:$PATH

echo "=== 使用 Java 版本 ==="
java -version
echo "==================="

# 停止服务函数 - 使用 systemctl
function stop_service {
  local APP_NAME="$1"
  local SERVICE_NAME="$2"
  if sudo systemctl is-active --quiet "${SERVICE_NAME}"; then
    echo "Stopping ${APP_NAME}..."
    sudo systemctl stop "${SERVICE_NAME}"
  fi
}

# 启动服务函数 - 使用 systemctl
function start_service {
  local APP_NAME="$1"
  local SERVICE_NAME="$2"
  echo "Starting ${APP_NAME}..."
  sudo systemctl start "${SERVICE_NAME}"
  sudo systemctl status "${SERVICE_NAME}" --no-pager
}

# 备份和复制函数保持不变
# ...

# 部署函数修改
function deploy_service {
  local APP_NAME="$1"
  local APP_PATH="$2"
  local SERVICE_NAME="geomdata-${APP_NAME#geomdata-}.service"  # 生成服务名

  backup_file "${APP_NAME}" "${APP_PATH}"
  copy_new_jar "${APP_NAME}" "${APP_PATH}"
  start_service "${APP_NAME}" "${SERVICE_NAME}"
}

# 停止所有服务
sudo systemctl stop geomdata-auth.service geomdata-gateway.service geomdata-system.service geomdata-metadata.service

# 部署服务...

方案2:使用启动脚本直接管理(最简单)

如果不使用任何进程管理器,可以直接用后台进程方式:

#!/bin/bash

set -e

export JAVA_HOME=/home/jdk-21.0.9
export PATH=$JAVA_HOME/bin:$PATH

echo "=== 使用 Java 版本 ==="
java -version
echo "==================="

# 停止服务 - 通过 kill 进程
function stop_service {
  local APP_NAME="$1"
  local APP_PATH="$2"
  echo "停止 ${APP_NAME}..."
  # 查找并杀死相关进程
  PID=$(ps aux | grep "${APP_NAME}.jar" | grep -v grep | awk '{print $2}')
  if [ -n "$PID" ]; then
    kill -9 $PID
    echo "已停止进程: $PID"
  fi
}

# 启动服务 - 直接运行
function start_service {
  local APP_NAME="$1"
  local APP_PATH="$2"
  echo "启动 ${APP_NAME}..."
  cd "${APP_PATH}"
  nohup java -jar "${APP_NAME}.jar" > "${APP_NAME}.log" 2>&1 &
  echo "启动完成,PID: $!"
}

6. Jenkins项目关键配置

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值