From 1352c796c422841c5c1815a49f30395fe00b1d17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Wed, 26 Aug 2026 11:36:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A8=A3=E8=AF=B2=E5=A7=9E=20CI/CD=20?= =?UTF-8?q?=E9=91=B7=EE=81=84=E5=A7=A9=E9=8D=96=E6=A0=AD=E5=84=B4=E7=BC=83?= =?UTF-8?q?=3F(Dockerfile=20+=20Gitea=20Actions=20workflow)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy.yml | 66 ++++++++++++++++++++++++++++++ Dockerfile | 47 +++++++++++++++++++++ deploy/docker-compose.yml | 57 ++++++++++++++++++++++++++ src/main/resources/application.yml | 7 ++-- 4 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 .gitea/workflows/deploy.yml create mode 100644 Dockerfile create mode 100644 deploy/docker-compose.yml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..6fc9f1d --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,66 @@ +# ============================================================= +# freedom-admin CI/CD 工作流(后端) +# 触发条件:push 到 master 分支时自动构建并部署 +# +# 环境(已确认): +# - runner: local-runner (act_runner v0.6.1),labels: ubuntu-latest +# - job 容器自动挂载 /var/run/docker.sock(runner-config.toml 配置) +# - job 容器可通过 host.docker.internal 访问宿主机(runner 已配 host-gateway) +# - Gitea 内网地址:host.docker.internal:3000 +# - 部署目录:/opt/freedom/deploy(初始化时创建,含 docker-compose.yml 与 .env) +# +# 前置条件(管理员一次性完成): +# - 宿主 /opt/freedom/deploy/docker-compose.yml 已就位 +# - 宿主 /opt/freedom/deploy/.env 含 DB_URL / DB_USERNAME / DB_PASSWORD +# ============================================================= +name: CI/CD Deploy (Admin) + +on: + push: + branches: + - master + workflow_dispatch: + +jobs: + build-and-deploy: + name: 构建后端镜像并部署 + runs-on: ubuntu-latest + container: + image: docker:24.0-cli + # 部署目录挂载(构建 context 与 compose 均在宿主可见) + # docker.sock 已由 runner 自动挂载,此处无需重复 + options: -v /opt/freedom:/opt/freedom + steps: + - name: 安装 git + run: apk add --no-cache git + + - name: 拉取 master 代码 + run: | + set -euo pipefail + rm -rf /opt/freedom/workspace-admin + git clone --depth 1 --branch master \ + "http://oauth2:${GITHUB_TOKEN}@host.docker.internal:3000/${GITHUB_REPOSITORY}.git" \ + /opt/freedom/workspace-admin + cd /opt/freedom/workspace-admin + echo "==> 已拉取代码,最新提交:" + git log -1 --oneline + env: + GITHUB_TOKEN: ${{ github.token }} + + - name: 构建后端镜像 + run: | + set -euo pipefail + docker build -t freedom-admin:latest /opt/freedom/workspace-admin + + - name: 部署后端服务 + run: | + set -euo pipefail + cd /opt/freedom/deploy + test -f docker-compose.yml || { echo "错误: 缺少 docker-compose.yml,请先初始化部署目录"; exit 1; } + test -f .env || { echo "错误: 缺少 .env,请先初始化部署目录"; exit 1; } + docker compose up -d --force-recreate backend + + - name: 确认部署结果 + run: | + cd /opt/freedom/deploy + docker compose ps backend diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..168733b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,47 @@ +# ============================================================= +# freedom-admin 后端镜像 +# 构建阶段:Maven 3.6.3 + JDK8 打包(使用阿里云镜像加速依赖下载) +# 运行阶段:JRE8 运行 jar +# ============================================================= +FROM maven:3.6.3-jdk-8 AS builder +WORKDIR /build + +# 配置 Maven 国内镜像源,加速依赖下载 +RUN mkdir -p /root/.m2 && \ + echo '' > /root/.m2/settings.xml && \ + echo '> /root/.m2/settings.xml && \ + echo ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' >> /root/.m2/settings.xml && \ + echo ' xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo ' aliyun' >> /root/.m2/settings.xml && \ + echo ' central' >> /root/.m2/settings.xml && \ + echo ' Aliyun Maven' >> /root/.m2/settings.xml && \ + echo ' https://maven.aliyun.com/repository/central' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo ' ' >> /root/.m2/settings.xml && \ + echo '' >> /root/.m2/settings.xml + +# 复制 pom 与源码(利用 Docker 分层缓存) +COPY pom.xml . +COPY src ./src + +# 打包(跳过测试),产物 target/freedom-admin-1.0.1.jar +RUN mvn -B clean package -DskipTests + +# ---------- 运行阶段 ---------- +FROM openjdk:8-jre-slim +WORKDIR /app + +# 设置时区 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo 'Asia/Shanghai' > /etc/timezone + +# 复制构建产物 +COPY --from=builder /build/target/*.jar /app/app.jar + +# 对外暴露端口(与 application.yml server.port 一致) +EXPOSE 8800 + +# 启动。数据库等敏感配置通过环境变量注入(见 docker-compose / .env) +ENTRYPOINT ["java", "-jar", "/app/app.jar"] diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml new file mode 100644 index 0000000..9009165 --- /dev/null +++ b/deploy/docker-compose.yml @@ -0,0 +1,57 @@ +# ============================================================= +# freedom 前后端部署编排(初始化到宿主 /opt/freedom/deploy/) +# +# 使用方式(在 /opt/freedom/deploy/ 目录下执行): +# docker compose up -d # 全量部署(首次) +# docker compose up -d backend # 仅部署/更新后端(CI 使用) +# docker compose up -d web # 仅部署/更新前端(CI 使用) +# docker compose down # 停止所有服务 +# docker compose logs -f # 查看日志 +# +# 前置:同目录下需存在 .env 文件(数据库凭据),由初始化脚本创建。 +# DB_URL= jdbc:mysql://:3306/freedom_db?...(本机可用 192.168.1.158) +# DB_USERNAME= root +# DB_PASSWORD= <密码> +# +# 网络说明: +# - web(前端 Nginx)对外暴露 80 端口,是统一入口 +# - backend(后端)仅内网网络,通过服务名 backend:8800 被 Nginx 反代 +# ============================================================= +services: + # ---------------- 后端 ---------------- + # 服务名固定为 backend(前端 nginx.conf 中 proxy_pass http://backend:8800) + backend: + image: freedom-admin:${IMAGE_TAG:-latest} + container_name: freedom-admin + restart: unless-stopped + # 后端不直接暴露公网,仅加入内部网络供 Nginx 反代 + expose: + - "8800" + environment: + # 数据库连接(来自 .env,CI 部署时读取) + DB_URL: ${DB_URL} + DB_USERNAME: ${DB_USERNAME} + DB_PASSWORD: ${DB_PASSWORD} + TZ: Asia/Shanghai + volumes: + - ./logs/backend:/app/logs + networks: + - freedom-net + + # ---------------- 前端(统一入口) ---------------- + web: + image: freedom-web:${IMAGE_TAG:-latest} + container_name: freedom-web + restart: unless-stopped + ports: + - "80:80" + environment: + TZ: Asia/Shanghai + depends_on: + - backend + networks: + - freedom-net + +networks: + freedom-net: + driver: bridge diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5276030..7cbc79a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,9 +8,10 @@ spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://124.221.214.237:3306/freedom_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true - username: root - password: 1Qaz@4772 + # 支持通过环境变量覆盖(生产/Docker 部署时注入内网地址),默认回退到公网地址便于本地开发 + url: ${DB_URL:jdbc:mysql://124.221.214.237:3306/freedom_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true} + username: ${DB_USERNAME:root} + password: ${DB_PASSWORD:1Qaz@4772} hikari: initialization-fail-timeout: 1000 # 连接初始化失败超时时间 minimum-idle: 5