初始化提交

This commit is contained in:
2025-10-07 15:58:15 +08:00
commit 0e593caf99
378 changed files with 77890 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
pipeline {
agent any
environment {
REMOTE_HOST = "43.159.145.241" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/fly_moon_bigdata"
VENV_DIR = "/data/webapps/fly_moon_bigdata/venv"
CONDA_PATH = "/root/miniconda3/bin/conda"
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/fly_moon_bigdata.git'
}
}
stage('进程下线') {
steps {
echo("123")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_executor.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR}/bin/activate &&
pip install -r src/xxljob_monitor/requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh "ssh ${REMOTE_HOST} 'nohup python ${REMOTE_PROJECT_PATH}/src/xxljob_monitor/executor.py > ${REMOTE_PROJECT_PATH}/src/xxljob_monitor/output.log 2>&1 &'"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,222 @@
pipeline {
agent any
environment {
REMOTE_HOST_A = "43.130.56.138" // 远程服务器A
REMOTE_HOST_B = "43.130.59.68" // 远程服务器B
REMOTE_PROJECT_PATH_A = "/data/webapps/prod_lessie_sourcing_agents" // 远程 Python 项目路径
VENV_DIR_A = "/data/webapps/prod_lessie_sourcing_agents/venv" // 远程虚拟环境目录
REMOTE_PROJECT_PATH_B = "/data/webapps/prod_lessie_sourcing_agents"
VENV_DIR_B = "/data/webapps/prod_lessie_sourcing_agents/venv"
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('进程A下线') {
steps {
echo("下线A")
sh "ssh ${REMOTE_HOST_A} 'sh /data/sh/kill_lessie_sourcing_agents_7001.sh'"
}
}
stage('工程A同步') {
steps {
echo("同步A")
sh """
ssh ${REMOTE_HOST_A} 'mkdir -p ${REMOTE_PROJECT_PATH_A}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
"""
}
}
stage('安装A依赖') {
steps {
echo("依赖A")
sh """
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_A}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程A启动') {
steps {
echo("启动A")
sh """
ssh ${REMOTE_HOST_A} '
conda activate search
mv ${REMOTE_PROJECT_PATH_A}/server.py ${REMOTE_PROJECT_PATH_A}/server7001.py
source ${VENV_DIR_A}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=prod python ${REMOTE_PROJECT_PATH_A}/server7001.py --port 7001 > ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
'
"""
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh ${REMOTE_HOST_A} 'sh /data/sh/check_lessie_agents_7001.sh' "
}
}
stage('进程B下线') {
steps {
echo("下线B")
sh "ssh ${REMOTE_HOST_B} 'sh /data/sh/kill_lessie_sourcing_agents_7001.sh'"
}
}
stage('工程B同步') {
steps {
echo("同步B")
sh """
ssh ${REMOTE_HOST_B} 'mkdir -p ${REMOTE_PROJECT_PATH_B}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST_B}:${REMOTE_PROJECT_PATH_B}/
"""
}
}
stage('安装B依赖') {
steps {
echo("依赖B")
sh """
ssh ${REMOTE_HOST_B} '
cd ${REMOTE_PROJECT_PATH_B} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_B}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程B启动') {
steps {
echo("启动B")
sh """
ssh ${REMOTE_HOST_B} '
conda activate search
mv ${REMOTE_PROJECT_PATH_B}/server.py ${REMOTE_PROJECT_PATH_B}/server7001.py
source ${VENV_DIR_B}/bin/activate
TIMESTAMP_02=\$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=prod python ${REMOTE_PROJECT_PATH_B}/server7001.py --port 7001 > ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_\${TIMESTAMP_02}.log 2>&1 &
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# =======================改造=========================
pipeline {
agent any
parameters {
choice(name: 'DEPLOY_TARGET', choices: ['AB', 'A', 'B'], description: '选择要部署的目标实例')
string(name: 'Code_branch', defaultValue: 'main', description: 'Git 分支')
}
tools{
go 'go1.24.0'
}
environment {
REMOTE_HOST_A = "43.153.98.191"
REMOTE_HOST_B = "49.51.41.243"
NGINX_HOST = "49.51.46.148"
REMOTE_PROJECT_PATH_A = "/data/webapps/go_lessie_sourcing_api"
REMOTE_PROJECT_PATH_B = "/data/webapps/go_lessie_sourcing_api"
NGINX_GO_backend_A = "10.0.0.10"
NGINX_GO_backend_B = "10.0.0.8"
PORT_A = "8100"
PORT_B = "8100"
CONNECTION_TIMEOUT = "1200"
CHECK_PORT_SCRIPT = "/data/sh/check_port.sh"
NGINX_RELOAD_SCRIPT = "/data/sh/set_prod_go_backend_weight.sh"
SEND_STOP_GOAPP_SCRIPT = "/data/sh/send_stop_goapp.sh"
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_for_connections.sh"
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh"
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/go/lessie-sourcing-api.git'
}
}
stage('依赖并构建') {
steps {
sh """
cd ${WORKSPACE}/
export GOVCS="git.deeplink.media:git,*:git"
go mod tidy -v -x
make build-linux
chmod +x ./build/lessie-sourcing-api
"""
}
}
stage('部署实例 A') {
when { expression { params.DEPLOY_TARGET == 'A' || params.DEPLOY_TARGET == 'AB' } }
steps {
script {
echo "=== 部署实例 A ==="
}
// 调用 A 的部署逻辑
build job: 'deploy-instance-A', parameters: [string(name: 'PORT', value: "${PORT_A}")]
}
}
stage('部署实例 B') {
when { expression { params.DEPLOY_TARGET == 'B' || params.DEPLOY_TARGET == 'AB' } }
steps {
script {
echo "=== 部署实例 B ==="
}
// 调用 B 的部署逻辑
build job: 'deploy-instance-B', parameters: [string(name: 'PORT', value: "${PORT_B}")]
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# =================改造===============================

View File

@@ -0,0 +1,206 @@
node {
properties([
parameters([
// 分支选择参数
gitParameter(
branchFilter: 'origin/(.*)',
defaultValue: 'master',
description: 'prod环境默认master分支',
name: 'Code_branch',
quickFilterEnabled: true,
selectedValue: 'DEFAULT',
sortMode: 'NONE',
type: 'PT_BRANCH'
),
// 选择部署实例
extendedChoice(
name: 'DEPLOY_TARGETS',
type: 'PT_CHECKBOX',
description: "选择需要部署的实例(可勾选多个)\n" +
" A:prod-lessie-server01(43.130.59.68)\n" +
" B:prod-lessie-server02(43.173.126.43)\n" +
" C:prod-lessie-server03(49.51.189.136)\n" +
" D:prod-lessie-server04(170.106.187.156)\n" +
" E:prod-lessie-server05(43.130.53.202)",
value: 'A,B,C,D,E',
defaultValue: 'A,B,C,D,E',
visibleItemCount: 5,
delimiter: ','
),
// 部署顺序
string(
name: 'DEPLOY_ORDER',
defaultValue: 'ABCDE',
description: '指定部署顺序格式无分隔符如勾选A、B则填AB或BA勾选B、C则填BC或CB'
)
])
])
// 环境配置(集中管理实例参数)
def config = [
A: [
remoteHost: "43.130.59.68",
projectPath: "/data/webapps/prod_lessie_sourcing_agents",
venvDir: "/data/webapps/prod_lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.12",
port: "7001",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_7001.sh",
gunicornWorkers: 4
],
B: [
remoteHost: "43.173.126.43",
projectPath: "/data/webapps/prod_lessie_sourcing_agents",
venvDir: "/data/webapps/prod_lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.7",
port: "7001",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_7001.sh",
gunicornWorkers: 4
],
C: [
remoteHost: "49.51.189.136",
projectPath: "/data/webapps/prod_lessie_sourcing_agents",
venvDir: "/data/webapps/prod_lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.11",
port: "7001",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_7001.sh",
gunicornWorkers: 4
],
D: [
remoteHost: "170.106.187.156",
projectPath: "/data/webapps/prod_lessie_sourcing_agents",
venvDir: "/data/webapps/prod_lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.2",
port: "7001",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_7001.sh",
gunicornWorkers: 8
],
E: [
remoteHost: "43.130.53.202",
projectPath: "/data/webapps/prod_lessie_sourcing_agents",
venvDir: "/data/webapps/prod_lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.13",
port: "7001",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_7001.sh",
gunicornWorkers: 8
]
]
def commonConfig = [
nginxHost: "49.51.46.148",
connectionTimeout: "600",
nginxReloadScript: "/data/sh/set_prod_py_backend_weight.sh",
nginxgotopyScript:"/data/sh/set_go_to_py_backend_weight.sh",
waitConnectionsScript: "/data/sh/wait_prod_for_connections.sh"
]
stage('拉代码') {
checkout scm: [
$class: 'GitSCM',
branches: [[name: params.Code_branch]],
userRemoteConfigs: [[
url: 'http://172.24.16.20/python/lessie-sourcing-agents.git',
credentialsId: 'fly_gitlab_auth'
]]
]
}
stage('验证参数') {
def selectedTargets = params.DEPLOY_TARGETS.split(',').collect { it.trim() }.toList()
def orderChars = params.DEPLOY_ORDER.trim().split('').toList()
if (selectedTargets.isEmpty() || selectedTargets == ['']) {
error("请至少勾选1个需要部署的实例A/B/C")
}
if (orderChars.isEmpty()) {
error("部署顺序不能为空请按勾选实例输入顺序如勾选B、C则填BC或CB")
}
orderChars.each { instance ->
if (!selectedTargets.contains(instance)) {
error("部署顺序【${params.DEPLOY_ORDER}】包含未勾选的实例【${instance}】,已勾选实例:${params.DEPLOY_TARGETS}")
}
}
if (orderChars.unique().size() != orderChars.size()) {
error("部署顺序【${params.DEPLOY_ORDER}】包含重复实例如AAB请输入无重复顺序")
}
if (orderChars.size() != selectedTargets.size()) {
error("部署顺序【${params.DEPLOY_ORDER}】有${orderChars.size()}个实例,已勾选实例有${selectedTargets.size()}个,数量需一致")
}
echo "参数验证通过:已选实例=${selectedTargets},部署顺序:${orderChars}"
env.VALID_ORDER = params.DEPLOY_ORDER
}
stage('动态部署') {
def orderChars = env.VALID_ORDER.split('').toList()
orderChars.each { instance ->
echo "===== 开始部署实例 ${instance} ====="
// 实例部署的5个步骤
stage("${instance}脱离后端组") {
def cfg = config[instance]
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxReloadScript} ${cfg.nginxBackend} ${cfg.port} down'"
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxgotopyScript} ${cfg.nginxBackend} ${cfg.port} down'"
sh "ssh ${cfg.remoteHost} 'sh ${commonConfig.waitConnectionsScript} ${cfg.port} ${commonConfig.connectionTimeout}'"
}
stage("${instance}下线&同步") {
def cfg = config[instance]
sh "ssh ${cfg.remoteHost} 'sh ${cfg.killScript} ${cfg.port}'"
sh """
ssh ${cfg.remoteHost} 'mkdir -p ${cfg.projectPath}'
rsync -avz --exclude 'venv' --exclude '.git' ${WORKSPACE}/ ${cfg.remoteHost}:${cfg.projectPath}/
"""
}
stage("${instance}依赖&启动") {
def cfg = config[instance]
sh """
ssh ${cfg.remoteHost} '
cd ${cfg.projectPath}
source ~/.bashrc
conda activate search
source ${cfg.venvDir}/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${cfg.projectPath}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=prod gunicorn -w ${cfg.gunicornWorkers} -k uvicorn.workers.UvicornWorker \
-b 0.0.0.0:${cfg.port} --timeout 300 dialogue.app:app \
--max-requests 500 --max-requests-jitter 50 \
> "\$LOGFILE" 2>&1 &
ln -sf "\$LOGFILE" ${cfg.projectPath}/logs/lessie_sourcing_agents_latest.log
'
"""
}
stage("探测${instance}服务") {
def cfg = config[instance]
sh "sleep 5"
sh "ssh ${cfg.remoteHost} 'head -n 300 ${cfg.projectPath}/logs/lessie_sourcing_agents_latest.log | grep -i error || echo 未发现错误日志'"
sh "ssh ${cfg.remoteHost} 'sh ${cfg.checkScript}'"
}
stage("恢复${instance}流量") {
def cfg = config[instance]
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxReloadScript} ${cfg.nginxBackend} ${cfg.port} up'"
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxgotopyScript} ${cfg.nginxBackend} ${cfg.port} up'"
}
echo "===== 实例 ${instance} 部署完成 ====="
}
}
echo '✅ 所有选中的实例部署成功!'
}

View File

@@ -0,0 +1,155 @@
node {
properties([
parameters([
// 分支选择参数
gitParameter(
branchFilter: 'origin/(.*)',
defaultValue: 'master',
description: 's1环境默认master分支',
name: 'Code_branch',
quickFilterEnabled: true,
selectedValue: 'DEFAULT',
sortMode: 'NONE',
type: 'PT_BRANCH',
size: 1
),
// 部署实例选择
choice(
name: 'DEPLOY_TARGETS',
choices: ['A', 'B', 'A,B'],
description: '选择需要部署的实例(多选格式为"A,B"'
),
// 部署顺序
string(
name: 'DEPLOY_ORDER',
defaultValue: 'A',
description: '指定部署顺序如AB、BA必须是已选实例的组合'
)
])
])
// 环境配置(集中管理实例参数)
def config = [
A: [
remoteHost: "43.130.56.138",
projectPath: "/data/webapps/lessie_sourcing_agents",
venvDir: "/data/webapps/lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.5",
port: "8000",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_8000.sh",
gunicornWorkers: 8
],
B: [
remoteHost: "43.130.53.202",
projectPath: "/data/webapps/lessie_sourcing_agents",
venvDir: "/data/webapps/lessie_sourcing_agents/venv",
nginxBackend: "10.0.0.13",
port: "8002",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_8002.sh",
gunicornWorkers: 4
]
]
def commonConfig = [
nginxHost: "49.51.46.148",
connectionTimeout: "600",
nginxReloadScript: "/data/sh/set_s1_backend_weight_new.sh",
waitConnectionsScript: "/data/sh/wait_s1_for_connections.sh"
]
stage('拉代码') {
checkout scm: [
$class: 'GitSCM',
branches: [[name: params.Code_branch]],
userRemoteConfigs: [[
url: 'http://172.24.16.20/python/lessie-sourcing-agents.git',
credentialsId: 'fly_gitlab_auth'
]]
]
}
stage('验证参数') {
def selectedTargets = params.DEPLOY_TARGETS.split(',').toList()
def orderChars = params.DEPLOY_ORDER.split('').toList()
if (orderChars.isEmpty()) {
error("部署顺序不能为空请输入如AB、BA的顺序")
}
orderChars.each { instance ->
if (!selectedTargets.contains(instance)) {
error("部署顺序包含未选择的实例: ${instance},已选实例:${params.DEPLOY_TARGETS}")
}
}
def uniqueOrder = orderChars.unique()
if (uniqueOrder.size() != orderChars.size()) {
error("部署顺序包含重复实例: ${params.DEPLOY_ORDER}")
}
echo "✅ 参数验证通过:已选实例=${selectedTargets},部署顺序=${orderChars}"
env.VALID_ORDER = params.DEPLOY_ORDER
}
stage('动态部署') {
def orderChars = env.VALID_ORDER.split('').toList()
orderChars.each { instance ->
echo "===== 开始部署实例 ${instance} ====="
// 实例部署的5个步骤直接在循环中定义stage无嵌套
stage("${instance}:脱离后端组") {
def cfg = config[instance]
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxReloadScript} ${cfg.nginxBackend} ${cfg.port} down'"
sh "ssh ${cfg.remoteHost} 'sh ${commonConfig.waitConnectionsScript} ${cfg.port} ${commonConfig.connectionTimeout}'"
}
stage("${instance}下线&同步") {
def cfg = config[instance]
sh "ssh ${cfg.remoteHost} 'sh ${cfg.killScript} ${cfg.port}'"
sh """
ssh ${cfg.remoteHost} 'mkdir -p ${cfg.projectPath}'
rsync -avz --exclude 'venv' --exclude '.git' ${WORKSPACE}/ ${cfg.remoteHost}:${cfg.projectPath}/
"""
}
stage("${instance}依赖&启动") {
def cfg = config[instance]
sh """
ssh ${cfg.remoteHost} '
cd ${cfg.projectPath}
source ~/.bashrc
conda activate search
source ${cfg.venvDir}/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${cfg.projectPath}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=s1 gunicorn -w ${cfg.gunicornWorkers} -k uvicorn.workers.UvicornWorker \
-b 0.0.0.0:${cfg.port} --timeout 300 dialogue.app:app \
--max-requests 500 --max-requests-jitter 50 \
> "\$LOGFILE" 2>&1 &
ln -sf "\$LOGFILE" ${cfg.projectPath}/logs/lessie_sourcing_agents_latest.log
'
"""
}
stage("探测${instance}探测服务") {
def cfg = config[instance]
sh "sleep 5"
sh "ssh ${cfg.remoteHost} 'head -n 300 ${cfg.projectPath}/logs/lessie_sourcing_agents_latest.log | grep -i error || echo 未发现错误日志'"
sh "ssh ${cfg.remoteHost} 'sh ${cfg.checkScript}'"
}
stage("恢复${instance}流量") {
def cfg = config[instance]
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxReloadScript} ${cfg.nginxBackend} ${cfg.port} up'"
}
echo "===== 实例 ${instance} 部署完成 ====="
}
}
echo '✅ 所有选中的实例部署成功!'
}

View File

@@ -0,0 +1,45 @@
#!/bin/bash
# Nginx 后端服务器上下线脚本
# 用法: set_prod_backend_weight.sh <ip> <port> <action>
# 示例:
# set_prod_backend_weight.sh 10.0.0.5 7001 down
# set_prod_backend_weight.sh 10.0.0.5 7001 up
IP=$1
PORT=$2
ACTION=$3 # down / up
NGINX_CONFIG="/data/tengine/vhosts/app.lessie.ai.conf"
BACKUP_CONFIG="${NGINX_CONFIG}.backup.$(date +%F_%T).bak"
# 参数检查
if [ -z "$IP" ] || [ -z "$PORT" ] || [ -z "$ACTION" ]; then
echo "用法: $0 <ip> <port> <action> (action: down/up)"
exit 1
fi
# 备份
cp -f "$NGINX_CONFIG" "$BACKUP_CONFIG" || {
echo "备份配置失败"
exit 1
}
# 修改
if [ "$ACTION" == "down" ]; then
sed -i "s/\(server[[:space:]]\+$IP:$PORT[[:space:]]*\)weight=[0-9]\+\(.*\)/\1down\2/" "$NGINX_CONFIG"
elif [ "$ACTION" == "up" ]; then
sed -i "s/\(server[[:space:]]\+$IP:$PORT[[:space:]]*\)down\(.*\)/\1weight=10\2/" "$NGINX_CONFIG"
else
echo "无效的 action: $ACTION"
exit 1
fi
# 验证 & 重载
if nginx -t; then
nginx -s reload
echo "✅ 已将 $IP:$PORT 设置为 $ACTION"
rm -f "$BACKUP_CONFIG"
else
echo "❌ 配置检查失败,回滚..."
cp -f "$BACKUP_CONFIG" "$NGINX_CONFIG"
exit 1
fi

View File

@@ -0,0 +1,60 @@
#!/bin/bash
# /data/sh/wait_s1_for_connections.sh
# 等待指定端口的连接数连续 N 次为0否则超时后直接杀死进程
# 用法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=5 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
KILL_SCRIPT="/data/sh/kill_lessie_sourcing_agents.sh"
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
CONNECTIONS=$(netstat -anp 2>/dev/null | grep :$PORT | grep -w ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "✅ 已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
SUCCESS_COUNT=0
echo "⚠️ 连接数不为0重置连续成功计数"
fi
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo ""
sleep $CHECK_INTERVAL
done
echo "⏰ 超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0"
echo "尝试杀死该端口的进程..."
if [ -x "$KILL_SCRIPT" ]; then
sh $KILL_SCRIPT $PORT
exit 0
else
echo "❌ 错误:未找到 $KILL_SCRIPT,无法杀死进程"
exit 1
fi
exit 1

View File

@@ -0,0 +1,41 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_feishu_auto.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -Dmaven.test.skip=true"
}
}
stage('jar A下线') {
steps {
echo("1")
sh """ssh 172.24.16.13 'sh /data/sh/kill_fly_moon_feishu_auto.sh' """
}
}
stage('jar A同步') {
steps {
echo("2")
sh """
scp ${WORKSPACE}/target/feishu_auto-0.0.1-SNAPSHOT.jar 172.24.16.13:/data/webapps/fly-moon-feishu-auto/fly_moon_feishu_auto.jar
"""
}
}
stage('jar A启动') {
steps {
echo("3")
sh """ssh 172.24.16.13 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-feishu-auto/fly_moon_feishu_auto.jar >/dev/null 2>&1 &' """
}
}
}
}

View File

@@ -0,0 +1,38 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'sync-data', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_crawlspider.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_crawlSpider-syncData.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/target/fly_moon_crawlSpider-0.0.1-SNAPSHOT.jar 172.24.16.10:/data/webapps/syncData/fly_moon_crawlSpider-0.0.1-SNAPSHOT.jar
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/syncData/fly_moon_crawlSpider-0.0.1-SNAPSHOT.jar >/data/webapps/syncData/nohup-0.0.1.out 2>&1 &' "
}
}
}
}
kill_fly_moon_crawlSpider-syncData.sh
ps axjf|grep fly_moon_crawlSpider-0.0.1-SNAPSHOT|grep -v grep |awk '{print "kill ",$2}'|sh -

View File

@@ -0,0 +1,27 @@
#!/bin/bash
#
# 检查本地端口是否在指定超时时间内变为可用
# 用法: ./check_port.sh <port> [timeout]
# 例如: ./check_port.sh 8000 60
#
PORT=${1:-8000}
TIMEOUT=${2:-60}
INTERVAL=5
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
echo "开始检测: 端口 $PORT,超时时间 ${TIMEOUT}s每次间隔 ${INTERVAL}s"
while [ $(date +%s) -lt $END_TIME ]; do
if nc -z -w1 localhost "$PORT" 2>/dev/null; then
echo "[$(date '+%F %T')] ✅ 端口 $PORT 已启用"
exit 0
else
echo "[$(date '+%F %T')] ⏳ 端口 $PORT 尚为启动用,等待 ${INTERVAL}s..."
sleep $INTERVAL
fi
done
echo "[$(date '+%F %T')] ❌ 超时: 端口 $PORT${TIMEOUT}s 内未变为启用"
exit 1

View File

@@ -0,0 +1,170 @@
pipeline {
agent any
tools{
go 'go1.24.0'
}
environment {
REMOTE_HOST_A = "43.153.98.191"
REMOTE_HOST_B = "49.51.41.243"
NGINX_HOST = "49.51.46.148"
REMOTE_PROJECT_PATH_A = "/data/webapps/go_lessie_sourcing_api"
REMOTE_PROJECT_PATH_B = "/data/webapps/go_lessie_sourcing_api"
NGINX_GO_backend_A = "10.0.0.10"
NGINX_GO_backend_B = "10.0.0.8"
PORT_A = "8100"
PORT_B = "8100"
CONNECTION_TIMEOUT = "600" // 等待连接关闭的超时时间
CHECK_PORT_SCRIPT = "/data/sh/check_port.sh" // 检查服务所运行的端口是否起起来
NGINX_RELOAD_SCRIPT = "/data/sh/set_prod_go_backend_weight.sh" // 设置nginx后端组up/down
SEND_STOP_GOAPP_SCRIPT = "/data/sh/send_stop_goapp.sh" // 发送GO的优雅停止信号
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_for_connections.sh" // 监测实例A是否有连接
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh" // 检查后端组状态
}
stages {
stage('Checkout 代码') {
steps {
echo "阶段一"
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/go/lessie-sourcing-api.git'
}
}
stage('依赖并构建') {
steps {
echo "阶段二"
sh """
cd ${WORKSPACE}/
export GOVCS="git.deeplink.media:git,*:git"
echo "拉依赖"
go mod tidy -v -x
echo "构建二进制文件"
make build-linux
chmod +x ./build/lessie-sourcing-api
"""
}
}
stage('A脱离&下线') {
steps {
echo "阶段三"
echo "将实例A的nginx权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_GO_backend_A} ${PORT_A} down'"
sh """
ssh ${REMOTE_HOST_A} '
echo "向实例A发送优雅关闭信号"
sh ${SEND_STOP_GOAPP_SCRIPT}
echo "监测实例A是否有连接"
sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}
'
"""
}
}
stage('A同步&启动') {
steps {
echo "阶段四"
sh """
echo "进入jenkins工作目录:${WORKSPACE}"
cd ${WORKSPACE}/
echo "同步二进制产物"
rsync -avzuP ./build/lessie-sourcing-api ./configs/application_prod.yaml ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A}
chmod +x ./lessie-sourcing-api
nohup env ENV=prod ./lessie-sourcing-api > ./go.log 2>&1 &
'
"""
}
}
stage('探测A服务 ') {
steps {
echo "阶段五"
sh "sleep 10"
sh """
ssh ${REMOTE_HOST_A} '
echo "查看实例A的启动日志"
head -n 5 ${REMOTE_PROJECT_PATH_A}/go.log || true
sh ${CHECK_PORT_SCRIPT} 8100 60
ps aux|grep lessie-sourcing-api
'
"""
}
}
stage('恢复A流量') {
steps {
echo "阶段六"
echo "恢复实例A的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_GO_backend_A} ${PORT_A} up'"
echo "实例 A 部署完成"
}
}
stage('B脱离后端组') {
steps {
echo "阶段七"
echo "将实例B的nginx权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_GO_backend_B} ${PORT_B} down'"
sh """
ssh ${REMOTE_HOST_B} '
echo "向实例B发送优雅关闭信号"
sh ${SEND_STOP_GOAPP_SCRIPT}
echo "监测实例B是否有连接"
sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_B} ${CONNECTION_TIMEOUT}
'
"""
}
}
stage('B同步&启动') {
steps {
echo "阶段八"
sh """
echo "进入jenkins工作目录:${WORKSPACE}"
cd ${WORKSPACE}/
echo "同步二进制产物"
rsync -avzuP ./build/lessie-sourcing-api ./configs/application_prod.yaml ${REMOTE_HOST_B}:${REMOTE_PROJECT_PATH_B}/
ssh ${REMOTE_HOST_B} '
cd ${REMOTE_PROJECT_PATH_B}
chmod +x ./lessie-sourcing-api
nohup env ENV=prod ./lessie-sourcing-api > ./go.log 2>&1 &
'
"""
}
}
stage('探测B服务 ') {
steps {
echo "阶段九"
echo "探测B服务"
sh "sleep 10"
sh """
ssh ${REMOTE_HOST_B} '
echo "查看实例B的启动日志"
head -n 5 ${REMOTE_PROJECT_PATH_B}/go.log || true
sh ${CHECK_PORT_SCRIPT} 8100 60
ps aux|grep lessie-sourcing-api
'
"""
}
}
stage('恢复B流量') {
steps {
echo "阶段十"
echo "恢复实例A的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_GO_backend_B} ${PORT_B} up'"
echo "实例 B 部署完成"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,97 @@
pipeline {
agent any
tools{
go 'go1.23.0'
}
environment {
REMOTE_HOST_A = "43.130.56.138"
REMOTE_PROJECT_PATH_A = "/data/webapps/go_lessie_sourcing_api"
PORT_A = "8100"
CONNECTION_TIMEOUT = "600" // 等待连接关闭的超时时间
CHECK_PORT_SCRIPT = "/data/sh/check_port.sh" // 检查服务所运行的端口是否起起来
SEND_STOP_GOAPP_SCRIPT = "/data/sh/send_stop_goapp.sh" // 发送GO的优雅停止信号
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_for_connections.sh" // 监测实例A是否有连接
}
stages {
stage('Checkout代码') {
steps {
echo "阶段一"
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/go/lessie-sourcing-api.git'
}
}
stage('依赖&构建') {
steps {
echo "阶段二"
sh """
cd ${WORKSPACE}/
export GOVCS="git.deeplink.media:git,*:git"
echo "拉依赖"
go mod tidy -v -x
echo "构建二进制文件"
make build-linux
chmod +x ./build/lessie-sourcing-api
"""
}
}
stage('A同步') {
steps {
echo "阶段三"
sh """
echo "进入jenkins工作目录:${WORKSPACE}"
cd ${WORKSPACE}/
echo "同步二进制产物"
rsync -avzuP ./build/lessie-sourcing-api ./configs/application_s1.yaml ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
"""
}
}
stage('A下线') {
steps {
echo "阶段三"
sh """
ssh ${REMOTE_HOST_A} '
echo "向实例A发送优雅关闭信号"
sh ${SEND_STOP_GOAPP_SCRIPT}
echo "监测实例A是否有连接"
sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}
'
"""
}
}
stage('A启动') {
steps {
echo "阶段四"
sh """
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A}
chmod +x ./lessie-sourcing-api
nohup env ENV=s1 ./lessie-sourcing-api > ./go.log 2>&1 &
'
"""
}
}
stage('探测A服务 ') {
steps {
echo "阶段五"
sh "sleep 10"
sh """
ssh ${REMOTE_HOST_A} '
echo "查看实例A的启动日志"
head -n 5 ${REMOTE_PROJECT_PATH_A}/go.log || true
sh ${CHECK_PORT_SCRIPT} 8100 60
sleep 5
ps aux|grep lessie-sourcing-api
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,97 @@
pipeline {
agent any
tools{
go 'go1.24.0'
}
environment {
REMOTE_HOST_A = "43.159.145.241"
REMOTE_PROJECT_PATH_A = "/data/webapps/go_lessie_sourcing_api"
PORT_A = "8100"
CONNECTION_TIMEOUT = "600" // 等待连接关闭的超时时间
CHECK_PORT_SCRIPT = "/data/sh/check_port.sh" // 检查服务所运行的端口是否起起来
SEND_STOP_GOAPP_SCRIPT = "/data/sh/send_stop_goapp.sh" // 发送GO的优雅停止信号
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_for_connections.sh" // 监测实例A是否有连接
}
stages {
stage('Checkout代码') {
steps {
echo "阶段一"
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/go/lessie-sourcing-api.git'
}
}
stage('依赖&构建') {
steps {
echo "阶段二"
sh """
cd ${WORKSPACE}/
export GOVCS="git.deeplink.media:git,*:git"
echo "拉依赖"
go mod tidy -v -x
echo "构建二进制文件"
make build-linux
chmod +x ./build/lessie-sourcing-api
"""
}
}
stage('A同步') {
steps {
echo "阶段三"
sh """
echo "进入jenkins工作目录:${WORKSPACE}"
cd ${WORKSPACE}/
echo "同步二进制产物"
rsync -avzuP ./build/lessie-sourcing-api ./configs/application_s2.yaml ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
"""
}
}
stage('A下线') {
steps {
echo "阶段三"
sh """
ssh ${REMOTE_HOST_A} '
echo "向实例A发送优雅关闭信号"
sh ${SEND_STOP_GOAPP_SCRIPT}
echo "监测实例A是否有连接"
sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}
'
"""
}
}
stage('A启动') {
steps {
echo "阶段四"
sh """
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A}
chmod +x ./lessie-sourcing-api
nohup env ENV=s2 ./lessie-sourcing-api > ./go.log 2>&1 &
'
"""
}
}
stage('探测A服务 ') {
steps {
echo "阶段五"
sh "sleep 10"
sh """
ssh ${REMOTE_HOST_A} '
echo "查看实例A的启动日志"
head -n 5 ${REMOTE_PROJECT_PATH_A}/go.log || true
sh ${CHECK_PORT_SCRIPT} 8100 60
sleep 5
ps aux|grep lessie-sourcing-api
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,76 @@
# 线上的 =========================================================
#!/bin/bash
APP_NAME="lessie-sourcing-api"
MAX_WAIT_SECONDS=600
# 1. 获取 PID
PID=$(ps -ef | grep "${APP_NAME}" | grep -v grep | awk '{print $2}' | head -n 1)
if [ -z "$PID" ]; then
echo "未找到 ${APP_NAME} 进程,无需停止"
exit 0
fi
echo "找到进程 PID: $PID"
# 2. 发送 SIGTERM
kill -TERM $PID
echo "已发送 SIGTERM"
# # 3. 等待退出
# ELAPSED=0
# while [ $ELAPSED -lt $MAX_WAIT_SECONDS ]; do
# if ! ps -p $PID > /dev/null 2>&1; then
# echo "进程已退出"
# exit 0
# fi
# sleep 10
# ELAPSED=$((ELAPSED+10))
# echo "已等待 ${ELAPSED} 秒..."
# done
# # 4. 超时强杀
# echo "超时 ${MAX_WAIT_SECONDS} 秒未退出,强制 kill -9"
# kill -9 $PID
# ps aux|grep $PID
# s2的===================================================
#!/bin/bash
APP_PATTERN="./lessie-sourcing-api$"
PID=$(pgrep -f "$APP_PATTERN")
if [ -z "$PID" ]; then
echo "未找到 lessie-sourcing-api 进程"
exit 0
fi
echo "找到 PID: $PID"
kill -TERM $PID
echo "已发送 SIGTERM"
# s3的===================================================
#!/bin/bash
APP_PATTERN="./s3-lessie-sourcing-api"
PID=$(pgrep -f "$APP_PATTERN")
if [ -z "$PID" ]; then
echo "未找到 s3-lessie-sourcing-api 进程"
exit 0
fi
echo "找到 PID: $PID"
kill -TERM $PID
echo "已发送 SIGTERM"

View File

@@ -0,0 +1,45 @@
#!/bin/bash
# Nginx 后端服务器上下线脚本
# 用法: set_backend_status.sh <ip> <port> <action>
# 示例:
# set_backend_status.sh 10.0.0.5 7001 down
# set_backend_status.sh 10.0.0.5 7001 up
IP=$1
PORT=$2
ACTION=$3 # down / up
NGINX_CONFIG="/data/tengine/vhosts/app.lessie.ai.conf"
BACKUP_CONFIG="${NGINX_CONFIG}.backup.$(date +%F_%T).bak"
# 参数检查
if [ -z "$IP" ] || [ -z "$PORT" ] || [ -z "$ACTION" ]; then
echo "用法: $0 <ip> <port> <action> (action: down/up)"
exit 1
fi
# 备份
cp -f "$NGINX_CONFIG" "$BACKUP_CONFIG" || {
echo "备份配置失败"
exit 1
}
# 修改
if [ "$ACTION" == "down" ]; then
sed -i "s/\(server[[:space:]]\+$IP:$PORT[[:space:]]*\)weight=[0-9]\+\(.*\)/\1down\2/" "$NGINX_CONFIG"
elif [ "$ACTION" == "up" ]; then
sed -i "s/\(server[[:space:]]\+$IP:$PORT[[:space:]]*\)down\(.*\)/\1weight=10\2/" "$NGINX_CONFIG"
else
echo "无效的 action: $ACTION"
exit 1
fi
# 验证 & 重载
if nginx -t; then
nginx -s reload
echo "✅ 已将 $IP:$PORT 设置为 $ACTION"
rm -f "$BACKUP_CONFIG"
else
echo "❌ 配置检查失败,回滚..."
cp -f "$BACKUP_CONFIG" "$NGINX_CONFIG"
exit 1
fi

View File

@@ -0,0 +1,264 @@
#!/bin/bash
# 等待指定端口的连接数连续3次为0每次间隔5秒
# 使用方法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300最多等待300秒
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=3 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
# 检测当前连接数
CONNECTIONS=$(netstat -anp | grep :$PORT | grep ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
# 达到3次连续成功退出
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
# 连接数不为0重置计数器
SUCCESS_COUNT=0
echo "连接数不为0重置连续成功计数"
fi
# 每次检测后间隔5秒
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo "======================"
sleep $CHECK_INTERVAL
done
echo "超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0当前连接数: $CONNECTIONS"
exit 1
# === 8月11日 === ↓ ===增加了连接类型过滤和进程实际请求检测======= ↓ =======================================
#!/bin/bash
# 等待AI进程的活跃用户连接为0排除内部连接和无效连接
# 使用方法: wait_for_ai_connections.sh <port> <process_name> <timeout>
# 示例: wait_for_ai_connections.sh 8000 "python server.py" 300
# netstat -anp | grep :8000 | grep ESTABLISHED | wc -l
PORT=$1
PROCESS_NAME=$2 # 进程特征名称,用于精准定位
TIMEOUT=${3:-300} # 默认超时时间300秒
# 参数校验
if [ -z "$PORT" ] || [ -z "$PROCESS_NAME" ]; then
echo "用法: $0 <port> <process_name> <timeout>"
echo "示例: $0 8000 'python server.py' 300"
exit 1
fi
# 配置参数
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0
REQUIRED_SUCCESS=3 # 连续3次检测通过
CHECK_INTERVAL=5 # 检测间隔(秒)
NGINX_IP=$(hostname -I | awk '{print $1}') # Nginx服务器IP排除自身连接
echo "开始检测端口 $PORT 上的进程 '$PROCESS_NAME',超时时间 $TIMEOUT"
echo "将排除与Nginx服务器($NGINX_IP)的内部连接"
# 获取进程ID用于更精准的连接检测
PID=$(ps aux | grep -v grep | grep "$PROCESS_NAME" | grep ":$PORT" | awk '{print $2}')
if [ -z "$PID" ]; then
echo "未找到端口 $PORT 上的进程 '$PROCESS_NAME'"
exit 1
fi
echo "检测到目标进程PID: $PID"
while [ $(date +%s) -lt $END_TIME ]; do
# 1. 检测活跃连接排除Nginx内部连接和TIME_WAIT状态
# 过滤条件:
# - 状态为ESTABLISHED
# - 不包含Nginx服务器IP排除负载均衡器的健康检查连接
# - 属于目标进程PID
CONNECTIONS=$(netstat -antp | grep -E ":$PORT.*ESTABLISHED" | grep -v "$NGINX_IP" | grep "$PID" | wc -l)
# 2. 检测进程是否有近期请求日志(如果日志有时间戳)
# 检查最近30秒内是否有新请求
RECENT_LOGS=0
LOG_FILE=$(find /data/webapps/ -name "lessie_sourcing_agents_*.log" | sort -r | head -1)
if [ -n "$LOG_FILE" ]; then
RECENT_LOGS=$(tail -n 100 "$LOG_FILE" | grep -E "$(date -d '30 seconds ago' +'%Y-%m-%d %H:%M:%S')" -A 100 | grep -i "request" | wc -l)
fi
echo "=== 检测结果 ==="
echo "活跃用户连接数: $CONNECTIONS排除Nginx内部连接"
echo "最近30秒请求数: $RECENT_LOGS"
echo "连续无连接计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
echo "================="
# 判断条件:无活跃连接且无近期请求
if [ "$CONNECTIONS" -eq 0 ] && [ "$RECENT_LOGS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已确认进程无活跃用户连接,安全下线"
exit 0
fi
else
SUCCESS_COUNT=0
fi
sleep $CHECK_INTERVAL
done
echo "超时! 进程仍有活动(连接数: $CONNECTIONS,近期请求: $RECENT_LOGS"
exit 1
# -------------------------
#!/bin/bash
# 等待指定端口的连接数连续3次为0每次间隔5秒
# 使用方法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300最多等待300秒
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=5 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
# 检测当前连接数
CONNECTIONS=$(netstat -anp | grep :$PORT | grep -w ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
# 达到3次连续成功退出
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
# 连接数不为0重置计数器
SUCCESS_COUNT=0
echo "连接数不为0重置连续成功计数"
fi
# 每次检测后间隔5秒
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo " "
sleep $CHECK_INTERVAL
done
echo "超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0当前连接数: $CONNECTIONS"
exit 1
---------------------------------------------
#!/bin/bash
#
# 等待指定端口的连接数连续 N 次为 0每次间隔 M 秒)
# 用法: wait_for_connections.sh <port> [timeout]
# 示例: wait_for_connections.sh 8000 300 # 最多等待 300 秒
#
PORT=$1
TIMEOUT=${2:-600} # 默认超时 600 秒
REQUIRED_SUCCESS=${REQUIRED_SUCCESS:-5} # 需要连续成功次数,默认 5 次
CHECK_INTERVAL=${CHECK_INTERVAL:-5} # 检测间隔,默认 5 秒
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0
if [ -z "$PORT" ]; then
echo "用法: $0 <port> [timeout]"
exit 1
fi
# 检测可用工具
if command -v ss >/dev/null 2>&1; then
NET_TOOL="ss"
elif command -v netstat >/dev/null 2>&1; then
NET_TOOL="netstat"
else
echo "错误: 没有找到 ss 或 netstat 命令"
exit 1
fi
# 获取当前端口 ESTABLISHED 连接数
get_connections() {
if [ "$NET_TOOL" = "ss" ]; then
ss -tanp 2>/dev/null | grep ":$PORT" | grep ESTAB | wc -l
else
netstat -anp 2>/dev/null | grep ":$PORT" | grep -w ESTABLISHED | wc -l
fi
}
echo "开始检测: 端口 $PORT"
echo "条件: 连续 $REQUIRED_SUCCESS 次为 0检测间隔 ${CHECK_INTERVAL}s超时时间 ${TIMEOUT}s"
echo "使用工具: $NET_TOOL"
echo "---------------------------------------------"
while [ $(date +%s) -lt $END_TIME ]; do
CONNECTIONS=$(get_connections)
TIMESTAMP=$(date '+%F %T')
echo "[$TIMESTAMP] 当前连接数: $CONNECTIONS(连续成功 $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
if [ "$SUCCESS_COUNT" -ge "$REQUIRED_SUCCESS" ]; then
echo "[$TIMESTAMP] ✅ 检测通过: 端口 $PORT 已连续 $REQUIRED_SUCCESS 次无活跃连接"
exit 0
fi
else
SUCCESS_COUNT=0
fi
sleep "$CHECK_INTERVAL"
done
TIMESTAMP=$(date '+%F %T')
echo "[$TIMESTAMP] ❌ 超时: 在 ${TIMEOUT}s 内端口 $PORT 未达到连续 $REQUIRED_SUCCESS 次无活跃连接"
exit 1

View File

@@ -0,0 +1,135 @@
pipeline {
agent any
environment {
# REMOTE_HOST = "" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/ins_search_crawler" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/ins_search_crawler/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/ins_search_crawler.git'
}
}
stage('进程下线') {
steps {
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/kill_ins_search_crawler.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${params.REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${params.REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${params.REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate py310 &&
source ${VENV_DIR}/bin/activate &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/run_ins_search_crawler.sh'"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
---------------------------------------------
pipeline {
agent any
environment {
// REMOTE_HOST = "" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/ins_update" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/ins_update/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/ins_update.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/kill_ins_update.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${params.REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${params.REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${params.REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate py310 &&
source ${VENV_DIR}/bin/activate &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/run_ins_update.sh'"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,66 @@
pipeline {
agent any
environment {
// REMOTE_HOST = "" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/ins_update" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/ins_update/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/ins_update.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/kill_ins_update.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${params.REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${params.REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${params.REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate py310 &&
source ${VENV_DIR}/bin/activate &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/run_ins_update.sh'"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,75 @@
pipeline {
agent any
environment {
REMOTE_HOST = "43.130.56.138" // 远程服务器 {params.REMOTE_HOST}
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/lessie_sourcing_agents/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: '${params.Code_branch}', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh """
ssh ${REMOTE_HOST} '
conda activate search
source ${VENV_DIR}/bin/activate
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
nohup python /data/webapps/lessie_sourcing_agents/server.py > /data/webapps/lessie_sourcing_agents/logs/lessie_sourcing_agents_${TIMESTAMP}.log 2>&1 &
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,64 @@
pipeline {
agent any
environment {
DEPLOY_HOST = '49.51.46.148' // 目标机 IP 或域名
DEPLOY_DIR = '/data/tengine/html/lessie_official' // 目标机部署目录
}
stages {
stage('Checkout 代码') {
steps {
git branch: 'dev', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/web/scalelink-frontend.git'
}
}
stage('Install & Build') {
steps {
sh """
cd ${WORKSPACE}/projects/lessie' &&
npm install --frozen-lockfile &&
npm run build
"""
}
}
stage('同步文件') {
steps {
// 打包必要文件:.output、package.json、pnpm-lock.yaml
# sh '''
# rm -rf deploy.tar.gz
# tar czf deploy.tar.gz \
# .output package.json pnpm-lock.yaml
# '''
# archiveArtifacts artifacts: 'deploy.tar.gz'
}
}
stage('Deploy to Target') {
steps {
sshagent([SSH_CRED]) {
// 1) 传输压缩包
sh """
scp deploy.tar.gz ${DEPLOY_USER}@${DEPLOY_HOST}:/tmp/
"""
// 2) 解压、安装依赖、重启
sh """
ssh ${DEPLOY_USER}@${DEPLOY_HOST} '
mkdir -p ${DEPLOY_DIR} &&
tar xzf /tmp/deploy.tar.gz -C ${DEPLOY_DIR} &&
cd ${DEPLOY_DIR} &&
# 安装生产依赖
npm install --production &&
# 重启 pm2 服务
pm2 reload nuxt-app || pm2 start .output/server/index.mjs --name nuxt-app
'
"""
}
}
}
}
post {
success {
echo '部署成功 🎉'
}
failure {
echo '部署失败,请检查日志 ❌'
}
}
}

View File

@@ -0,0 +1,70 @@
pipeline {
agent any
environment {
REMOTE_HOST = "43.159.145.241" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/influencer_search_agent" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/influencer_search_agent/venv" // 远程虚拟环境目录
}
stages {
stage('Checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/influencer-search-demo.git'
}
}
stage('进程下线') {
steps {
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_influencer_search_agent.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
if [ ! -d "${VENV_DIR}" ]; then
python3 -m venv ${VENV_DIR}
fi &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
sh """
ssh ${REMOTE_HOST} '
source ${VENV_DIR}/bin/activate &&
nohup env PYTHONPATH=/data/webapps/influencer_search_agent python3 -m dialogue.influencer_search > /data/webapps/influencer_search_agent/nohup.out 2>&1 &
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,162 @@
pipeline {
agent any
environment {
CODE_BRANCH = "dev"
LOCKHOST_IP = "192.168.70.15"
LOCKHOST_PROJECT_PATH = "/root/cdx/scalelink-frontend"
WEB_HOST_IP = "43.130.56.138"
WEB_HOST_PROJECT_PATH = "/data/webapps/lessie_official_web"
}
stages {
stage('拉取代码') {
steps {
git branch: "${CODE_BRANCH}",
credentialsId: 'fly_gitlab_auth',
url: 'http://172.24.16.20/web/scalelink-frontend.git'
}
}
stage('同步到本地机器') {
steps {
sh """
ssh ${LOCKHOST_IP} 'rm -rf ${LOCKHOST_PROJECT_PATH}/"*"' &&
rsync -az ${WORKSPACE}/ ${LOCKHOST_IP}:${LOCKHOST_PROJECT_PATH}/
"""
}
}
stage('依赖和构建') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
cd ${LOCKHOST_PROJECT_PATH}/projects/lessie &&
pnpm install --force && pnpm build &&
tar -czf output.tar.gz .output
\\""
"""
}
}
stage('上传产物') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
scp -r ${LOCKHOST_PROJECT_PATH}/projects/lessie/output.tar.gz ${WEB_HOST_IP}:${WEB_HOST_PROJECT_PATH}/
\\""
"""
}
}
stage('启动') {
steps {
sh """
ssh ${WEB_HOST_IP} '
cd ${WEB_HOST_PROJECT_PATH} && pm2 list &&
pm2 delete lessie-official-web &&
tar -zxf output.tar.gz &&
pm2 start .output/server/index.mjs --name lessie-official-web --output ./nuxt-out.log --error ./nuxt-error.log
'
"""
}
}
}
}
# ------------上边是旧的,下边的新的------------------
pipeline {
agent any
environment {
# CODE_BRANCH = "dev"
LOCKHOST_IP = "192.168.70.15"
LOCKHOST_PROJECT_PATH = "/root/cdx/scalelink-frontend"
WEB_HOST_IP_1 = "43.130.56.138"
WEB_HOST_IP_2 = "43.153.21.64"
WEB_HOST_PROJECT_PATH = "/data/webapps/lessie_official_web"
}
stages {
stage('拉取代码') {
steps {
git branch: "${params.Code_branch}",
credentialsId: 'fly_gitlab_auth',
url: 'http://172.24.16.20/web/scalelink-frontend.git'
}
}
stage('同步到本地机器') {
steps {
sh """
ssh ${LOCKHOST_IP} 'rm -rf ${LOCKHOST_PROJECT_PATH}/"*"' &&
rsync -az ${WORKSPACE}/ ${LOCKHOST_IP}:${LOCKHOST_PROJECT_PATH}/
"""
}
}
stage('依赖和构建') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
cd ${LOCKHOST_PROJECT_PATH}/projects/lessie &&
pnpm install --force && pnpm build &&
tar -czf output.tar.gz .output
\\""
"""
}
}
stage('上传产物到机器1') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
scp -r ${LOCKHOST_PROJECT_PATH}/projects/lessie/output.tar.gz ${WEB_HOST_IP_2}:${WEB_HOST_PROJECT_PATH}/
\\""
"""
}
}
stage('启动机器1') {
steps {
sh """
ssh ${WEB_HOST_IP_2} '
cd ${WEB_HOST_PROJECT_PATH} && pm2 list &&
pm2 delete lessie-official-web &&
tar -zxf output.tar.gz &&
pm2 start .output/server/index.mjs --name lessie-official-web --output ./nuxt-out.log --error ./nuxt-error.log
'
"""
}
}
stage('上传产物到机器2') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
scp -r ${LOCKHOST_PROJECT_PATH}/projects/lessie/output.tar.gz ${WEB_HOST_IP_1}:${WEB_HOST_PROJECT_PATH}/
\\""
"""
}
}
stage('启动机器2') {
steps {
sh """
ssh ${WEB_HOST_IP_1} '
bash &&
cd ${WEB_HOST_PROJECT_PATH} && pm2 list &&
pm2 delete lessie-official-web &&
tar -zxf output.tar.gz &&
pm2 start .output/server/index.mjs --name lessie-official-web --output ./nuxt-out.log --error ./nuxt-error.log
'
"""
}
}
}
}

View File

@@ -0,0 +1 @@
timeout 60 bash -c 'until nc -z localhost 8000; do echo "Port is not available. Sleeping..."; sleep 5; done;'

View File

@@ -0,0 +1 @@
timeout 60 bash -c 'until nc -z localhost 8002; do echo "Port is not available. Sleeping..."; sleep 5; done;'

View File

@@ -0,0 +1,13 @@
#!/bin/bash
# 检查指定端口的节点状态up/down
PORT=$1
NGINX_CONFIG="/data/tengine/conf/vhosts/s1.jennie.im.conf"
if [ -z "$PORT" ]; then
echo "用法: $0 <port>"
exit 1
fi
# 检查配置中是否包含"down"关键字
STATUS=$(grep "server 10.0.0.5:$PORT" $NGINX_CONFIG | grep -q "down" && echo "down" || echo "up")
echo $STATUS # 输出结果down 或 up

View File

@@ -0,0 +1,33 @@
#!/bin/bash
# 项目目录及关键路径
PROJECT_DIR="/data/webapps/prod_lessie_sourcing_agents"
VENV_DIR="$PROJECT_DIR/venv"
PYTHON_SCRIPT="$PROJECT_DIR/server7001.py"
LOG_DIR="/data/sh/logs"
# 日志记录
WATCH_LOG="$LOG_DIR/watcher.log"
# 检查进程是否存活
if ! pgrep -f "python .*server7001.py" > /dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') server7001.py not running. Restarting..." >> "$WATCH_LOG"
# 初始化环境
conda activate search
source "$VENV_DIR/bin/activate"
# 启动服务
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=prod python "$PYTHON_SCRIPT" --port 7001 > "$PROJECT_DIR/logs/lessie_sourcing_agents_${TIMESTAMP}.log" 2>&1 &
else
echo "$(date '+%Y-%m-%d %H:%M:%S') server7001.py is running." >> "$WATCH_LOG"
fi
crontab -e
*/5 * * * * bash /data/sh/check_start_server7001.sh

View File

@@ -0,0 +1,625 @@
pipeline {
agent any
environment {
REMOTE_HOST = "43.130.56.138"
NGINX_HOST = "49.51.46.148"
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents"
VENV_DIR = "/data/webapps/lessie_sourcing_agents/venv"
REMOTE_PROJECT_PATH_02 = "/data/webapps/lessie_sourcing_agents_02"
VENV_DIR_02 = "/data/webapps/lessie_sourcing_agents_02/venv"
CONDA_PATH = "/root/miniconda3/bin/conda"
PORT_A = "8000"
PORT_B = "8002"
CONNECTION_TIMEOUT = "500" // 等待连接关闭的超时时间(秒)
NGINX_RELOAD_SCRIPT = "/data/sh/set_s1_backend_weight.sh" // 设置nginx后端组up/down
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_s1_for_connections.sh" // 等待连接数变为0
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh" // 检查后端组状态
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('A脱离后端组') {
steps {
echo "将实例A的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_A} down'"
echo "等待实例A的现有连接关闭"
sh "ssh ${REMOTE_HOST} '${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}'"
}
}
stage('A下线&同步') {
steps {
echo("下线A后同步A")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('A依赖&启动') {
steps {
echo("A依赖&启动")
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH}
source ~/.bashrc
conda activate search
source ${VENV_DIR}/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH}/server.py > ${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('恢复A流量') {
steps {
echo "恢复实例A的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_A} up'"
echo "实例 A 部署完成"
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/check_lessie_agents_8000.sh' "
}
}
stage('截B流量') {
steps {
echo "将实例B的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_B} down'"
echo "等待实例B的现有连接关闭"
sh "ssh ${REMOTE_HOST} '${WAIT_CONNECTIONS_SCRIPT} ${PORT_B} ${CONNECTION_TIMEOUT}'"
}
}
stage('B下线&同步') {
steps {
echo("B下线&同步")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents_8002.sh'"
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH_02}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH_02}/
"""
}
}
stage('B依赖&启动') {
steps {
echo("B依赖&启动")
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH_02} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_02}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
TIMESTAMP_02=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_02}/logs/lessie_sourcing_agents_\${TIMESTAMP_02}.log"
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH_02}/server8002.py --port 8002 > ${REMOTE_PROJECT_PATH_02}/logs/lessie_sourcing_agents_\${TIMESTAMP_02}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_02}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('恢复B流量') {
steps {
echo "恢复实例B的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_B} up'"
echo "实例 B 部署完成"
}
}
stage('探测B服务 ') {
steps {
echo("探测B服务")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/check_lessie_agents_8002.sh' "
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# ==========================原本=======
pipeline {
agent any
environment {
REMOTE_HOST = "43.130.56.138"
NGINX_HOST = "49.51.46.148"
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents"
VENV_DIR = "/data/webapps/lessie_sourcing_agents/venv"
REMOTE_PROJECT_PATH_02 = "/data/webapps/lessie_sourcing_agents_02"
VENV_DIR_02 = "/data/webapps/lessie_sourcing_agents_02/venv"
CONDA_PATH = "/root/miniconda3/bin/conda"
PORT_A = "8000"
PORT_B = "8002"
CONNECTION_TIMEOUT = "500" // 等待连接关闭的超时时间(秒)
NGINX_RELOAD_SCRIPT = "/data/sh/set_s1_backend_weight.sh" // 设置nginx后端组up/down
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_s1_for_connections.sh" // 等待连接数变为0
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh" // 检查后端组状态
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('部署实例A') {
steps {
script {
// 部署前检查确保B节点处于up状态避免单节点部署时服务不可用
checkOtherNodeStatus(env.PORT_B, "A")
// 执行部署若失败则进入post的failure块回滚
deployInstance("A", env.PORT_A, env.REMOTE_PROJECT_PATH, env.VENV_DIR)
}
}
post {
failure {
echo "实例A部署失败开始回滚..."
rollbackInstance("A", env.PORT_A) // 回滚A节点状态
}
}
}
stage('部署实例B') {
steps {
script {
// 部署前检查确保A节点处于up状态
checkOtherNodeStatus(env.PORT_A, "B")
// 执行部署若失败则进入post的failure块回滚
deployInstance("B", env.PORT_B, env.REMOTE_PROJECT_PATH_02, env.VENV_DIR_02)
}
}
post {
failure {
echo "实例B部署失败开始回滚..."
rollbackInstance("B", env.PORT_B) // 回滚B节点状态
}
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
// 部署前检查确保其他节点处于up状态避免服务中断
def checkOtherNodeStatus(otherPort, currentInstance) {
echo "部署${currentInstance}前,检查另一节点(端口${otherPort})是否可用..."
def status = sh(
script: "ssh ${env.NGINX_HOST} '${env.CHECK_STATUS_SCRIPT} ${otherPort}'",
returnStdout: true
).trim()
if (status != "up") {
error "另一节点(端口${otherPort})当前状态为${status},无法部署${currentInstance}(避免服务不可用)"
}
echo "另一节点(端口${otherPort}状态正常up可部署${currentInstance}"
}
// 定义部署单个实例的函数
def deployInstance(instanceName, port, projectPath, venvDir) {
echo "开始部署实例 $instanceName (端口 $port)"
// 步骤1: 将实例权重设置为down停止接收新连接
echo "将实例 $instanceName 的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${port} down'"
// 步骤2: 等待现有连接关闭
echo "等待实例 $instanceName 的现有连接关闭"
sh "ssh ${REMOTE_HOST} '${WAIT_CONNECTIONS_SCRIPT} ${port} ${CONNECTION_TIMEOUT}'"
// 步骤3: 停止实例
echo "停止实例 $instanceName"
if (instanceName == "A") {
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
} else {
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents_8002.sh'"
}
// 步骤4: 同步代码
echo "同步实例 $instanceName 的代码"
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${projectPath}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${projectPath}/
"""
// 步骤5: 安装依赖
echo "安装实例 $instanceName 的依赖"
sh """
ssh ${REMOTE_HOST} '
cd ${projectPath} &&
source ~/.bashrc &&
conda activate search &&
source ${venvDir}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
// 步骤6: 启动实例
echo "启动实例 $instanceName"
if (instanceName == "A") {
sh """
ssh ${REMOTE_HOST} '
conda activate search
source ${venvDir}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${projectPath}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=sit python ${projectPath}/server.py > ${projectPath}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${projectPath}/logs/lessie_sourcing_agents_latest.log
'
"""
} else {
sh """
ssh ${REMOTE_HOST} '
conda activate search
source ${venvDir}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${projectPath}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=sit python ${projectPath}/server.py --port ${port} > ${projectPath}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${projectPath}/logs/lessie_sourcing_agents_latest.log
'
"""
}
// 步骤7: 等待服务启动并检查健康状态
echo "检查实例 $instanceName 的健康状态"
sh "sleep 5" // 等待服务启动
sh "ssh ${REMOTE_HOST} 'sh /data/sh/check_lessie_agents_${port}.sh'"
// 步骤8: 恢复流量
echo "恢复实例 $instanceName 的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${port} up'"
echo "实例 $instanceName 部署完成"
}
// 回滚函数若部署失败将节点恢复为up确保服务可用
def rollbackInstance(instanceName, port) {
echo "回滚实例${instanceName}(端口${port})状态..."
// 无论原状态如何失败后强制恢复为up避免节点长期down
sh "ssh ${env.NGINX_HOST} '${env.NGINX_RELOAD_SCRIPT} ${port} up'"
// 检查回滚后状态
def status = sh(
script: "ssh ${env.NGINX_HOST} '${env.CHECK_STATUS_SCRIPT} ${port}'",
returnStdout: true
).trim()
if (status == "up") {
echo "实例${instanceName}回滚成功当前状态为up"
} else {
error "实例${instanceName}回滚失败请手动检查nginx状态"
}
}
# --------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------------------------------------------------------------------------------------
pipeline {
agent any
environment {
REMOTE_HOST = "3.130.56.138"
NGINX_HOST = "9.51.46.148"
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents"
VENV_DIR = "/data/webapps/lessie_sourcing_agents/venv"
REMOTE_PROJECT_PATH_02 = "/data/webapps/lessie_sourcing_agents_02"
VENV_DIR_02 = "/data/webapps/lessie_sourcing_agents_02/venv"
CONDA_PATH = "/root/miniconda3/bin/conda"
PORT_A = "8000"
PORT_B = "8002"
CONNECTION_TIMEOUT = "500" // 等待连接关闭的超时时间(秒)
NGINX_RELOAD_SCRIPT = "/data/sh/set_s1_backend_weight.sh" // 设置nginx后端组up/down
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_s1_for_connections.sh" // 等待连接数变为0
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh" // 检查后端组状态
}
stages {
stage('Checkout 代码') {
steps {
echo "🔍 开始拉取代码,分支:${params.Code_branch}"
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
echo "✅ 代码拉取完成"
}
}
stage('部署实例A') {
stages {
stage('A-前置检查:另一节点状态') {
steps {
script {
checkOtherNodeStatus(env.PORT_B, "A")
}
}
}
stage('A-1. 设置实例A为down') {
steps {
echo "📌 开始将实例A端口${PORT_A}设为down停止接收新连接"
sh label: "执行nginx down命令", script: "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_A} down'"
echo "✅ 实例A已设为down"
}
}
stage('A-2. 等待实例A连接关闭') {
steps {
echo "📌 等待实例A端口${PORT_A})现有连接关闭,超时${CONNECTION_TIMEOUT}秒"
sh label: "执行等待连接脚本", script: "ssh ${REMOTE_HOST} '${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}'"
echo "✅ 实例A连接已关闭"
}
}
stage('A-3. 停止实例A进程') {
steps {
echo "📌 停止实例A端口${PORT_A})进程"
sh label: "执行停止脚本", script: "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
echo "✅ 实例A进程已停止"
}
}
stage('A-4. 同步实例A代码') {
steps {
echo "📌 同步代码到实例A目录${REMOTE_PROJECT_PATH}"
sh label: "执行rsync同步", script: """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
echo "✅ 实例A代码同步完成"
}
}
stage('A-5. 安装实例A依赖') {
steps {
echo "📌 安装实例A依赖目录${REMOTE_PROJECT_PATH}"
sh label: "执行pip安装", script: """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
echo "✅ 实例A依赖安装完成"
}
}
stage('A-6. 启动实例A') {
steps {
echo "📌 启动实例A端口${PORT_A}"
sh label: "执行启动命令", script: """
ssh ${REMOTE_HOST} '
conda activate search
source ${VENV_DIR}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH}/server.py > \$LOGFILE 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_latest.log
'
"""
echo "✅ 实例A启动命令已执行"
}
}
stage('A-7. 检查实例A健康状态') {
steps {
echo "📌 等待实例A端口${PORT_A})启动并检查健康状态"
sh label: "等待服务就绪", script: "sleep 5"
sh label: "执行健康检查脚本", script: "ssh ${REMOTE_HOST} 'sh /data/sh/check_lessie_agents_${PORT_A}.sh'"
echo "✅ 实例A健康检查通过"
}
}
stage('A-8. 恢复实例A流量') {
steps {
echo "📌 恢复实例A端口${PORT_A}流量设为up"
sh label: "执行nginx up命令", script: "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_A} up'"
echo "✅ 实例A流量已恢复"
}
}
}
post {
failure {
echo "❌ 实例A部署失败开始回滚..."
rollbackInstance("A", env.PORT_A)
}
}
}
stage('部署实例B') {
stages {
stage('B-前置检查:另一节点状态') {
steps {
script {
checkOtherNodeStatus(env.PORT_A, "B")
}
}
}
stage('B-1. 设置实例B为down') {
steps {
echo "📌 开始将实例B端口${PORT_B}设为down停止接收新连接"
sh label: "执行nginx down命令", script: "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_B} down'"
echo "✅ 实例B已设为down"
}
}
stage('B-2. 等待实例B连接关闭') {
steps {
echo "📌 等待实例B端口${PORT_B})现有连接关闭,超时${CONNECTION_TIMEOUT}秒"
sh label: "执行等待连接脚本", script: "ssh ${REMOTE_HOST} '${WAIT_CONNECTIONS_SCRIPT} ${PORT_B} ${CONNECTION_TIMEOUT}'"
echo "✅ 实例B连接已关闭"
}
}
stage('B-3. 停止实例B进程') {
steps {
echo "📌 停止实例B端口${PORT_B})进程"
sh label: "执行停止脚本", script: "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents_8002.sh'"
echo "✅ 实例B进程已停止"
}
}
stage('B-4. 同步实例B代码') {
steps {
echo "📌 同步代码到实例B目录${REMOTE_PROJECT_PATH_02}"
sh label: "执行rsync同步", script: """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH_02}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH_02}/
"""
echo "✅ 实例B代码同步完成"
}
}
stage('B-5. 安装实例B依赖') {
steps {
echo "📌 安装实例B依赖目录${REMOTE_PROJECT_PATH_02}"
sh label: "执行pip安装", script: """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH_02} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_02}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
echo "✅ 实例B依赖安装完成"
}
}
stage('B-6. 启动实例B') {
steps {
echo "📌 启动实例B端口${PORT_B}"
sh label: "执行启动命令", script: """
ssh ${REMOTE_HOST} '
conda activate search
source ${VENV_DIR_02}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_02}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH_02}/server.py --port ${PORT_B} > \$LOGFILE 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_02}/logs/lessie_sourcing_agents_latest.log
'
"""
echo "✅ 实例B启动命令已执行"
}
}
stage('B-7. 检查实例B健康状态') {
steps {
echo "📌 等待实例B端口${PORT_B})启动并检查健康状态"
sh label: "等待服务就绪", script: "sleep 5"
sh label: "执行健康检查脚本", script: "ssh ${REMOTE_HOST} 'sh /data/sh/check_lessie_agents_${PORT_B}.sh'"
echo "✅ 实例B健康检查通过"
}
}
stage('B-8. 恢复实例B流量') {
steps {
echo "📌 恢复实例B端口${PORT_B}流量设为up"
sh label: "执行nginx up命令", script: "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT} ${PORT_B} up'"
echo "✅ 实例B流量已恢复"
}
}
}
post {
failure {
echo "❌ 实例B部署失败开始回滚..."
rollbackInstance("B", env.PORT_B)
}
}
}
}
post {
success {
echo '🎉 所有实例部署成功!'
}
failure {
echo '❌ 部署失败,请查看上面的步骤日志定位问题!'
}
}
}
// 部署前检查确保其他节点处于up状态避免服务中断
def checkOtherNodeStatus(otherPort, currentInstance) {
echo "🔍 部署${currentInstance}前,检查另一节点(端口${otherPort})是否可用..."
def status = sh(
label: "检查节点${otherPort}状态",
script: "ssh ${env.NGINX_HOST} '${env.CHECK_STATUS_SCRIPT} ${otherPort}'",
returnStdout: true
).trim()
if (status != "up") {
error "❌ 另一节点(端口${otherPort})当前状态为${status},无法部署${currentInstance}(避免服务不可用)"
}
echo "✅ 另一节点(端口${otherPort}状态正常up可部署${currentInstance}"
}
// 回滚函数若部署失败将节点恢复为up确保服务可用
def rollbackInstance(instanceName, port) {
echo "🔄 回滚实例${instanceName}(端口${port})状态..."
sh label: "执行回滚up命令", script: "ssh ${env.NGINX_HOST} '${env.NGINX_RELOAD_SCRIPT} ${port} up'"
// 检查回滚后状态
def status = sh(
label: "检查回滚后状态",
script: "ssh ${env.NGINX_HOST} '${env.CHECK_STATUS_SCRIPT} ${port}'",
returnStdout: true
).trim()
if (status == "up") {
echo "✅ 实例${instanceName}回滚成功当前状态为up"
} else {
error "❌ 实例${instanceName}回滚失败请手动检查nginx状态"
}
}

View File

@@ -0,0 +1,155 @@
pipeline {
agent any
environment {
REMOTE_HOST_A = "43.130.56.138"
REMOTE_HOST_B = "43.130.53.202"
NGINX_HOST = "49.51.46.148"
REMOTE_PROJECT_PATH_A = "/data/webapps/lessie_sourcing_agents"
VENV_DIR_A = "/data/webapps/lessie_sourcing_agents/venv"
REMOTE_PROJECT_PATH_B = "/data/webapps/lessie_sourcing_agents"
VENV_DIR_B = "/data/webapps/lessie_sourcing_agents/venv"
CONDA_PATH = "/root/miniconda3/bin/conda"
NGINX_PY_backend_A = "10.0.0.5"
NGINX_PY_backend_B = "10.0.0.13"
PORT_A = "8000"
PORT_B = "8002"
CONNECTION_TIMEOUT = "600" // 等待连接关闭的超时时间(秒)
NGINX_RELOAD_SCRIPT = "/data/sh/set_s1_backend_weight_new.sh" // 设置nginx后端组up/down
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_s1_for_connections.sh" // 等待连接数变为0
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh" // 检查后端组状态
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('A脱离后端组') {
steps {
echo "将实例A的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_A} ${PORT_A} down'"
echo "等待实例A的现有连接关闭"
sh "ssh ${REMOTE_HOST_A} 'sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}'"
}
}
stage('A下线&同步') {
steps {
echo("下线A后同步A")
sh "ssh ${REMOTE_HOST_A} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
sh """
ssh ${REMOTE_HOST_A} 'mkdir -p ${REMOTE_PROJECT_PATH_A}'
rsync -avz --exclude 'venv' --exclude '.git' ${WORKSPACE}/ ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
"""
}
}
stage('A依赖&启动') {
steps {
echo("A依赖&启动")
sh """
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A}
source ~/.bashrc
conda activate search
source ${VENV_DIR_A}/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=s1 python ${REMOTE_PROJECT_PATH_A}/server.py --port 8000 > ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "sleep 5"
sh """
ssh ${REMOTE_HOST_A} "head -n 300 ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_latest.log | grep -i 'error' || true"
ssh ${REMOTE_HOST_A} "sh /data/sh/check_lessie_agents_8000.sh"
"""
}
}
stage('恢复A流量') {
steps {
echo "恢复实例A的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_A} ${PORT_A} up'"
echo "实例 A 部署完成"
}
}
stage('截B流量') {
steps {
echo "将实例B的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_B} ${PORT_B} down'"
echo "等待实例B的现有连接关闭"
sh "ssh ${REMOTE_HOST_B} 'sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_B} ${CONNECTION_TIMEOUT}'"
}
}
stage('B下线&同步') {
steps {
echo("B下线&同步")
sh "ssh ${REMOTE_HOST_B} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
sh """
ssh ${REMOTE_HOST_B} 'mkdir -p ${REMOTE_PROJECT_PATH_B}'
rsync -avz --exclude 'venv' --exclude '.git' ${WORKSPACE}/ ${REMOTE_HOST_B}:${REMOTE_PROJECT_PATH_B}/
"""
}
}
stage('B依赖&启动') {
steps {
echo("B依赖&启动")
sh """
ssh ${REMOTE_HOST_B} '
cd ${REMOTE_PROJECT_PATH_B} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_B}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=s1 python ${REMOTE_PROJECT_PATH_B}/server.py --port 8002 > ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('探测B服务 ') {
steps {
echo("探测B服务")
sh "sleep 5"
sh """
ssh ${REMOTE_HOST_B} "head -n 300 ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_latest.log | grep -i 'error' || true"
ssh ${REMOTE_HOST_B} "sh /data/sh/check_lessie_agents_8002.sh"
"""
}
}
stage('恢复B流量') {
steps {
echo "恢复实例B的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_B} ${PORT_B} up'"
echo "实例 B 部署完成"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,45 @@
#!/bin/bash
# Nginx 后端服务器上下线脚本
# 用法: set_backend_status.sh <ip> <port> <action>
# 示例:
# set_backend_status.sh 10.0.0.5 7001 down
# set_backend_status.sh 10.0.0.5 7001 up
IP=$1
PORT=$2
ACTION=$3 # down / up
NGINX_CONFIG="/data/tengine/vhosts/s1.jennie.im.conf"
BACKUP_CONFIG="${NGINX_CONFIG}.backup.$(date +%F_%T).bak"
# 参数检查
if [ -z "$IP" ] || [ -z "$PORT" ] || [ -z "$ACTION" ]; then
echo "用法: $0 <ip> <port> <action> (action: down/up)"
exit 1
fi
# 备份
cp -f "$NGINX_CONFIG" "$BACKUP_CONFIG" || {
echo "备份配置失败"
exit 1
}
# 修改
if [ "$ACTION" == "down" ]; then
sed -i "s/\(server[[:space:]]\+$IP:$PORT[[:space:]]*\)weight=[0-9]\+\(.*\)/\1down\2/" "$NGINX_CONFIG"
elif [ "$ACTION" == "up" ]; then
sed -i "s/\(server[[:space:]]\+$IP:$PORT[[:space:]]*\)down\(.*\)/\1weight=10\2/" "$NGINX_CONFIG"
else
echo "无效的 action: $ACTION"
exit 1
fi
# 验证 & 重载
if nginx -t; then
nginx -s reload
echo "✅ 已将 $IP:$PORT 设置为 $ACTION"
rm -f "$BACKUP_CONFIG"
else
echo "❌ 配置检查失败,回滚..."
cp -f "$BACKUP_CONFIG" "$NGINX_CONFIG"
exit 1
fi

View File

@@ -0,0 +1,48 @@
#!/bin/bash
# 设置后端服务器权重的脚本
# 使用方法: set_s1_backend_weight.sh <port> <weight>
# 示例: set_s1_backend_weight.sh 8000 down/up
#/data/tengine/vhosts/s1.jennie.im.conf
# Tengine 权重设置脚本(使用 down 参数)
PORT=$1
ACTION=$2 # 可选值: "down" 或 "up"
NGINX_CONFIG="/data/tengine/vhosts/s1.jennie.im.conf"
BACKUP_CONFIG="${NGINX_CONFIG}.bak"
# 检查参数
if [ -z "$PORT" ] || [ -z "$ACTION" ]; then
echo "用法: $0 <port> <action> (action 可选值: down/up)"
exit 1
fi
# 备份配置
cp -f $NGINX_CONFIG $BACKUP_CONFIG || {
echo "备份配置失败"
exit 1
}
# 根据 action 修改配置
if [ "$ACTION" == "down" ]; then
# 临时下线服务器(使用 down 参数)
sed -i "s/\(server 10.0.0.5:$PORT\s*\)weight=[0-9]*\(.*\)/\1down\2/g" $NGINX_CONFIG
elif [ "$ACTION" == "up" ]; then
# 恢复服务器(移除 down 参数,恢复默认权重)
sed -i "s/\(server 10.0.0.5:$PORT\s*\)down\(.*\)/\1weight=10\2/g" $NGINX_CONFIG
else
echo "无效的 action 参数: $ACTION"
exit 1
fi
# 验证配置并重载
nginx -t && nginx -s reload || {
echo "配置错误,恢复原配置"
cp -f $BACKUP_CONFIG $NGINX_CONFIG
exit 1
}
echo "配置生效:端口 $PORT 已设置为 $ACTION"
rm -f $BACKUP_CONFIG

View File

@@ -0,0 +1,121 @@
# -------------------------
#!/bin/bash
# 等待指定端口的连接数连续3次为0每次间隔5秒
# 使用方法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300最多等待300秒
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=5 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
# 检测当前连接数
CONNECTIONS=$(netstat -anp | grep :$PORT | grep -w ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
# 达到3次连续成功退出
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
# 连接数不为0重置计数器
SUCCESS_COUNT=0
echo "连接数不为0重置连续成功计数"
fi
# 每次检测后间隔5秒
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo " "
sleep $CHECK_INTERVAL
done
echo "超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0当前连接数: $CONNECTIONS"
exit 1
# ---------超时就调用kill杀掉----------
#!/bin/bash
# /data/sh/wait_s1_for_connections.sh
# 等待指定端口的连接数连续 N 次为0否则超时后直接杀死进程
# 用法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=5 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
KILL_SCRIPT="/data/sh/kill_lessie_sourcing_agents.sh"
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
CONNECTIONS=$(netstat -anp 2>/dev/null | grep :$PORT | grep -w ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "✅ 已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
SUCCESS_COUNT=0
echo "⚠️ 连接数不为0重置连续成功计数"
fi
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo ""
sleep $CHECK_INTERVAL
done
echo "⏰ 超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0"
echo "尝试杀死该端口的进程..."
if [ -x "$KILL_SCRIPT" ]; then
sh $KILL_SCRIPT $PORT
else
echo "❌ 错误:未找到 $KILL_SCRIPT,无法杀死进程"
exit 1
fi
exit 1

View File

@@ -0,0 +1,600 @@
pipeline {
agent any
environment {
CODE_BRANCH = "dev"
LOCKHOST_IP = "192.168.70.15"
LOCKHOST_PROJECT_PATH = "/root/cdx/scalelink-frontend"
WEB_HOST_IP = "43.153.21.64"
WEB_HOST_PROJECT_PATH = "/data/webapps/lessie_official_web"
}
stages {
stage('拉取代码') {
steps {
git branch: "${CODE_BRANCH}",
credentialsId: 'fly_gitlab_auth',
url: 'http://172.24.16.20/web/scalelink-frontend.git'
}
}
stage('同步到本地机器') {
steps {
sh """
ssh ${LOCKHOST_IP} 'rm -rf ${LOCKHOST_PROJECT_PATH}/"*"' &&
rsync -az ${WORKSPACE}/ ${LOCKHOST_IP}:${LOCKHOST_PROJECT_PATH}/
"""
}
}
stage('依赖和构建') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
cd ${LOCKHOST_PROJECT_PATH}/projects/lessie &&
pnpm install --force && pnpm build &&
tar -czf output.tar.gz .output
\\""
"""
}
}
stage('上传产物') {
steps {
sh """
ssh ${LOCKHOST_IP} "bash -lc \\"
scp -r ${LOCKHOST_PROJECT_PATH}/projects/lessie/output.tar.gz 43.153.21.64:${WEB_HOST_PROJECT_PATH}/
\\""
"""
}
}
stage('启动') {
steps {
sh """
ssh ${WEB_HOST_IP} '
cd ${WEB_HOST_PROJECT_PATH} && pm2 list &&
pm2 delete lessie-official-web &&
tar -zxf output.tar.gz &&
pm2 start .output/server/index.mjs --name lessie-official-web --output ./nuxt-out.log --error ./nuxt-error.log
'
"""
}
}
}
}
pipeline {
agent any
environment {
CODE_BRANCH = "dev"
WEB_HOST_IP = "49.51.46.148"
WEB_HOST_PROJECT_PATH = "/data/webapps/lessie_official_web"
}
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true -pl flymoon-seo -am"
}
}
stage('jar A下线') {
steps {
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_seo.sh'"
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-seo/target/flymoon-seo.jar 192.168.70.18:/data/webapps/flymoon_seo/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 192.168.70.18:/data/webapps/flymoon_seo/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 192.168.70.18:/data/webapps/flymoon_seo/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 192.168.70.18:/data/webapps/flymoon_seo/
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 192.168.70.18 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/flymoon_seo/flymoon-seo.jar --spring.profiles.active=sit >/data/webapps/flymoon_seo/nohup.out 2>&1 &' "
}
}
}
}
# ------------------------7-22备份---------------
pipeline {
agent any
environment {
REMOTE_HOST = "43.130.56.138" // 远程服务器 {params.REMOTE_HOST}
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/lessie_sourcing_agents/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh """
ssh ${REMOTE_HOST} '
conda activate search
source ${VENV_DIR}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=sit python /data/webapps/lessie_sourcing_agents/server.py > /data/webapps/lessie_sourcing_agents/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# ------------------------7-22备份---------------
# ------------------------7-22 滚动发布实验---------------
pipeline {
agent any
environment {
REMOTE_HOST = "43.130.56.138" // 远程服务器 {params.REMOTE_HOST}
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/lessie_sourcing_agents/venv" // 远程虚拟环境目录
REMOTE_PROJECT_PATH_02 = "/data/webapps/lessie_sourcing_agents_02"
VENV_DIR_02 = "/data/webapps/lessie_sourcing_agents_02/venv"
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('进程A下线') {
steps {
echo("下线A")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
}
}
stage('工程A同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装A依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程A启动') {
steps {
echo("启动A")
sh """
ssh ${REMOTE_HOST} '
conda activate search
source ${VENV_DIR}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH}/server.py > ${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
'
"""
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/check_lessie_agents_8000.sh' "
}
}
stage('进程B下线') {
steps {
echo("下线B")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents_8002.sh'"
}
}
stage('工程B同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH_02}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH_02}/
"""
}
}
stage('安装B依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH_02} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_02}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程B启动') {
steps {
echo("启动B")
sh """
ssh ${REMOTE_HOST} '
conda activate search
mv ${REMOTE_PROJECT_PATH_02}/server.py ${REMOTE_PROJECT_PATH_02}/server8002.py
source ${VENV_DIR_02}/bin/activate
TIMESTAMP_02=\$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH_02}/server8002.py --port 8002 > ${REMOTE_PROJECT_PATH_02}/logs/lessie_sourcing_agents_\${TIMESTAMP_02}.log 2>&1 &
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# ------------------------7-22 滚动发布实验---------------
# ------------------------7-28 滚动发布 等待连接数为0 再kill ---------------
# 目标服务器脚本
set_s1_backend_weight.sh
wait_s1_for_connections.sh
# ------------------------7-28 滚动发布 等待连接数为0再kill 实验---------------
# ==============9-9双台python==============
pipeline {
agent any
environment {
REMOTE_HOST_A = "43.130.53.202" // 远程服务器A
REMOTE_PROJECT_PATH_A = "/data/webapps/lessie_sourcing_agents" // 远程 Python 项目路径
VENV_DIR_A = "/data/webapps/lessie_sourcing_agents/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('进程A下线') {
steps {
echo("下线A")
sh "ssh ${REMOTE_HOST_A} 'sh /data/sh/kill_lessie_sourcing_agents_8002.sh'"
}
}
stage('工程A同步') {
steps {
echo("同步A")
sh """
ssh ${REMOTE_HOST_A} 'mkdir -p ${REMOTE_PROJECT_PATH_A}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
"""
}
}
stage('安装A依赖') {
steps {
echo("依赖A")
sh """
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_A}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程A启动') {
steps {
echo("启动A")
sh """
ssh ${REMOTE_HOST_A} '
conda activate search
source ${VENV_DIR_A}/bin/activate
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=s1 python ${REMOTE_PROJECT_PATH_A}/server.py --port 8002 > ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh ${REMOTE_HOST_A} 'sh /data/sh/check_lessie_agents_8002.sh' "
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# ========================9-9双台python==============================
pipeline {
agent any
environment {
REMOTE_HOST_A = "43.130.56.138"
NGINX_HOST_B = "43.130.53.202"
NGINX_HOST = "49.51.46.148"
REMOTE_PROJECT_PATH_A = "/data/webapps/lessie_sourcing_agents"
VENV_DIR_A = "/data/webapps/lessie_sourcing_agents/venv"
REMOTE_PROJECT_PATH_B = "/data/webapps/lessie_sourcing_agents"
VENV_DIR_B = "/data/webapps/lessie_sourcing_agents/venv"
CONDA_PATH = "/root/miniconda3/bin/conda"
NGINX_PY_backend_A = "10.0.0.5"
NGINX_PY_backend_B = "10.0.0.13"
PORT_A = "8000"
PORT_B = "8002"
CONNECTION_TIMEOUT = "600" // 等待连接关闭的超时时间(秒)
NGINX_RELOAD_SCRIPT = "/data/sh/set_s1_backend_weight_new.sh" // 设置nginx后端组up/down
WAIT_CONNECTIONS_SCRIPT = "/data/sh/wait_s1_for_connections.sh" // 等待连接数变为0
CHECK_STATUS_SCRIPT = "/data/sh/check_s1_backend_status.sh" // 检查后端组状态
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('A脱离后端组') {
steps {
echo "将实例A的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_A} ${PORT_A} down'"
echo "等待实例A的现有连接关闭"
sh "ssh ${REMOTE_HOST_A} 'sh ${WAIT_CONNECTIONS_SCRIPT} ${PORT_A} ${CONNECTION_TIMEOUT}'"
}
}
stage('A下线&同步') {
steps {
echo("下线A后同步A")
sh "ssh ${REMOTE_HOST_A} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
sh """
ssh ${REMOTE_HOST_A} 'mkdir -p ${REMOTE_PROJECT_PATH_A}'
rsync -avz --exclude 'venv' --exclude '.git' ${WORKSPACE}/ ${REMOTE_HOST_A}:${REMOTE_PROJECT_PATH_A}/
"""
}
}
stage('A依赖&启动') {
steps {
echo("A依赖&启动")
sh """
ssh ${REMOTE_HOST_A} '
cd ${REMOTE_PROJECT_PATH_A}
source ~/.bashrc
conda activate search
source ${VENV_DIR_A}/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=s1 python ${REMOTE_PROJECT_PATH_A}/server.py --port 8002 > ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "sleep 5"
sh """
ssh ${REMOTE_HOST_A} "head -n 300 ${REMOTE_PROJECT_PATH_A}/logs/lessie_sourcing_agents_latest.log | grep -i 'error' || true"
ssh ${REMOTE_HOST_A} "sh /data/sh/check_lessie_agents_8000.sh"
"""
}
}
stage('恢复A流量') {
steps {
echo "恢复实例A的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_A} ${PORT_A} up'"
echo "实例 A 部署完成"
}
}
stage('截B流量') {
steps {
echo "将实例B的权重设置为down停止接收新连接"
sh "ssh ${NGINX_HOST} 'sh ${NGINX_RELOAD_SCRIPT} ${NGINX_PY_backend_B} ${PORT_B} down'"
echo "等待实例B的现有连接关闭"
sh "ssh ${REMOTE_HOST} '${WAIT_CONNECTIONS_SCRIPT} ${PORT_B} ${CONNECTION_TIMEOUT}'"
}
}
stage('B下线&同步') {
steps {
echo("B下线&同步")
sh "ssh ${REMOTE_HOST_B} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
sh """
ssh ${REMOTE_HOST_B} 'mkdir -p ${REMOTE_PROJECT_PATH_B}'
rsync -avz --exclude 'venv' --exclude '.git' ${WORKSPACE}/ ${REMOTE_HOST_B}:${REMOTE_PROJECT_PATH_B}/
"""
}
}
stage('B依赖&启动') {
steps {
echo("B依赖&启动")
sh """
ssh ${REMOTE_HOST_B} '
cd ${REMOTE_PROJECT_PATH_B} &&
source ~/.bashrc &&
conda activate search &&
source ${VENV_DIR_B}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
LOGFILE="${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log"
nohup env APP_ENV=s1 python ${REMOTE_PROJECT_PATH_B}/server.py --port 8002 > ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
ln -sf "\$LOGFILE" ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_latest.log
'
"""
}
}
stage('探测B服务 ') {
steps {
echo("探测B服务")
sh "sleep 5"
sh """
ssh ${REMOTE_HOST_B} "head -n 300 ${REMOTE_PROJECT_PATH_B}/logs/lessie_sourcing_agents_latest.log | grep -i 'error' || true"
ssh ${REMOTE_HOST_B} "sh /data/sh/check_lessie_agents_8002.sh"
"""
}
}
stage('恢复B流量') {
steps {
echo "恢复实例B的流量"
sh "sleep 5"
sh "ssh ${NGINX_HOST} '${NGINX_RELOAD_SCRIPT_B} ${PORT_B} up'"
echo "实例 B 部署完成"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,78 @@
# 7001端口
pipeline {
agent any
environment {
REMOTE_HOST = "43.159.145.241" // 远程服务器 {params.REMOTE_HOST}
REMOTE_PROJECT_PATH = "/data/webapps/lessie_sourcing_agents" // 远程 Python 项目路径
VENV_DIR = " /data/webapps/lessie_sourcing_agents/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/lessie-sourcing-agents.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_lessie_sourcing_agents.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate lessie &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
sh """
ssh ${REMOTE_HOST} '
mkdir -p ${REMOTE_PROJECT_PATH}/logs
conda activate lessie
TIMESTAMP=\$(date +"%Y%m%d_%H%M%S")
nohup env APP_ENV=sit python ${REMOTE_PROJECT_PATH}/server.py --port 7001 > ${REMOTE_PROJECT_PATH}/logs/lessie_sourcing_agents_\${TIMESTAMP}.log 2>&1 &
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,37 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true -pl flymoon-seo -am"
}
}
stage('jar A下线') {
steps {
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_seo.sh'"
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-seo/target/flymoon-seo.jar 192.168.70.18:/data/webapps/flymoon_seo/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 192.168.70.18:/data/webapps/flymoon_seo/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 192.168.70.18:/data/webapps/flymoon_seo/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 192.168.70.18:/data/webapps/flymoon_seo/
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 192.168.70.18 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/flymoon_seo/flymoon-seo.jar --spring.profiles.active=sit >/data/webapps/flymoon_seo/nohup.out 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,48 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_email.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -Dmaven.test.skip=true -Pcn"
}
}
stage('jar 下线') {
steps {
echo ("下线")
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_email.sh' "
}
}
stage('jar 同步') {
steps {
echo ("同步")
sh """
//scp ${WORKSPACE}/start/target/start-0.0.1-SNAPSHOT.jar 192.168.70.18:/data/webapps/fly-moon-email_v2/fly-moon-email-test.jar
"""
}
}
stage('jar 启动') {
steps {
echo ("启动")
// sh "ssh 192.168.70.18 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-email/fly-moon-email-test.jar -Xmx8g --spring.profiles.active=sit-cn >/dev/null 2>&1 &' "
sh """
ssh 192.168.70.18 '
nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly_moon_email/fly-moon-email-prod.jar --spring.profiles.active=sit-cn >/dev/null 2>&1 &
'
"""
}
}
}
}

View File

@@ -0,0 +1,38 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_partner.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_partner_sit.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-partner.jar 192.168.70.18:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 192.168.70.18 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=sit >/data/webapps/fly-moon-partner/nohup.out 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,53 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_agent.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true"
}
}
stage('同步新jar') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-agent.jar 192.168.70.18:/data/webapps/flymoon_agent/flymoon-agent-new.jar
"""
}
}
stage('替换旧jar') {
steps {
sh """
ssh 192.168.70.18 '
cd /data/webapps/flymoon_agent/ &&
if [ -f flymoon-agent.jar ]; then
cp flymoon-agent.jar flymoon-agent-backup.jar
fi &&
mv flymoon-agent-new.jar flymoon-agent.jar
'
"""
}
}
stage('jar A下线') {
steps {
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_agent.sh'"
}
}
stage('jar A启动') {
steps {
sh """
ssh 192.168.70.18 '
nohup /data/jdk-21.0.7/bin/java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=sit >/data/webapps/flymoon_agent/nohup.out 2>&1 &
'
"""
}
}
}
}

View File

@@ -0,0 +1,155 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true"
}
}
stage('jar A下线') {
steps {
sh "ssh 192.168.60.16 'sh /data/sh/kill_fly_moon_task_sit.sh'"
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-task/target/flymoon-task.jar 192.168.60.16:/data/webapps/fly-moon-back/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 192.168.60.16:/data/webapps/fly-moon-back/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 192.168.60.16:/data/webapps/fly-moon-back/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 192.168.60.16:/data/webapps/fly-moon-back/
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 192.168.60.16 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-back/flymoon-task.jar --spring.profiles.active=sit >/dev/null 2>&1 &' "
}
}
}
}
git branch: 'release', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_monitor.git'
sh "cd ${WORKSPACE}/ && mvn clean install -Dmaven.sit.skip=true"
#cat kill_fly_moon_monitor.sh
ps axjf|grep monitor-0.0.1|grep -v grep |awk '{print "kill ",$2}'|sh -
#cat kill_fly_moon_email.sh
axjf|grep fly_moon_email|grep -v grep |awk '{print "kill -9 ",$2}'|sh -
#cat kill_fly_moon_partner_sit.sh
ps axjf|grep flymoon-partner|grep -v grep |awk '{print "kill -9 ",$2}'|sh -
#cat kill_fly_moon_sit.sh
ps axjf|grep flymoon-admin|grep -v grep |awk '{print "kill ",$2}'|sh -
#cat kill_fly_moon_task_sit.sh
ps axjf|grep flymoon-task|grep -v grep |awk '{print "kill ",$2}'|sh -
#cat kill_fly_moon_jenniefy.sh
ps axjf|grep flymoon-jenniefy|grep -v grep |awk '{print "kill -9 ",$2}'|sh -
#------------------------------------------------------------------------------------------------------------
#sit的
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
#sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true"
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true -pl flymoon-jenniefy -am"
}
}
stage('jar A下线') {
steps {
sh "ssh 192.168.60.16 'sh /data/sh/kill_fly_moon_jenniefy.sh'"
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-jenniefy/target/flymoon-jenniefy.jar 192.168.60.16:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 192.168.60.16:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 192.168.60.16:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 192.168.60.16:/data/webapps/flymoon_jenniefy/
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 192.168.60.16 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/flymoon_jenniefy/flymoon-jenniefy.jar --spring.profiles.active=sit >/data/webapps/flymoon_jenniefy/nohup.out 2>&1 &' "
}
}
}
}
#------------------------------------------------------------------------------------------------------------
#test的
#172.24.16.13
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P test -Dmaven.test.skip=true -pl flymoon-jenniefy -am"
}
}
stage('jar A下线') {
steps {
sh "ssh 172.24.16.13 'sh /data/sh/kill_fly_moon_jenniefy.sh'"
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-jenniefy/target/flymoon-jenniefy.jar 172.24.16.13:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.13:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.13:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.13:/data/webapps/flymoon_jenniefy/
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 172.24.16.13 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/flymoon_jenniefy/flymoon-jenniefy.jar --spring.profiles.active=sit >/data/webapps/flymoon_jenniefy/nohup.out 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,39 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_payment.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.sit.skip=true"
}
}
stage('jar A下线') {
steps {
echo("1")
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_payment.sh'"
}
}
stage('jar A同步') {
steps {
echo("2")
sh """
scp ${WORKSPACE}/target/flymoon-payment.jar 192.168.70.18:/data/webapps/flymoon_payment/
"""
}
}
stage('jar A启动') {
steps {
echo("3")
sh """ssh 192.168.70.18 'nohup /data/jdk-21.0.7/bin/java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=sit >/data/webapps/flymoon_agent/nohup.out 2>&1 &' """
}
}
}
}

View File

@@ -0,0 +1,138 @@
pipeline {
agent any
environment {
REMOTE_HOST = "43.159.145.241" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/test/influencer_search" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/test/influencer_search/venv" // 远程虚拟环境目录
START_SCRIPT = "/data/webapps/test/influencer_search/start.sh" // 远程启动脚本
}
stages {
stage('Checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/influencer-search-demo.git'
}
}
stage('进程下线') {
steps {
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_influencer_search_agent.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
if [ ! -d "${VENV_DIR}" ]; then
python3 -m venv ${VENV_DIR}
fi &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
sh "ssh ${REMOTE_HOST} 'nohup ${START_SCRIPT} > /data/webapps/test/influencer_search/nohup.out 2>&1 &'"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
# ------------------------------------------------------------
pipeline {
agent any
environment {
REMOTE_HOST = "192.168.60.16" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/py/" // 远程 Python 项目路径
VENV_DIR = "/data/python_venv/myenv/" // 远程虚拟环境目录
// START_SCRIPT = "/data/webapps/test/influencer_search/start.sh" // 远程启动脚本
}
stages {
stage('Checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/python/influencer-search-demo.git'
}
}
stage('进程下线') {
steps {
sh "ssh ${REMOTE_HOST} 'sh /data/sh/kill_influencer_search_agent.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
if [ ! -d "${VENV_DIR}" ]; then
python3 -m venv ${VENV_DIR}
fi &&
source ${VENV_DIR}/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
// sh "ssh ${REMOTE_HOST} 'nohup ${START_SCRIPT} > /data/webapps/test/influencer_search/nohup.out 2>&1 &'"
echo("启动脚本")
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,67 @@
cd /data/.jenkins/workspace/sit_scalelink_frontend
#临时切换Jenkins机器上的node到20版本
export PATH=/data/node-v20.15.0/bin:$PATH
node -v
npm -v
pnpm -v
rm -rf dist/
rm -rf node_modules/
#pnpm install
pnpm install --registry=http://mirrors.cloud.tencent.com/npm/ --force --no-frozen-lockfile
pnpm run build-sit:service_provider
chmod -R 755 projects/service_provider/dist/
rsync -avzP --delete projects/service_provider/dist/* 192.168.60.16:/data/tengine/html/scalelink_frontend/dist
sit_jenniefy_web
cd /data/.jenkins/workspace/sit_jenniefy_web
export PATH=/data/node-v20.15.0/bin:$PATH
node -v
npm -v
pnpm -v
pnpm install --registry=http://mirrors.cloud.tencent.com/npm/ --force
pnpm run dev:jennie
chmod -R 755 projects/jennie/dist/
rsync -avzP --delete projects/jennie/dist/* 192.168.60.16:/data/tengine/html/sit_jenniefy_web/dist
cd /data/.jenkins/workspace/sit_jenniefy_web
export PATH=/data/node-v20.15.0/bin:$PATH
node -v
npm -v
pnpm -v
cd /data/.jenkins/workspace/sit_jenniefy_web/projects/jennie/
rm -rf dist/
rm -rf node_modules/
pnpm install --registry=http://mirrors.cloud.tencent.com/npm/ --force
pnpm run build
chmod -R 755 dist/
rsync -avzP --delete dist/* 192.168.60.16:/data/tengine/html/jennie_web/dist
testpartner.flytothmoon.online
sitjenniefy.flytothmoon.online
cd /data/.jenkins/workspace/sit_jenniefy_web
export PATH=/data/node-v20.15.0/bin:$PATH
node -v
npm -v
pnpm -v
#cd /data/.jenkins/workspace/sit_jenniefy_web/projects/jennie/
rm -rf dist/
rm -rf node_modules/
pnpm install --registry=http://mirrors.cloud.tencent.com/npm/ --force
pnpm run build:jennie
chmod -R 755 projects/jennie/dist/
rsync -avzP --delete projects/jennie/dist/* 192.168.60.16:/data/tengine/html/jennie_web/dist

View File

@@ -0,0 +1,53 @@
pipeline {
agent any
environment {
CODE_BRANCH = "dev"
LOCKHOST_IP = "192.168.70.15"
LOCKHOST_PROJECT_PATH = "/data/webapps/lessie-oficial" // 本地机器项目路径
}
stages {
stage('拉取代码') {
steps {
git branch: "${CODE_BRANCH}",
credentialsId: 'fly_gitlab_auth',
url: 'http://172.24.16.20/web/scalelink-frontend.git'
}
}
stage('同步到本地机器') {
steps {
sh """
rsync -avz ${WORKSPACE}/ ${LOCKHOST_IP}:${LOCKHOST_PROJECT_PATH}/
"""
}
}
stage('依赖和构建') {
steps {
sh """
ssh ${LOCKHOST_IP} 'bash -lc "
cd ${LOCKHOST_PROJECT_PATH}/projects/lessie &&
bash &&
pnpm install &&
pnpm build
"'
"""
}
}
stage('启动') {
steps {
sh """
ssh ${LOCKHOST_IP} 'bash -lc "
cd ${LOCKHOST_PROJECT_PATH}/projects/lessie &&
bash &&
pm2 list && pm2 delete lessie-official-web &&
pm2 start .output/server/index.mjs --name lessie-official-web --output ./nuxt-out.log --error ./nuxt-error.log &&
pm2 list
"'
"""
}
}
}
}

View File

@@ -0,0 +1,36 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_partner.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P test -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.13 'sh /data/sh/kill_fly_moon_partner_test.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-partner.jar 172.24.16.13:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.13 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=test >/data/webapps/fly-moon-partner/nohup.out 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,82 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/flymoon-admin.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P test -Dmaven.test.skip=true"
}
}
stage('jar A下线') {
steps {
sh "ssh 172.24.16.13 'sh /data/sh/kill_fly_moon_test.sh' "
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-admin.jar 172.24.16.13:/data/webapps/fly-moon-back/flymoon-admin.jar
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 172.24.16.13 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-back/flymoon-admin.jar --spring.profiles.active=test >/dev/null 2>&1 &' "
}
}
}
}
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'sit', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/flymoon-admin.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P sit -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
echo("下线")
sh "ssh 192.168.70.18 'sh /data/sh/kill_fly_moon_sit.sh' "
}
}
stage('jar 同步') {
steps {
echo("同步")
sh """
scp ${WORKSPACE}/target/flymoon-admin.jar 192.168.70.18:/data/webapps/fly-moon-back/flymoon-admin.jar
"""
}
}
stage('jar 启动') {
steps {
echo("启动")
sh "ssh 192.168.70.18 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-back/flymoon-admin.jar --spring.profiles.active=sit >/data/webapps/fly-moon-back/nohup.out 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,53 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'test', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_agent.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P test -Dmaven.test.skip=true"
}
}
stage('同步新jar') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-agent.jar 172.24.16.13:/data/webapps/flymoon_agent/flymoon-agent-new.jar
"""
}
}
stage('替换旧jar') {
steps {
sh """
ssh 172.24.16.13 '
cd /data/webapps/flymoon_agent/ &&
if [ -f flymoon-agent.jar ]; then
cp flymoon-agent.jar flymoon-agent-backup.jar
fi &&
mv flymoon-agent-new.jar flymoon-agent.jar
'
"""
}
}
stage('jar A下线') {
steps {
sh "ssh 172.24.16.13 'sh /data/sh/kill_fly_moon_agent.sh'"
}
}
stage('jar A启动') {
steps {
sh """
ssh 172.24.16.13 '
nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=test >/data/webapps/flymoon_agent/nohup.out 2>&1 &
'
"""
}
}
}
}

View File

@@ -0,0 +1,70 @@
pipeline {
agent any
environment {
// REMOTE_HOST = "" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/test_tk_search_crawler" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/test_tk_search_crawler/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/tk_search_crawler.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/kill_tk_search_crawler.sh'"
}
}
stage('工程同步') {
steps {
sh """
ssh ${params.REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${params.REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${params.REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate py310 &&
source ${VENV_DIR}/bin/activate &&
pip install -r requirements.txt &&
npm install crypto
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
# sh "ssh ${params.REMOTE_HOST} 'sh /data/sh/run_tk_search_crawler.sh'"
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
nohup python tk_search.py > output.log 2>&1 &

View File

@@ -0,0 +1,167 @@
pipeline {
agent any
environment {
REMOTE_HOST = "49.51.46.148" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/test_tk_shop_crawler" // 远程 Python 项目路径
// VENV_DIR = "/data/webapps/test_yt_search_crawler/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/tk_shop_crawler.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh """
ssh ${REMOTE_HOST} '
sh /data/sh/kill_test_tk_shop_crawler_tiktok_sign_server.sh &&
sh /data/sh/kill_test_tk_shop_crawler.sh
'
"""
}
}
stage('工程同步') {
steps {
sh """
ssh ${REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate py310 &&
pip install --upgrade pip &&
npm install crypto &&
pip install -r requirements.txt
'
"""
}
}
stage('工程启动') {
steps {
echo("启动")
// sh "ssh ${REMOTE_HOST} 'nohup env PYTHONPATH=/data/webapps/influencer_search_agent python3 -m dialogue.influencer_search > /data/webapps/influencer_search_agent/nohup.out 2>&1 &'"
// sh "ssh ${REMOTE_HOST} 'sh /data/sh/run_prod_nano_crawler.sh'"
sh """
ssh ${REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
sh /data/sh/run_tk_shop_crawler_tiktok_sign_server.sh &&
sh /data/sh/run_tk_shop_crawler.sh
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}
--------------- ↑ 原本 ↑ ------
pipeline {
agent any
environment {
// REMOTE_HOST = "" // 远程服务器
REMOTE_PROJECT_PATH = "/data/webapps/test_tk_shop_crawler" // 远程 Python 项目路径
VENV_DIR = "/data/webapps/test_tk_shop_crawler/venv" // 远程虚拟环境目录
CONDA_PATH = "/root/miniconda3/bin/conda" // 修改为实际 Conda 安装路径
}
stages {
stage('Checkout 代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/tk_shop_crawler.git'
}
}
stage('进程下线') {
steps {
echo("下线")
sh """
ssh ${params.REMOTE_HOST} '
sh /data/sh/kill_test_tk_shop_crawler_tiktok_sign_server.sh &&
sh /data/sh/kill_test_tk_shop_crawler.sh
'
"""
}
}
stage('工程同步') {
steps {
sh """
ssh ${params.REMOTE_HOST} 'mkdir -p ${REMOTE_PROJECT_PATH}'
rsync -avz --exclude 'venv' ${WORKSPACE}/ ${params.REMOTE_HOST}:${REMOTE_PROJECT_PATH}/
"""
}
}
stage('安装依赖') {
steps {
sh """
ssh ${params.REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
source ~/.bashrc &&
conda activate py310 &&
source ${VENV_DIR}/bin/activate &&
pip install -r requirements.txt &&
npm install crypto
'
"""
}
}
stage('工程启动') {
steps {
sh """
ssh ${params.REMOTE_HOST} '
cd ${REMOTE_PROJECT_PATH} &&
sh /data/sh/run_tk_shop_crawler_tiktok_sign_server.sh &&
sh /data/sh/run_tk_shop_crawler.sh
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,36 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'xxx', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_email.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -Dmaven.test.skip=true -Pcn"
}
}
stage('jar 下线') {
steps {
sh "ssh 43.153.98.191 'sh /data/sh/kill_fly_moon_email.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/start/target/start-0.0.1-SNAPSHOT.jar 43.153.98.191:/data/webapps/fly_moon_email_v2/fly-moon-email.jar
"""
}
}
stage('jar 启动') {
steps {
echo("jar 启动")
# sh "ssh 43.153.98.191 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly_moon_email_v2/fly-moon-email.jar -Xmx8g --spring.profiles.active=prod-cn >/dev/null 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,74 @@
### web
server.port=8080
server.servlet.context-path=/xxl-job-admin
### actuator
management.endpoints.web.base-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
spring.freemarker.settings.new_builtin_class_resolver=safer
### mybatis
mybatis.mapper-locations=classpath:/mapper/*Mapper.xml
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://10.0.0.4:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxl_job
spring.datasource.password=fdg4d!6s65J3xJy
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### xxl-job, email
spring.mail.host=smtp.feishu.cn
spring.mail.port=465
spring.mail.username=rd@moonlanding.cc
spring.mail.from=rd@moonlanding.cc
spring.mail.password=XeoihU4FP3Rp7R9F
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job, timeout
xxl.job.timeout=3
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30
### xxl-sso
xxl-sso.token.key=xxl_job_login_token
xxl-sso.token.timeout=604800000
xxl-sso.client.excluded.paths=
xxl-sso.client.login.path=/auth/login

View File

@@ -0,0 +1,37 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -Dmaven.test.skip=true -Dgpg.skip=true"
}
}
stage('jar同步') {
steps {
sh """
scp ${WORKSPACE}/xxl-job-admin/target/xxl-job-admin-3.2.0.jar 43.153.21.64:/data/webapps/xxl-job/xxl-job-admin.jar
"""
}
}
stage('jar启动') {
steps {
sh "ssh 43.153.21.64 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/xxl-job/xxl-job-admin.jar > /data/webapps/xxl-job/logs/xxl-job-admin.log 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,37 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.prod.skip=true -pl flymoon-agent -am"
}
}
stage('jar A下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_jenniefy.sh'"
}
}
stage('jar A同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-agent/target/flymoon-agent.jar 172.24.16.10:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.10:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.10:/data/webapps/flymoon_jenniefy/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.10:/data/webapps/flymoon_jenniefy/
"""
}
}
stage('jar A启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/flymoon_jenniefy/flymoon-agent.jar --spring.profiles.active=prod >/data/webapps/flymoon_jenniefy/nohup.out 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,36 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'release', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_task.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-task/target/flymoon-task.jar 172.24.16.10:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.10:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.10:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.10:/data/webapps/fly-moon-task/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-task/flymoon-task.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,266 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_agent.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar A同步') {
steps {
echo("A同步")
sh """
scp ${WORKSPACE}/target/flymoon-agent.jar 172.24.16.10:/data/webapps/flymoon_agent/
"""
}
}
stage('jar A下线') {
steps {
echo("A下线")
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_agent.sh' "
}
}
stage('jar A启动') {
steps {
echo("A启动")
sh "ssh 172.24.16.10 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=prod >/data/webapps/flymoon_agent/nohup.out 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh 172.24.16.10 'sh /data/sh/check_flymoon_agent.sh' "
}
}
stage('jar B下线') {
steps {
echo("B下线")
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_agent.sh' "
}
}
stage('jar B同步') {
steps {
echo("B同步")
sh """
scp ${WORKSPACE}/target/flymoon-agent.jar 172.24.16.7:/data/webapps/flymoon_agent/
"""
}
}
stage('jar B启动') {
steps {
echo("B启动")
sh "ssh 172.24.16.7 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=prod >/data/webapps/flymoon_agent/nohup.out 2>&1 &' "
}
}
}
}
# ------------原本---------
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_agent.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar A下线') {
steps {
echo("A下线")
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_agent.sh' "
}
}
stage('jar A同步') {
steps {
echo("A同步")
sh """
scp ${WORKSPACE}/target/flymoon-agent.jar 172.24.16.10:/data/webapps/flymoon_agent/
"""
}
}
stage('jar A启动') {
steps {
echo("A启动")
sh "ssh 172.24.16.10 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=prod > /dev/null 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh 172.24.16.10 'sh /data/sh/check_flymoon_agent.sh' "
}
}
stage('jar B下线') {
steps {
echo("B下线")
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_agent.sh' "
}
}
stage('jar B同步') {
steps {
echo("B同步")
sh """
scp ${WORKSPACE}/target/flymoon-agent.jar 172.24.16.7:/data/webapps/flymoon_agent/
"""
}
}
stage('jar B启动') {
steps {
echo("B启动")
sh "ssh 172.24.16.7 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=prod > /dev/null 2>&1 &' "
}
}
}
}
# ============原本============
# ============更改============
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_agent.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar A同步') {
steps {
echo("A同步")
sh """
scp ${WORKSPACE}/flymoon-agent-api/target/flymoon-agent-api.jar 172.24.16.10:/data/webapps/flymoon_agent/flymoon-agent-api-new.jar
scp ${WORKSPACE}/flymoon-agent-provider/target/flymoon-agent.jar 172.24.16.10:/data/webapps/flymoon_agent/flymoon-agent-new.jar
"""
}
}
stage('jar B同步') {
steps {
echo("B同步")
sh """
scp ${WORKSPACE}/flymoon-agent-api/target/flymoon-agent-api.jar 172.24.16.7:/data/webapps/flymoon_agent/flymoon-agent-api-new.jar
scp ${WORKSPACE}/flymoon-agent-provider/target/flymoon-agent.jar 172.24.16.7:/data/webapps/flymoon_agent/flymoon-agent-new.jar
"""
}
}
stage('替换A旧jar') {
steps {
sh """
ssh 172.24.16.10 '
cd /data/webapps/flymoon_agent/ &&
if [ -f flymoon-agent.jar ]; then
cp flymoon-agent.jar flymoon-agent-backup.jar
fi &&
mv flymoon-agent-new.jar flymoon-agent.jar
'
"""
sh """
ssh 172.24.16.10 '
cd /data/webapps/flymoon_agent/ &&
if [ -f flymoon-agent-api.jar ]; then
cp flymoon-agent-api.jar flymoon-agent-api-backup.jar
fi &&
mv flymoon-agent-api-new.jar flymoon-agent-api.jar
'
"""
}
}
stage('jar A下线') {
steps {
echo("A下线")
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_agent.sh' "
}
}
stage('jar A启动') {
steps {
echo("A启动")
sh "ssh 172.24.16.10 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=prod > /dev/null 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
echo("探测A服务")
sh "ssh 172.24.16.10 'sh /data/sh/check_flymoon_agent.sh' "
}
}
stage('替换B旧jar') {
steps {
sh """
ssh 172.24.16.7 '
cd /data/webapps/flymoon_agent/ &&
if [ -f flymoon-agent.jar ]; then
cp flymoon-agent.jar flymoon-agent-backup.jar
fi &&
mv flymoon-agent-new.jar flymoon-agent.jar
'
"""
sh """
ssh 172.24.16.7 '
cd /data/webapps/flymoon_agent/ &&
if [ -f flymoon-agent-api.jar ]; then
cp flymoon-agent-api.jar flymoon-agent-api-backup.jar
fi &&
mv flymoon-agent-api-new.jar flymoon-agent-api.jar
'
"""
}
}
stage('jar B下线') {
steps {
echo("B下线")
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_agent.sh' "
}
}
stage('jar B启动') {
steps {
echo("B启动")
sh "ssh 172.24.16.7 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/flymoon_agent/flymoon-agent.jar --spring.profiles.active=prod > /dev/null 2>&1 &' "
}
}
}
}
# ============更改============

View File

@@ -0,0 +1,59 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_partner.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_partner.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-partner.jar 172.24.16.10:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/check_fly_moon_partner.sh' "
}
}
stage('jar B下线') {
steps {
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_partner.sh' "
}
}
stage('jar B同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-partner.jar 172.24.16.7:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar B启动') {
steps {
sh "ssh 172.24.16.7 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,64 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'master', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_partner.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-partner/target/flymoon-partner.jar 172.24.16.10:/data/webapps/fly-moon-partner/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.10:/data/webapps/fly-moon-partner/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.10:/data/webapps/fly-moon-partner/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.10:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/check_fly_moon_partner.sh' "
}
}
stage('jar B下线') {
steps {
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_partner.sh' "
}
}
stage('jar B同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-partner/target/flymoon-partner.jar 172.24.16.7:/data/webapps/fly-moon-partner/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.7:/data/webapps/fly-moon-partner/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.7:/data/webapps/fly-moon-partner/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.7:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar B启动') {
steps {
sh "ssh 172.24.16.7 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,59 @@
pipeline {
agent any
tools{
maven 'mvn3.8.8'
jdk 'jdk21'
}
stages {
stage('checkout 代码') {
steps {
git branch: 'release', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon_partner'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_partner.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-partner.jar 172.24.16.10:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/check_fly_moon_partner.sh' "
}
}
stage('jar B下线') {
steps {
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_partner.sh' "
}
}
stage('jar B同步') {
steps {
sh """
scp ${WORKSPACE}/target/flymoon-partner.jar 172.24.16.7:/data/webapps/fly-moon-partner/
"""
}
}
stage('jar B启动') {
steps {
sh "ssh 172.24.16.7 'nohup /data/jdk-21.0.7/bin/java -jar /data/webapps/fly-moon-partner/flymoon-partner.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,61 @@
pipeline {
agent any
stages {
stage('checkout 代码') {
steps {
git branch: 'release', credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/root/fly_moon.git'
}
}
stage('Maven 编译') {
steps {
sh "cd ${WORKSPACE}/ && mvn clean install -P prod -Dmaven.test.skip=true -pl flymoon-task -am"
}
}
stage('jar 下线') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/kill_fly_moon_task.sh' "
}
}
stage('jar 同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-task/target/flymoon-task.jar 172.24.16.10:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.10:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.10:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.10:/data/webapps/fly-moon-task/
"""
}
}
stage('jar 启动') {
steps {
sh "ssh 172.24.16.10 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-task/flymoon-task.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
stage('探测A服务 ') {
steps {
sh "ssh 172.24.16.10 'sh /data/sh/check_fly_moon_task.sh' "
}
}
stage('jar B下线') {
steps {
sh "ssh 172.24.16.7 'sh /data/sh/kill_fly_moon_task.sh' "
}
}
stage('jar B同步') {
steps {
sh """
scp ${WORKSPACE}/flymoon-task/target/flymoon-task.jar 172.24.16.7:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-common/target/flymoon-common.jar 172.24.16.7:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-framework/target/flymoon-framework.jar 172.24.16.7:/data/webapps/fly-moon-task/
scp ${WORKSPACE}/flymoon-system/target/flymoon-system.jar 172.24.16.7:/data/webapps/fly-moon-task/
"""
}
}
stage('jar B启动') {
steps {
sh "ssh 172.24.16.7 'nohup /data/jdk1.8.0_181/bin/java -jar /data/webapps/fly-moon-task/flymoon-task.jar --spring.profiles.active=prod >/dev/null 2>&1 &' "
}
}
}
}

View File

@@ -0,0 +1,36 @@
// 脚本式流水线完整结构示例(标注包含关系)
pipeline { // 1. 根容器:所有流水线逻辑的顶层包裹
agent any // 代理配置(指定执行环境)
stages { // 2. 阶段集合包含所有「stage」必须有且只能有1个
stage('构建') { // 3. 单个阶段包含「steps」或「script」至少1个可多个
steps { // 4. 步骤容器:直接包裹「具体执行命令」(如 sh、echo
echo "开始构建Go项目"
sh "go build -o app main.go" // 具体步骤执行shell命令
}
}
stage('部署实例A') { // 第二个阶段
steps {
script { // 5. 脚本块嵌套在「steps」内用于编写复杂逻辑如循环、判断
def targetHost = "192.168.1.100"
echo "向实例A发送优雅退出信号"
// 复杂逻辑轮询检查进程状态需用script包裹
def elapsed = 0
while (elapsed < 60) {
sh "ssh user@${targetHost} 'ps -ef | grep app | grep -v grep'"
sleep 2
elapsed += 2
}
}
// script外仍可写简单步骤
sh "scp app user@${targetHost}:/opt/app/" // 同步新产物
}
}
}
post { // 可选:流水线结束后执行的操作(如通知、清理)
success { echo "流水线执行成功!" }
failure { echo "流水线执行失败!" }
}
}