diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..3a73773 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,96 @@ +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 日志。" + } + } +} diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..bdfbc3e --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,33 @@ +# 阶段 1:构建环境 +FROM maven:3.8.6-openjdk-8-slim as builder + +WORKDIR /app + +# 先复制 pom.xml 以下载依赖,利用 Docker 缓存机制 +COPY pom.xml . +RUN mvn dependency:go-offline -B + +# 复制源代码并打包 +COPY src ./src +RUN mvn clean package -DskipTests + +# 阶段 2:运行环境 +# 根据 pom.xml,项目使用的是 Java 1.8 +FROM openjdk:8-jre-alpine + +WORKDIR /app + +# 设置时区为上海(可选,但推荐) +ENV TZ=Asia/Shanghai +RUN apk add --no-cache tzdata && \ + ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \ + echo $TZ > /etc/timezone + +# 从构建阶段复制打包好的 jar 包 +COPY --from=builder /app/target/*.jar app.jar + +# 暴露 Spring Boot 默认端口 +EXPOSE 8080 + +# 启动参数可根据需要调整 +CMD ["java", "-jar", "app.jar"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2023097 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' + +services: + writeoff-backend: + image: writeoff-backend:latest + container_name: writeoff-backend + ports: + - "8080:8080" + restart: always + environment: + - SPRING_PROFILES_ACTIVE=prod + # 在这里配置数据库等环境变量 + # - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/writeoff... + # 如果有同级的数据库容器,可以在这里关联 + # depends_on: + # - db