Files
wjhandClaude Sonnet 5 33269da935 ci: 网关流水线改为拉代码+构建+部署,数据库连接默认值写入配置
- 新增 Jenkinsfile 阶段:拉取 main → mvn package → 本机重启,不再依赖服务器上手工打好的旧 jar
- 敏感密钥(GATEWAY_*_SECRET)放服务器 /data/iot/gateway/gateway.env,启动前 source,不进仓库
- application*.yml 写入 PostgreSQL 账号默认值(内网测试环境),后端地址默认指向同机 127.0.0.1:8080
- 部署后健康检查失败时让流水线报错,而不是静默通过

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-10 13:39:23 +08:00

78 lines
2.8 KiB
Groovy

// IOT 开放网关流水线:拉代码 → 构建 → 部署重启。
// 由 Jenkins 的 iot-open-gateway 任务以「Pipeline script from SCM」读取本文件。
//
// 运行方式:网关 jar 与 Jenkins 在同一台服务器(192.168.114.100)上,直接在本机重启,不走 SSH。
// 敏感配置(GATEWAY_JWT_SECRET / GATEWAY_INTERNAL_SECRET / GATEWAY_ADMIN_SECRET 等)放在服务器上的
// /data/iot/gateway/gateway.env(权限 600),启动前 source 进来,不进仓库。
// 数据库账号密码、后端地址已作为默认值写在 application*.yml 里(内网测试环境)。
pipeline {
agent any
tools {
maven 'Maven-3.8'
jdk 'JDK17'
}
environment {
DEPLOY_PORT = '18082'
APP_NAME = 'iot-open-gateway'
DEPLOY_DIR = '/data/iot/gateway'
// 防止 Jenkins 在任务结束时自动杀掉后台 nohup 进程
JENKINS_NODE_COOKIE = 'dontKillMe'
BUILD_ID = 'dontKillMe'
}
stages {
stage('拉代码') {
steps {
git branch: 'main', url: 'https://git.tengwangyun.com/wjh/IoT-OpenApi.git'
}
}
stage('构建') {
steps {
// 网关没有单测,跳过测试加快构建
sh 'mvn -B clean package -DskipTests'
}
}
stage('部署') {
steps {
sh '''
set -e
echo "=== 部署 IOT 开放网关 ==="
mkdir -p "${DEPLOY_DIR}"
JAR=$(ls target/iot-open-gateway-*.jar | head -1)
cp -f "$JAR" "${DEPLOY_DIR}/${APP_NAME}.jar"
if [ ! -f "${DEPLOY_DIR}/gateway.env" ]; then
echo "缺少 ${DEPLOY_DIR}/gateway.env(存放 GATEWAY_*_SECRET 等),中止" >&2
exit 1
fi
PID=$(lsof -ti:${DEPLOY_PORT} || true)
if [ -n "$PID" ]; then
echo "停止旧进程 $PID"
kill -9 $PID || true
sleep 2
fi
export JENKINS_NODE_COOKIE=dontKillMe
export BUILD_ID=dontKillMe
set -a
. "${DEPLOY_DIR}/gateway.env"
set +a
nohup java -jar -Dspring.profiles.active=prod "${DEPLOY_DIR}/${APP_NAME}.jar" > "${DEPLOY_DIR}/${APP_NAME}.log" 2>&1 &
echo "后台启动中,等待 12 秒检测..."
sleep 12
lsof -i:${DEPLOY_PORT} || true
echo "=== 网关健康检查 ==="
curl -sf http://127.0.0.1:${DEPLOY_PORT}/open/gateway/health
echo ""
'''
}
}
}
}