/** * OfferPie Job Cleaner 部署流水线 * * Jenkins 容器挂载了宿主机 docker.sock,镜像共享。 * 直接在 workspace 内 build + compose up。 */ pipeline { agent any parameters { choice(name: 'BRANCH', choices: ['master', 'dev'], description: '选择要部署的分支') choice(name: 'ACTION', choices: ['deploy', 'stop'], description: '操作:deploy=构建部署,stop=停止服务') } environment { IMAGE_NAME = 'offerpie-job-cleaner' IMAGE_TAG = 'latest' CONTAINER_NAME = 'offerpie-job-cleaner' } stages { stage('停止服务') { when { expression { params.ACTION == 'stop' } } steps { sh "docker compose down || true" } } stage('拉取代码') { when { expression { params.ACTION == 'deploy' } } 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('构建镜像') { when { expression { params.ACTION == 'deploy' } } steps { sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ." } } stage('部署') { when { expression { params.ACTION == 'deploy' } } steps { // 停旧启新,docker-compose.yml 就在当前 workspace sh "docker compose down || true" sh "docker compose up -d" sleep 5 sh "docker ps -f name=${CONTAINER_NAME} --format '{{.Status}}'" } } stage('清理') { when { expression { params.ACTION == 'deploy' } } steps { sh "docker image prune -f || true" } } } post { success { script { if (params.ACTION == 'deploy') { echo "✅ 部署成功!容器 ${CONTAINER_NAME} 已启动" } else { echo "✅ 服务已停止" } } } failure { echo '❌ 操作失败,请检查日志' } } }