初始化提交
This commit is contained in:
64
jenkins/流水线配置/API 监控系统 - XXL-Job.conf
Normal file
64
jenkins/流水线配置/API 监控系统 - XXL-Job.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
222
jenkins/流水线配置/app_lessie_ai/app.lessie.ai.conf
Normal file
222
jenkins/流水线配置/app_lessie_ai/app.lessie.ai.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
# =================改造===============================
|
||||
206
jenkins/流水线配置/app_lessie_ai/app新的可选部署顺序py.conf
Normal file
206
jenkins/流水线配置/app_lessie_ai/app新的可选部署顺序py.conf
Normal 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 '✅ 所有选中的实例部署成功!'
|
||||
}
|
||||
|
||||
|
||||
|
||||
155
jenkins/流水线配置/app_lessie_ai/s1新的可选部署顺序py.conf
Normal file
155
jenkins/流水线配置/app_lessie_ai/s1新的可选部署顺序py.conf
Normal 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 '✅ 所有选中的实例部署成功!'
|
||||
}
|
||||
45
jenkins/流水线配置/app_lessie_ai/set_prod_py_backend_weight.sh
Normal file
45
jenkins/流水线配置/app_lessie_ai/set_prod_py_backend_weight.sh
Normal 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
|
||||
60
jenkins/流水线配置/app_lessie_ai/wait_prod_for_connections.sh
Normal file
60
jenkins/流水线配置/app_lessie_ai/wait_prod_for_connections.sh
Normal 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
|
||||
41
jenkins/流水线配置/feisu.conf
Normal file
41
jenkins/流水线配置/feisu.conf
Normal 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 &' """
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
38
jenkins/流水线配置/fly_moon_crawlSpider-syncData.conf
Normal file
38
jenkins/流水线配置/fly_moon_crawlSpider-syncData.conf
Normal 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 -
|
||||
27
jenkins/流水线配置/go_中转服务/check_port.sh
Normal file
27
jenkins/流水线配置/go_中转服务/check_port.sh
Normal 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
|
||||
170
jenkins/流水线配置/go_中转服务/prod_go_lessie_sourcing_api.conf
Normal file
170
jenkins/流水线配置/go_中转服务/prod_go_lessie_sourcing_api.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
97
jenkins/流水线配置/go_中转服务/s1_go_lessie_sourcing_api.conf
Normal file
97
jenkins/流水线配置/go_中转服务/s1_go_lessie_sourcing_api.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
97
jenkins/流水线配置/go_中转服务/s2_go_lessie_sourcing_api.conf
Normal file
97
jenkins/流水线配置/go_中转服务/s2_go_lessie_sourcing_api.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
76
jenkins/流水线配置/go_中转服务/send_stop_goapp.sh
Normal file
76
jenkins/流水线配置/go_中转服务/send_stop_goapp.sh
Normal 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"
|
||||
|
||||
45
jenkins/流水线配置/go_中转服务/set_prod_go_backend_weight.sh
Normal file
45
jenkins/流水线配置/go_中转服务/set_prod_go_backend_weight.sh
Normal 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
|
||||
264
jenkins/流水线配置/go_中转服务/wait_for_connections.sh
Normal file
264
jenkins/流水线配置/go_中转服务/wait_for_connections.sh
Normal 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
|
||||
135
jenkins/流水线配置/ins_search_crawler.conf
Normal file
135
jenkins/流水线配置/ins_search_crawler.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
66
jenkins/流水线配置/ins_update.conf
Normal file
66
jenkins/流水线配置/ins_update.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
75
jenkins/流水线配置/lessie-sourcing-agents.conf
Normal file
75
jenkins/流水线配置/lessie-sourcing-agents.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
64
jenkins/流水线配置/lessie_official_web.conf
Normal file
64
jenkins/流水线配置/lessie_official_web.conf
Normal 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 '部署失败,请检查日志 ❌'
|
||||
}
|
||||
}
|
||||
}
|
||||
70
jenkins/流水线配置/oversea_influencer_search_agent.conf
Normal file
70
jenkins/流水线配置/oversea_influencer_search_agent.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
162
jenkins/流水线配置/oversea_prod_lessie_official_web.conf
Normal file
162
jenkins/流水线配置/oversea_prod_lessie_official_web.conf
Normal 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
|
||||
'
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
1
jenkins/流水线配置/s1_jennie.im/check_lessie_agents_8000.sh
Normal file
1
jenkins/流水线配置/s1_jennie.im/check_lessie_agents_8000.sh
Normal file
@@ -0,0 +1 @@
|
||||
timeout 60 bash -c 'until nc -z localhost 8000; do echo "Port is not available. Sleeping..."; sleep 5; done;'
|
||||
1
jenkins/流水线配置/s1_jennie.im/check_lessie_agents_8002.sh
Normal file
1
jenkins/流水线配置/s1_jennie.im/check_lessie_agents_8002.sh
Normal file
@@ -0,0 +1 @@
|
||||
timeout 60 bash -c 'until nc -z localhost 8002; do echo "Port is not available. Sleeping..."; sleep 5; done;'
|
||||
13
jenkins/流水线配置/s1_jennie.im/check_s1_backend_status.sh
Normal file
13
jenkins/流水线配置/s1_jennie.im/check_s1_backend_status.sh
Normal 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
|
||||
33
jenkins/流水线配置/s1_jennie.im/check_server7001.sh
Normal file
33
jenkins/流水线配置/s1_jennie.im/check_server7001.sh
Normal 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
|
||||
625
jenkins/流水线配置/s1_jennie.im/s1_jennie_im.pipeline
Normal file
625
jenkins/流水线配置/s1_jennie.im/s1_jennie_im.pipeline
Normal 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状态!"
|
||||
}
|
||||
}
|
||||
155
jenkins/流水线配置/s1_jennie.im/s1_new.conf
Normal file
155
jenkins/流水线配置/s1_jennie.im/s1_new.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
45
jenkins/流水线配置/s1_jennie.im/set_s1_backend_weight_new.sh
Normal file
45
jenkins/流水线配置/s1_jennie.im/set_s1_backend_weight_new.sh
Normal 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
|
||||
48
jenkins/流水线配置/s1_jennie.im/set_s1_backend_weight_old.sh
Normal file
48
jenkins/流水线配置/s1_jennie.im/set_s1_backend_weight_old.sh
Normal 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
|
||||
121
jenkins/流水线配置/s1_jennie.im/wait_s1_for_connections.sh
Normal file
121
jenkins/流水线配置/s1_jennie.im/wait_s1_for_connections.sh
Normal 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
|
||||
600
jenkins/流水线配置/s1_jennie_im.conf
Normal file
600
jenkins/流水线配置/s1_jennie_im.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
78
jenkins/流水线配置/s2.jennie.im.conf
Normal file
78
jenkins/流水线配置/s2.jennie.im.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
37
jenkins/流水线配置/sit_fiymoon_seo.conf
Normal file
37
jenkins/流水线配置/sit_fiymoon_seo.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
48
jenkins/流水线配置/sit_fly_moon_email.conf
Normal file
48
jenkins/流水线配置/sit_fly_moon_email.conf
Normal 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 &
|
||||
'
|
||||
"""
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
38
jenkins/流水线配置/sit_fly_moon_partner.conf
Normal file
38
jenkins/流水线配置/sit_fly_moon_partner.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
53
jenkins/流水线配置/sit_flymoon_agent.conf
Normal file
53
jenkins/流水线配置/sit_flymoon_agent.conf
Normal 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 &
|
||||
'
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
155
jenkins/流水线配置/sit_flymoon_jenniefy.conf
Normal file
155
jenkins/流水线配置/sit_flymoon_jenniefy.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
39
jenkins/流水线配置/sit_flymoon_payment.conf
Normal file
39
jenkins/流水线配置/sit_flymoon_payment.conf
Normal 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 &' """
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
138
jenkins/流水线配置/sit_influencer_search_agent.conf
Normal file
138
jenkins/流水线配置/sit_influencer_search_agent.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
67
jenkins/流水线配置/sit_jenniefy_web.conf
Normal file
67
jenkins/流水线配置/sit_jenniefy_web.conf
Normal 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
|
||||
53
jenkins/流水线配置/sit_lessie_official_web.conf
Normal file
53
jenkins/流水线配置/sit_lessie_official_web.conf
Normal 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
|
||||
"'
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
36
jenkins/流水线配置/test_fly_moon_partner.conf
Normal file
36
jenkins/流水线配置/test_fly_moon_partner.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
82
jenkins/流水线配置/test_flymoon_admin.conf
Normal file
82
jenkins/流水线配置/test_flymoon_admin.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
53
jenkins/流水线配置/test_flymoon_agent.conf
Normal file
53
jenkins/流水线配置/test_flymoon_agent.conf
Normal 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 &
|
||||
'
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
70
jenkins/流水线配置/tk_search_crawler.conf
Normal file
70
jenkins/流水线配置/tk_search_crawler.conf
Normal 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 &
|
||||
|
||||
167
jenkins/流水线配置/tk_shop_crawler.conf
Normal file
167
jenkins/流水线配置/tk_shop_crawler.conf
Normal 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 '❌ 部署失败,请检查日志!'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
36
jenkins/流水线配置/us_prod_flymoon_email.conf
Normal file
36
jenkins/流水线配置/us_prod_flymoon_email.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
74
jenkins/流水线配置/xxl-job/application.properties
Normal file
74
jenkins/流水线配置/xxl-job/application.properties
Normal 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
|
||||
37
jenkins/流水线配置/xxl-job/prod_xxl_job.conf
Normal file
37
jenkins/流水线配置/xxl-job/prod_xxl_job.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
37
jenkins/流水线配置/双后端配置/单agent.conf
Normal file
37
jenkins/流水线配置/双后端配置/单agent.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
36
jenkins/流水线配置/双后端配置/原单task的pipeline.conf
Normal file
36
jenkins/流水线配置/双后端配置/原单task的pipeline.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
266
jenkins/流水线配置/双后端配置/双agent.conf
Normal file
266
jenkins/流水线配置/双后端配置/双agent.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ============更改============
|
||||
59
jenkins/流水线配置/双后端配置/双partner.conf
Normal file
59
jenkins/流水线配置/双后端配置/双partner.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
64
jenkins/流水线配置/双后端配置/双partner.conf.bak
Normal file
64
jenkins/流水线配置/双后端配置/双partner.conf.bak
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
59
jenkins/流水线配置/双后端配置/新双partner的pipeline.conf
Normal file
59
jenkins/流水线配置/双后端配置/新双partner的pipeline.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
61
jenkins/流水线配置/双后端配置/新双task的pipeline.conf
Normal file
61
jenkins/流水线配置/双后端配置/新双task的pipeline.conf
Normal 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 &' "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
36
jenkins/流水线配置/流水线脚本规则.conf
Normal file
36
jenkins/流水线配置/流水线脚本规则.conf
Normal 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 "流水线执行失败!" }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user