From c7e370549b58eb85846c60f13939e10e97ca3b11 Mon Sep 17 00:00:00 2001 From: lzh Date: Thu, 18 Dec 2025 11:35:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=85=8D=E7=BD=AEcicd=20&=20=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E9=85=8D=E7=BD=AE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/cicd.yaml | 98 +++++++++++++++++++ Dockerfile | 31 ++++++ Dockerfile.gateway | 35 +++++++ .../src/main/resources/application-local.yaml | 10 +- 4 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 .gitea/workflows/cicd.yaml create mode 100644 Dockerfile create mode 100644 Dockerfile.gateway diff --git a/.gitea/workflows/cicd.yaml b/.gitea/workflows/cicd.yaml new file mode 100644 index 0000000..9b50508 --- /dev/null +++ b/.gitea/workflows/cicd.yaml @@ -0,0 +1,98 @@ +name: aiot-platform CI/CD + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: xw-runner + container: + image: catthehacker/ubuntu:act-latest + # Runner 可能已默认挂载 docker.sock,如遇权限问题再尝试添加 options: --user root + + steps: + # 1. 手动检出代码 + - name: Checkout (Native) + run: | + # 清理工作目录 + ls -A1 | xargs rm -rf + + # 手动拼接 Git URL + SERVER_DOMAIN=$(echo "${{ gitea.server_url }}" | sed -E 's|https?://||') + PROTO="http" + if [[ "${{ gitea.server_url }}" == https* ]]; then + PROTO="https" + fi + GIT_URL="${PROTO}://${{ gitea.actor }}:${{ gitea.token }}@${SERVER_DOMAIN}/${{ gitea.repository }}.git" + + echo "Cloning from ${PROTO}://${SERVER_DOMAIN}/${{ gitea.repository }}.git ..." + git clone --depth 1 "$GIT_URL" . + git log -1 --format='%h - %s' + + # 2. 准备 Docker 网络 (用于容器间通信) + - name: Create Docker Network + run: | + docker network create aiot-net || true + + # 3. 构建并部署主服务 (Server) + - name: Build & Deploy Server + id: build-server + env: + IMAGE_NAME: 'aiot-server' + CONTAINER_NAME: aiot-server + run: | + # --- 构建 --- + SHORT_SHA=$(git log -1 --format='%h') + FULL_IMAGE_NAME="${IMAGE_NAME}:${SHORT_SHA}" + + echo "Building Server $FULL_IMAGE_NAME..." + # 使用默认 Dockerfile + docker build -t "$FULL_IMAGE_NAME" -f Dockerfile . + docker tag "$FULL_IMAGE_NAME" "${IMAGE_NAME}:latest" + + # --- 部署 --- + echo "Deploying Server..." + docker stop $CONTAINER_NAME || true + docker rm $CONTAINER_NAME || true + + docker run -d \ + --name $CONTAINER_NAME \ + --network aiot-net \ + --restart always \ + -p 48080:48080 \ + "${IMAGE_NAME}:latest" + + # 4. 构建并部署 IoT 网关 (Gateway) + - name: Build & Deploy Gateway + id: build-gateway + env: + IMAGE_NAME: 'aiot-gateway' + CONTAINER_NAME: aiot-gateway + run: | + # --- 构建 --- + SHORT_SHA=$(git log -1 --format='%h') + FULL_IMAGE_NAME="${IMAGE_NAME}:${SHORT_SHA}" + + echo "Building Gateway $FULL_IMAGE_NAME..." + # 使用 Dockerfile.gateway + docker build -t "$FULL_IMAGE_NAME" -f Dockerfile.gateway . + docker tag "$FULL_IMAGE_NAME" "${IMAGE_NAME}:latest" + + # --- 部署 --- + echo "Deploying Gateway..." + docker stop $CONTAINER_NAME || true + docker rm $CONTAINER_NAME || true + + # 覆盖 RPC 地址,使其指向 aiot-server 容器 + # 假设 application.yaml 中配置的是 viewshanghai.iot.gateway.rpc.url + + docker run -d \ + --name $CONTAINER_NAME \ + --network aiot-net \ + --restart always \ + -p 1883:1883 \ + -p 8092:8092 \ + -e VIEWSHANGHAI_IOT_GATEWAY_RPC_URL="http://aiot-server:48080" \ + "${IMAGE_NAME}:latest" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9776db8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +# Build Stage +FROM maven:3.9-eclipse-temurin-17 AS build +WORKDIR /app + +# 复制项目源码 +COPY . . + +# 执行 Maven 构建 +# -B: Batch mode +# clean package: 清理并打包 +# -DskipTests: 跳过测试 +# -Dmaven.javadoc.skip=true: 跳过 javadoc 生成 +RUN mvn -B clean package -DskipTests -Dmaven.javadoc.skip=true + +# Run Stage +FROM eclipse-temurin:17-jre +WORKDIR /app + +# 设置时区 +ENV TZ=Asia/Shanghai + +# 从构建阶段复制 jar 包 +# 注意:根据 pom.xml 配置,viewshanghai-server 的 jar 包生成在 viewshanghai-server/target/ 目录下 +COPY --from=build /app/viewshanghai-server/target/viewshanghai-server.jar app.jar + +# 暴露端口 (viewshanghai-server 默认端口为 48080) +EXPOSE 48080 + +# 启动命令 +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Duser.timezone=Asia/Shanghai", "-jar", "app.jar"] + diff --git a/Dockerfile.gateway b/Dockerfile.gateway new file mode 100644 index 0000000..c501fc0 --- /dev/null +++ b/Dockerfile.gateway @@ -0,0 +1,35 @@ +# Build Stage +FROM maven:3.9-eclipse-temurin-17 AS build +WORKDIR /app + +# 复制项目源码 +COPY . . + +# 执行 Maven 构建 +# 这里的 install 是为了让 gateway 能引用到本地构建的 core/api 等模块依赖 +# -pl 指定只构建 gateway 及其依赖 +# -am (also make dependents) 构建依赖模块 +RUN mvn -B clean install -DskipTests -Dmaven.javadoc.skip=true + +# Run Stage +FROM eclipse-temurin:17-jre +WORKDIR /app + +# 设置时区 +ENV TZ=Asia/Shanghai + +# 复制网关 jar 包 +# 注意路径:viewshanghai-module-iot/viewshanghai-module-iot-gateway/target/viewshanghai-module-iot-gateway.jar +COPY --from=build /app/viewshanghai-module-iot/viewshanghai-module-iot-gateway/target/viewshanghai-module-iot-gateway.jar app.jar + +# 暴露端口 +# MQTT +EXPOSE 1883 +# HTTP Gateway +EXPOSE 8092 +# TCP Gateway (Optional) +EXPOSE 8091 + +# 启动命令 +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Duser.timezone=Asia/Shanghai", "-jar", "app.jar"] + diff --git a/viewshanghai-server/src/main/resources/application-local.yaml b/viewshanghai-server/src/main/resources/application-local.yaml index 12c1ac2..3e15bcb 100644 --- a/viewshanghai-server/src/main/resources/application-local.yaml +++ b/viewshanghai-server/src/main/resources/application-local.yaml @@ -47,7 +47,7 @@ spring: primary: master datasource: master: - url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://124.221.55.225:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 @@ -56,7 +56,7 @@ spring: # url: jdbc:kingbase8://127.0.0.1:54321/test # 人大金仓 KingbaseES 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss 连接的示例 username: root - password: 123456 + password: 65p^VTPi9Qd+ # username: sa # SQL Server 连接的示例 # password: Viewshanghai@2024 # SQL Server 连接的示例 # username: SYSDBA # DM 连接的示例 @@ -65,11 +65,11 @@ spring: # password: Viewshanghai@2024 # OpenGauss 连接的示例 slave: # 模拟从库,可根据自己需要修改 lazy: true # 开启懒加载,保证启动速度 - url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://124.221.55.225:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true username: root - password: 123456 + password: 65p^VTPi9Qd+ tdengine: # IoT 数据库(需要 IoT 物联网再开启噢!) - url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro + url: jdbc:TAOS-WS://124.221.55.225:6041/ruoyi_vue_pro driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver username: root password: taosdata