pipeline { // 可以在这里指定运行的节点,any 表示任何可用的 Jenkins 节点 agent any environment { // 定义镜像名称和标签 DOCKER_REGISTRY = '' // 如果有私有仓库,填在这里,如 'registry.cn-hangzhou.aliyuncs.com/my-ns/' FRONTEND_IMAGE_NAME = 'writeoff-frontend' BACKEND_IMAGE_NAME = 'writeoff-backend' IMAGE_TAG = "${env.BUILD_NUMBER}" // 或者用 git commit hash // 部署的目标服务器目录 DEPLOY_DIR = '/opt/writeoff' } stages { // --------------------------------------------------------- // 后端构建阶段 // --------------------------------------------------------- stage('Build Backend') { when { // 仅当 backend 目录下的文件或 Dockerfile 发生变化时执行 changeset "backend/**" } steps { echo "==============================" echo "🚀 检测到后端代码变更,开始构建后端镜像..." echo "==============================" dir('backend') { // 使用 Docker 构建后端镜像 sh "docker build -t ${DOCKER_REGISTRY}${BACKEND_IMAGE_NAME}:${IMAGE_TAG} ." sh "docker tag ${DOCKER_REGISTRY}${BACKEND_IMAGE_NAME}:${IMAGE_TAG} ${DOCKER_REGISTRY}${BACKEND_IMAGE_NAME}:latest" // 如果有私有仓库,可以在这里 push // sh "docker push ${DOCKER_REGISTRY}${BACKEND_IMAGE_NAME}:${IMAGE_TAG}" // sh "docker push ${DOCKER_REGISTRY}${BACKEND_IMAGE_NAME}:latest" } } } // --------------------------------------------------------- // 前端构建与部署阶段 (方案1: 直接打包并复制静态文件) // --------------------------------------------------------- stage('Build & Deploy Frontend') { when { // 仅当 frontend 目录下的文件发生变化时执行 changeset "frontend/**" } steps { echo "==============================" echo "🚀 检测到前端代码变更,开始构建前端..." echo "==============================" dir('frontend') { // 使用 npm 安装依赖并构建 sh "npm install" sh "npm run build" // 将打包好的静态文件复制到目标服务器的 Nginx 目录 // TODO: 请将 root@your-server:/usr/share/nginx/html/ 替换为实际部署路径 echo "📦 部署前端静态文件(dist)到 Nginx 目录..." sh "scp -r dist/* root@your-server:/usr/share/nginx/html/" } } } // --------------------------------------------------------- // 部署阶段 (使用 Docker Compose) // --------------------------------------------------------- stage('Deploy') { steps { echo "==============================" echo "📦 开始部署项目..." echo "==============================" // 这里假设您是在 Jenkins 本机运行 docker-compose,或者通过 SSH 连到目标服务器执行 // 示例中我们直接通过 docker-compose up -d 更新服务 sh "docker-compose up -d" // 清理悬空镜像(可选项,防止磁盘占用过大) sh "docker image prune -f" } } } // --------------------------------------------------------- // 构建后处理 // --------------------------------------------------------- post { success { echo "✅ 构建和部署成功!" } failure { echo "❌ 构建或部署失败,请检查 Jenkins 日志。" } } }