/** * OfferPie Job Cleaner 部署流水线 * * 架构:Jenkins 本地编译镜像 → scp 到目标机 → SSH 远程重启容器 * 目标机目录:/opt/offerpie/job-cleaner/ */ pipeline { agent any parameters { choice(name: 'BRANCH', choices: ['master', 'dev'], description: '选择要部署的分支') } environment { // 目标服务器配置 DEPLOY_HOST = '192.168.31.51' DEPLOY_PORT = '22' DEPLOY_USER = 'jsxq' DEPLOY_PASS = '123456' // 项目配置 IMAGE_NAME = 'offerpie-job-cleaner' IMAGE_TAG = 'latest' CONTAINER_NAME = 'offerpie-job-cleaner' REMOTE_DIR = '/opt/offerpie/job-cleaner' // SSH 命令前缀 SSH_CMD = "sshpass -p '${DEPLOY_PASS}' ssh -o StrictHostKeyChecking=no -p ${DEPLOY_PORT} ${DEPLOY_USER}@${DEPLOY_HOST}" SCP_CMD = "sshpass -p '${DEPLOY_PASS}' scp -o StrictHostKeyChecking=no -P ${DEPLOY_PORT}" } stages { stage('环境检查') { steps { sh 'sshpass -V' } } stage('拉取代码') { steps { echo "拉取 ${params.BRANCH} 分支代码" git branch: "${params.BRANCH}", credentialsId: 'gitea-fab089c1-b55d-4b58-9fad', url: 'http://git.jianshixingqiu.com/offerpai/offerpie_job_cleaner.git' } } stage('本地编译') { steps { echo "开始构建镜像" sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ." echo "导出镜像" sh "docker save -o ${IMAGE_NAME}.tar ${IMAGE_NAME}:${IMAGE_TAG}" } } stage('文件传输') { steps { echo "传输文件到目标服务器" sh "${SSH_CMD} 'mkdir -p ${REMOTE_DIR}'" sh "${SCP_CMD} ${IMAGE_NAME}.tar ${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_DIR}/" sh "${SCP_CMD} docker-compose.yml ${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_DIR}/docker-compose.yml" } } stage('部署') { steps { script { // 加载镜像 sh "${SSH_CMD} 'docker load < ${REMOTE_DIR}/${IMAGE_NAME}.tar'" // 停掉旧容器 sh "${SSH_CMD} 'cd ${REMOTE_DIR} && docker compose down || true'" // 启动新容器 sh "${SSH_CMD} 'cd ${REMOTE_DIR} && docker compose up -d'" // 等待启动 sh 'sleep 5' // 检查容器是否在运行 sh "${SSH_CMD} 'docker ps -f name=${CONTAINER_NAME} --format \"{{.Status}}\"'" } } } stage('清理') { steps { sh "${SSH_CMD} 'rm -f ${REMOTE_DIR}/${IMAGE_NAME}.tar'" sh "rm -f ${IMAGE_NAME}.tar" } } } post { success { echo "✅ 部署成功!容器 ${CONTAINER_NAME} 已启动" } failure { echo '❌ 部署失败,请检查日志' sh "rm -f ${IMAGE_NAME}.tar || true" } } }