新增s4的jenkins和nginx

This commit is contained in:
dxin
2025-11-04 14:43:52 +08:00
parent e37e8dc9f2
commit 210356d816
5 changed files with 533 additions and 3 deletions

View File

@@ -0,0 +1,98 @@
pipeline {
agent any
tools{
go 'go1.24.0'
}
environment {
REMOTE_HOST_A = "43.130.56.138"
REMOTE_PROJECT_PATH_A = "/data/webapps/go_lessie_sourcing_api_s4"
PORT_A = "8101"
CONNECTION_TIMEOUT = "300" // 等待连接关闭的超时时间
CHECK_PORT_SCRIPT = "/data/sh/check_port.sh" // 检查服务所运行的端口是否起起来
SEND_STOP_GOAPP_SCRIPT = "/data/sh/send_stop_goapp_s4.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
cp ./build/lessie-sourcing-api ./build/lessie-sourcing-api-s4
chmod +x ./build/lessie-sourcing-api-s4
"""
}
}
stage('A同步') {
steps {
echo "阶段三"
sh """
echo "进入jenkins工作目录:${WORKSPACE}"
cd ${WORKSPACE}/
echo "同步二进制产物"
rsync -avzuP ./build/lessie-sourcing-api-s4 ./configs/application_s4.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-s4
nohup env ENV=s4 ./lessie-sourcing-api-s4 --port 8101 > ./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} 8101 60
sleep 5
ps aux|grep lessie-sourcing-api-s4
'
"""
}
}
}
post {
success {
echo '✅ 部署成功!'
}
failure {
echo '❌ 部署失败,请检查日志!'
}
}
}

View File

@@ -0,0 +1,142 @@
node {
properties([
parameters([
// 分支选择参数
gitParameter(
branchFilter: 'origin/(.*)',
defaultValue: 'master',
description: 's4环境默认master分支',
name: 'Code_branch',
quickFilterEnabled: true,
selectedValue: 'DEFAULT',
sortMode: 'NONE',
type: 'PT_BRANCH',
size: 1
),
// 部署实例选择
choice(
name: 'DEPLOY_TARGETS',
choices: ['A'],
description: '选择需要部署的实例'
),
// 部署顺序
string(
name: 'DEPLOY_ORDER',
defaultValue: 'A',
description: '指定部署顺序'
)
])
])
// 环境配置(集中管理实例参数)
def config = [
A: [
remoteHost: "43.130.56.138",
projectPath: "/data/webapps/lessie_sourcing_agents_s4",
venvDir: "/data/webapps/lessie_sourcing_agents_s4/.venv",
nginxBackend: "10.0.0.5",
port: "8001",
killScript: "/data/sh/kill_lessie_sourcing_agents.sh",
checkScript: "/data/sh/check_lessie_agents_8001.sh",
gunicornWorkers: 4
],
]
def commonConfig = [
nginxHost: "43.130.56.138",
connectionTimeout: "300",
nginxReloadScript: "/data/sh/set_s4_backend_weight_new.sh",
waitConnectionsScript: "/data/sh/wait_s4_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}
uv sync
source ${cfg.venvDir}/bin/activate
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 200 --max-requests-jitter 50 \
> "\$LOGFILE" 2>&1 &
ln -sf "\$LOGFILE" ${cfg.projectPath}/logs/lessie_sourcing_agents_latest.log
'
"""
}
stage("探测${instance}探测服务") {
def cfg = config[instance]
sh "sleep 5"
sh "ssh ${cfg.remoteHost} 'head -n 300 ${cfg.projectPath}/logs/lessie_sourcing_agents_latest.log | grep -i error || echo 未发现错误日志'"
sh "ssh ${cfg.remoteHost} 'sh ${cfg.checkScript}'"
}
stage("恢复${instance}流量") {
def cfg = config[instance]
sh "ssh ${commonConfig.nginxHost} 'sh ${commonConfig.nginxReloadScript} ${cfg.nginxBackend} ${cfg.port} up'"
}
echo "===== 实例 ${instance} 部署完成 ====="
}
}
echo '✅ 所有选中的实例部署成功!'
}

View File

@@ -0,0 +1,66 @@
pipeline {
agent any
parameters {
gitParameter(
branchFilter: 'origin/(.*)',
defaultValue: 'dev',
name: 'Code_branch',
type: 'PT_BRANCH_TAG',
selectedValue: 'DEFAULT',
sortMode: 'NONE',
description: '选择代码分支或标签: ',
quickFilterEnabled: true,
tagFilter: '*',
listSize: "1"
)
}
environment {
WEB_HOST_IP = "43.130.56.138"
WEB_HOST_PROJECT_PATH = "/data/tengine/html/s4-jennie-im-web/dist"
}
stages {
stage('拉取代码') {
steps {
git branch: "${params.Code_branch}", credentialsId: 'fly_gitlab_auth', url: 'http://172.24.16.20/web/jennie.git'
}
}
stage('pnpm i&b') {
steps {
script {
sh """
export PATH="/data/node-v20.15.0/bin:$PATH"
echo "开始安装依赖包"
cd ${WORKSPACE}/ && rm -rf node_modules && pnpm install
echo "开始构建"
pnpm build:im
mv dist/main/index.html dist/
chmod -R 755 dist/
"""
}
}
}
stage('同步产物') {
steps {
script {
sh """
cd ${WORKSPACE}/
rsync -avzP --delete dist/ ${WEB_HOST_IP}:${WEB_HOST_PROJECT_PATH}
"""
}
}
}
}
post {
success {
echo "构建成功!"
}
failure {
echo "构建失败!"
}
}
}