feat: CICD与部署脚本
- Jenkinsfile: 构建+部署+健康检查流水线 - start.sh: 服务器启动脚本
This commit is contained in:
parent
dec103546e
commit
c21692f91e
83
Jenkinsfile
vendored
Normal file
83
Jenkinsfile
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
IMAGE_NAME = 'awesome-index'
|
||||||
|
CONTAINER_NAME = 'awesome'
|
||||||
|
DEPLOY_PATH = '/app/awesome'
|
||||||
|
SSH_HOST = '114.134.187.170'
|
||||||
|
SSH_USER = 'root'
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Build') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo "Building Docker image ${IMAGE_NAME}:${BUILD_NUMBER}"
|
||||||
|
sh "docker build -t ${IMAGE_NAME}:${BUILD_NUMBER} ."
|
||||||
|
sh "docker tag ${IMAGE_NAME}:${BUILD_NUMBER} ${IMAGE_NAME}:latest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy') {
|
||||||
|
steps {
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'baihu-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) {
|
||||||
|
script {
|
||||||
|
def remote = "root@${SSH_HOST}"
|
||||||
|
|
||||||
|
// 创建部署目录
|
||||||
|
sh "sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${remote} 'mkdir -p ${DEPLOY_PATH}/data ${DEPLOY_PATH}/logs'"
|
||||||
|
|
||||||
|
// 复制必要文件
|
||||||
|
sh "sshpass -p '${SSH_PASS}' scp -o StrictHostKeyChecking=no docker-compose.yml ${remote}:${DEPLOY_PATH}/"
|
||||||
|
sh "sshpass -p '${SSH_PASS}' scp -o StrictHostKeyChecking=no .env.example ${remote}:${DEPLOY_PATH}/.env"
|
||||||
|
sh "sshpass -p '${SSH_PASS}' scp -o StrictHostKeyChecking=no start.sh ${remote}:${DEPLOY_PATH}/"
|
||||||
|
|
||||||
|
// 导入镜像
|
||||||
|
sh "docker save ${IMAGE_NAME}:latest | gzip > ${IMAGE_NAME}.tar.gz"
|
||||||
|
sh "sshpass -p '${SSH_PASS}' scp -o StrictHostKeyChecking=no ${IMAGE_NAME}.tar.gz ${remote}:${DEPLOY_PATH}/"
|
||||||
|
|
||||||
|
// 在服务器上加载并重启
|
||||||
|
sh """
|
||||||
|
sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${remote} '
|
||||||
|
cd ${DEPLOY_PATH} &&
|
||||||
|
gunzip -c ${IMAGE_NAME}.tar.gz | docker load &&
|
||||||
|
rm -f ${IMAGE_NAME}.tar.gz &&
|
||||||
|
docker compose down --remove-orphans &&
|
||||||
|
docker compose up -d
|
||||||
|
'
|
||||||
|
"""
|
||||||
|
|
||||||
|
// 清理本地
|
||||||
|
sh "rm -f ${IMAGE_NAME}.tar.gz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Health Check') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
sleep 10
|
||||||
|
def status = sh(
|
||||||
|
script: "curl -sf http://${SSH_HOST}:3000/healthz || echo 'FAILED'",
|
||||||
|
returnStdout: true
|
||||||
|
).trim()
|
||||||
|
|
||||||
|
if (status.contains('ok')) {
|
||||||
|
echo "Health check PASSED"
|
||||||
|
} else {
|
||||||
|
error "Health check FAILED"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
cleanWs()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
41
start.sh
Normal file
41
start.sh
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Awesome Index 启动脚本
|
||||||
|
DEPLOY_PATH="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
cd "$DEPLOY_PATH"
|
||||||
|
|
||||||
|
# 检查 .env 文件
|
||||||
|
if [ ! -f .env ]; then
|
||||||
|
echo "错误: 缺少 .env 文件,请从 .env.example 复制并修改"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 停止旧容器
|
||||||
|
echo "停止旧容器..."
|
||||||
|
docker compose down --remove-orphans 2>/dev/null || true
|
||||||
|
|
||||||
|
# 启动新容器
|
||||||
|
echo "启动 Awesome Index..."
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# 健康检查
|
||||||
|
echo "等待服务就绪..."
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
MAX_RETRIES=10
|
||||||
|
RETRY_COUNT=0
|
||||||
|
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
|
||||||
|
if curl -sf http://localhost:3000/healthz > /dev/null 2>&1; then
|
||||||
|
echo "✓ 服务已启动: http://localhost:3000"
|
||||||
|
echo ""
|
||||||
|
echo "管理后台: http://localhost:3000/admin"
|
||||||
|
echo "默认账号: admin / (见 .env 中的 ADMIN_INIT_PASSWORD)"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✗ 服务启动失败,请检查日志: docker compose logs"
|
||||||
|
exit 1
|
||||||
Loading…
Reference in New Issue
Block a user