feat: 添加 Jenkins CI/CD 配置和部署脚本
- 添加 Jenkinsfile 支持智能增量构建 - 添加 Docker 多阶段构建模板 - 添加 Docker Compose 配置(连接 1Panel 中间件) - 添加部署、回滚、清理脚本 - 添加环境变量配置模板
This commit is contained in:
83
docker/Dockerfile.template
Normal file
83
docker/Dockerfile.template
Normal file
@@ -0,0 +1,83 @@
|
||||
# 多阶段构建 Dockerfile 模板
|
||||
# 适用于所有 Spring Boot 服务
|
||||
|
||||
# ============ 构建阶段 ============
|
||||
FROM eclipse-temurin:17-jdk-alpine AS builder
|
||||
|
||||
# 安装必要工具
|
||||
RUN apk add --no-cache maven
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /build
|
||||
|
||||
# 复制 Maven 配置文件(利用 Docker 缓存)
|
||||
COPY pom.xml .
|
||||
COPY viewsh-dependencies/pom.xml viewsh-dependencies/
|
||||
COPY viewsh-framework/pom.xml viewsh-framework/
|
||||
COPY viewsh-gateway/pom.xml viewsh-gateway/
|
||||
COPY viewsh-module-system/pom.xml viewsh-module-system/
|
||||
COPY viewsh-module-infra/pom.xml viewsh-module-infra/
|
||||
COPY viewsh-module-iot/pom.xml viewsh-module-iot/
|
||||
COPY viewsh-module-ops/pom.xml viewsh-module-ops/
|
||||
COPY viewsh-server/pom.xml viewsh-server/
|
||||
|
||||
# 下载依赖(利用缓存层)
|
||||
RUN mvn dependency:go-offline -B || true
|
||||
|
||||
# 复制源代码
|
||||
COPY . .
|
||||
|
||||
# 构建参数:指定要构建的模块
|
||||
ARG MODULE_NAME
|
||||
ARG SKIP_TESTS=true
|
||||
|
||||
# 编译打包
|
||||
RUN if [ "$SKIP_TESTS" = "true" ]; then \
|
||||
mvn clean package -pl ${MODULE_NAME} -am -DskipTests -B; \
|
||||
else \
|
||||
mvn clean package -pl ${MODULE_NAME} -am -B; \
|
||||
fi
|
||||
|
||||
# ============ 运行阶段 ============
|
||||
FROM eclipse-temurin:17-jre-alpine
|
||||
|
||||
# 构建参数
|
||||
ARG MODULE_NAME
|
||||
ARG JAR_NAME
|
||||
ARG APP_PORT=48080
|
||||
|
||||
# 元数据标签
|
||||
LABEL maintainer="XW-AIOT Team"
|
||||
LABEL service="${MODULE_NAME}"
|
||||
|
||||
# 创建非 root 用户
|
||||
RUN addgroup -g 1000 appuser && \
|
||||
adduser -D -u 1000 -G appuser appuser
|
||||
|
||||
# 创建应用目录
|
||||
RUN mkdir -p /app/logs /app/config && \
|
||||
chown -R appuser:appuser /app
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 从构建阶段复制 JAR 文件
|
||||
COPY --from=builder --chown=appuser:appuser /build/${MODULE_NAME}/target/${JAR_NAME}.jar app.jar
|
||||
|
||||
# 切换到非 root 用户
|
||||
USER appuser
|
||||
|
||||
# 环境变量
|
||||
ENV TZ=Asia/Shanghai \
|
||||
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs/heap-dump.hprof" \
|
||||
SPRING_PROFILES_ACTIVE=prod \
|
||||
APP_ARGS=""
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE ${APP_PORT}
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:${APP_PORT}/actuator/health || exit 1
|
||||
|
||||
# 启动应用
|
||||
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar ${APP_ARGS}"]
|
||||
165
docker/services-config.json
Normal file
165
docker/services-config.json
Normal file
@@ -0,0 +1,165 @@
|
||||
{
|
||||
"services": {
|
||||
"viewsh-gateway": {
|
||||
"module": "viewsh-gateway",
|
||||
"jarName": "viewsh-gateway",
|
||||
"port": 48080,
|
||||
"memory": {
|
||||
"limit": "768m",
|
||||
"reservation": "512m",
|
||||
"jvm": {
|
||||
"xms": "512m",
|
||||
"xmx": "768m"
|
||||
}
|
||||
},
|
||||
"cpu": "1.0",
|
||||
"priority": "core",
|
||||
"healthCheck": "/actuator/health",
|
||||
"dependencies": ["nacos", "redis"]
|
||||
},
|
||||
"viewsh-module-system-server": {
|
||||
"module": "viewsh-module-system/viewsh-module-system-server",
|
||||
"jarName": "viewsh-module-system-server",
|
||||
"port": 48081,
|
||||
"memory": {
|
||||
"limit": "768m",
|
||||
"reservation": "512m",
|
||||
"jvm": {
|
||||
"xms": "512m",
|
||||
"xmx": "768m"
|
||||
}
|
||||
},
|
||||
"cpu": "1.0",
|
||||
"priority": "core",
|
||||
"healthCheck": "/actuator/health",
|
||||
"dependencies": ["mysql", "redis", "nacos"]
|
||||
},
|
||||
"viewsh-module-infra-server": {
|
||||
"module": "viewsh-module-infra/viewsh-module-infra-server",
|
||||
"jarName": "viewsh-module-infra-server",
|
||||
"port": 48082,
|
||||
"memory": {
|
||||
"limit": "768m",
|
||||
"reservation": "512m",
|
||||
"jvm": {
|
||||
"xms": "512m",
|
||||
"xmx": "768m"
|
||||
}
|
||||
},
|
||||
"cpu": "1.0",
|
||||
"priority": "core",
|
||||
"healthCheck": "/actuator/health",
|
||||
"dependencies": ["mysql", "redis", "nacos"]
|
||||
},
|
||||
"viewsh-module-iot-server": {
|
||||
"module": "viewsh-module-iot/viewsh-module-iot-server",
|
||||
"jarName": "viewsh-module-iot-server",
|
||||
"port": 48083,
|
||||
"memory": {
|
||||
"limit": "1024m",
|
||||
"reservation": "768m",
|
||||
"jvm": {
|
||||
"xms": "768m",
|
||||
"xmx": "1024m"
|
||||
}
|
||||
},
|
||||
"cpu": "1.5",
|
||||
"priority": "core",
|
||||
"healthCheck": "/actuator/health",
|
||||
"dependencies": ["mysql", "redis", "nacos", "rocketmq"],
|
||||
"description": "IoT 业务服务,处理设备数据,需要较大内存"
|
||||
},
|
||||
"viewsh-module-iot-gateway": {
|
||||
"module": "viewsh-module-iot/viewsh-module-iot-gateway",
|
||||
"jarName": "viewsh-module-iot-gateway",
|
||||
"port": 48084,
|
||||
"memory": {
|
||||
"limit": "1024m",
|
||||
"reservation": "768m",
|
||||
"jvm": {
|
||||
"xms": "768m",
|
||||
"xmx": "1024m"
|
||||
}
|
||||
},
|
||||
"cpu": "1.5",
|
||||
"priority": "core",
|
||||
"healthCheck": "/actuator/health",
|
||||
"dependencies": ["redis", "rocketmq"],
|
||||
"description": "IoT 设备网关,处理设备连接,需要较大内存"
|
||||
},
|
||||
"viewsh-module-ops-server": {
|
||||
"module": "viewsh-module-ops/viewsh-module-ops-server",
|
||||
"jarName": "viewsh-module-ops-server",
|
||||
"port": 48085,
|
||||
"memory": {
|
||||
"limit": "384m",
|
||||
"reservation": "256m",
|
||||
"jvm": {
|
||||
"xms": "256m",
|
||||
"xmx": "384m"
|
||||
}
|
||||
},
|
||||
"cpu": "0.5",
|
||||
"priority": "core",
|
||||
"healthCheck": "/actuator/health",
|
||||
"dependencies": ["mysql", "redis", "nacos"]
|
||||
}
|
||||
},
|
||||
"middleware": {
|
||||
"mysql": {
|
||||
"image": "mysql:8.0",
|
||||
"port": 3306,
|
||||
"memory": {
|
||||
"limit": "2048m",
|
||||
"reservation": "1024m"
|
||||
},
|
||||
"cpu": "1.0",
|
||||
"volumes": ["mysql-data:/var/lib/mysql"]
|
||||
},
|
||||
"redis": {
|
||||
"image": "redis:7-alpine",
|
||||
"port": 6379,
|
||||
"memory": {
|
||||
"limit": "512m",
|
||||
"reservation": "256m"
|
||||
},
|
||||
"cpu": "0.5",
|
||||
"volumes": ["redis-data:/data"]
|
||||
},
|
||||
"nacos": {
|
||||
"image": "nacos/nacos-server:v2.2.3",
|
||||
"port": 8848,
|
||||
"memory": {
|
||||
"limit": "1024m",
|
||||
"reservation": "768m"
|
||||
},
|
||||
"cpu": "1.0",
|
||||
"volumes": ["nacos-data:/home/nacos/data"]
|
||||
},
|
||||
"rocketmq-namesrv": {
|
||||
"image": "apache/rocketmq:5.1.4",
|
||||
"port": 9876,
|
||||
"memory": {
|
||||
"limit": "512m",
|
||||
"reservation": "256m"
|
||||
},
|
||||
"cpu": "0.5"
|
||||
},
|
||||
"rocketmq-broker": {
|
||||
"image": "apache/rocketmq:5.1.4",
|
||||
"port": 10911,
|
||||
"memory": {
|
||||
"limit": "1536m",
|
||||
"reservation": "1024m"
|
||||
},
|
||||
"cpu": "1.0",
|
||||
"volumes": ["rocketmq-data:/home/rocketmq/store"]
|
||||
}
|
||||
},
|
||||
"resourceSummary": {
|
||||
"totalApplicationMemory": "4.5GB",
|
||||
"totalMiddlewareMemory": "5.5GB",
|
||||
"totalEstimatedMemory": "10GB",
|
||||
"note": "内存配置可在 .env 文件中调整,核心服务(iot-server, iot-gateway)已分配更大内存"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user