feat: CICD与部署脚本
- Jenkinsfile: 构建+部署+健康检查流水线 - start.sh: 服务器启动脚本
This commit is contained in:
Vendored
+83
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user