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() } } }