360 lines
7.1 KiB
Markdown
360 lines
7.1 KiB
Markdown
# ThingsBoard 构建脚本说明
|
||
|
||
## 1. build.sh 文件作用
|
||
|
||
`build.sh` 是 ThingsBoard 项目的**主构建脚本**,用于从源码构建整个项目。
|
||
|
||
### 1.1 核心功能
|
||
|
||
- **一键构建**: 简化 Maven 构建命令
|
||
- **环境配置**: 设置构建所需的环境变量
|
||
- **选择性构建**: 支持构建特定模块
|
||
- **并行构建**: 使用多线程加速构建
|
||
|
||
## 2. 脚本详解
|
||
|
||
### 2.1 脚本内容分析
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
|
||
# 设置错误时退出
|
||
set -e
|
||
|
||
# 可选的构建项目列表(默认空,构建所有项目)
|
||
PROJECTS=""
|
||
|
||
# 如果提供了参数,只构建指定的项目
|
||
if [ "$1" ]; then
|
||
PROJECTS="--projects $1"
|
||
fi
|
||
|
||
# 显示帮助信息
|
||
echo "Building and pushing [amd64,arm64] projects '$PROJECTS' ..."
|
||
echo "HELP: usage ./build.sh [projects]"
|
||
echo "HELP: example ./build.sh msa/web-ui,msa/web-report"
|
||
|
||
# 检查 Java 版本
|
||
java -version
|
||
|
||
# 执行 Maven 构建
|
||
MAVEN_OPTS="-Xmx1024m" \
|
||
NODE_OPTIONS="--max_old_space_size=4096" \
|
||
DOCKER_CLI_EXPERIMENTAL=enabled \
|
||
DOCKER_BUILDKIT=0 \
|
||
mvn -T2 license:format clean install -DskipTests \
|
||
$PROJECTS --also-make
|
||
```
|
||
|
||
### 2.2 关键参数说明
|
||
|
||
#### 2.2.1 环境变量
|
||
|
||
- **MAVEN_OPTS="-Xmx1024m"**: Maven 使用 1GB 内存
|
||
- **NODE_OPTIONS="--max_old_space_size=4096"**: Node.js 使用 4GB 内存(用于前端构建)
|
||
- **DOCKER_CLI_EXPERIMENTAL=enabled**: 启用 Docker 实验性功能
|
||
- **DOCKER_BUILDKIT=0**: 禁用 Docker BuildKit(兼容性考虑)
|
||
|
||
#### 2.2.2 Maven 参数
|
||
|
||
- **-T2**: 使用 2 个线程并行构建
|
||
- **license:format**: 格式化代码许可证头
|
||
- **clean**: 清理之前的构建产物
|
||
- **install**: 编译、测试、打包并安装到本地仓库
|
||
- **-DskipTests**: 跳过测试(加快构建速度)
|
||
- **--also-make**: 同时构建依赖的模块
|
||
- **--projects**: 指定要构建的项目(可选)
|
||
|
||
## 3. 使用方法
|
||
|
||
### 3.1 构建所有项目
|
||
|
||
```bash
|
||
# 在项目根目录执行
|
||
./build.sh
|
||
```
|
||
|
||
**等同于**:
|
||
```bash
|
||
mvn clean install -DskipTests
|
||
```
|
||
|
||
### 3.2 构建特定项目
|
||
|
||
```bash
|
||
# 构建单个项目
|
||
./build.sh msa/tb-node
|
||
|
||
# 构建多个项目(用逗号分隔)
|
||
./build.sh msa/tb-node,msa/web-ui
|
||
|
||
# 构建传输服务
|
||
./build.sh msa/transport/mqtt
|
||
```
|
||
|
||
### 3.3 实际示例
|
||
|
||
```bash
|
||
# 示例1:只构建 Web UI
|
||
./build.sh msa/web-ui
|
||
|
||
# 示例2:构建核心服务和规则引擎
|
||
./build.sh msa/tb-node
|
||
|
||
# 示例3:构建所有传输服务
|
||
./build.sh msa/transport
|
||
```
|
||
|
||
## 4. 构建流程
|
||
|
||
### 4.1 完整构建流程
|
||
|
||
执行 `./build.sh` 后,Maven 会执行以下步骤:
|
||
|
||
```
|
||
1. license:format
|
||
↓
|
||
格式化所有文件的许可证头
|
||
|
||
2. clean
|
||
↓
|
||
清理之前的构建产物(target/ 目录)
|
||
|
||
3. compile
|
||
↓
|
||
编译所有 Java 源码
|
||
|
||
4. test(跳过,因为 -DskipTests)
|
||
↓
|
||
|
||
5. package
|
||
↓
|
||
打包:
|
||
- Java 模块 → JAR 包
|
||
- application 模块 → DEB 包
|
||
- transport 模块 → DEB 包
|
||
- ui-ngx 模块 → JAR 包(包含前端静态资源)
|
||
|
||
6. install
|
||
↓
|
||
安装到本地 Maven 仓库(~/.m2/repository)
|
||
|
||
7. Docker 构建(如果启用)
|
||
↓
|
||
构建 Docker 镜像(默认跳过,因为 dockerfile.skip=true)
|
||
```
|
||
|
||
### 4.2 构建产物
|
||
|
||
构建完成后,会在各模块的 `target/` 目录下生成:
|
||
|
||
- **JAR 包**: `application/target/thingsboard-4.2.1-boot.jar`
|
||
- **DEB 包**: `application/target/thingsboard-4.2.1.deb`
|
||
- **Docker 镜像**: `thingsboard/tb-node:4.2.1`(如果启用 Docker 构建)
|
||
|
||
## 5. 构建选项
|
||
|
||
### 5.1 构建 Docker 镜像
|
||
|
||
默认情况下,`build.sh` **不会构建 Docker 镜像**(`dockerfile.skip=true`)。
|
||
|
||
要构建 Docker 镜像,需要直接使用 Maven:
|
||
|
||
```bash
|
||
# 构建并推送 Docker 镜像
|
||
mvn clean install -DskipTests -Ddockerfile.skip=false -Dpush-docker-image=true
|
||
```
|
||
|
||
### 5.2 运行测试
|
||
|
||
默认跳过测试(`-DskipTests`),要运行测试:
|
||
|
||
```bash
|
||
# 运行测试
|
||
mvn clean install
|
||
|
||
# 或只运行特定模块的测试
|
||
mvn clean install --projects application
|
||
```
|
||
|
||
### 5.3 离线构建
|
||
|
||
```bash
|
||
# 使用本地仓库,不下载依赖
|
||
mvn clean install -DskipTests --offline
|
||
```
|
||
|
||
## 6. 其他构建脚本
|
||
|
||
### 6.1 build_proto.sh
|
||
|
||
**位置**: `build_proto.sh`
|
||
|
||
**作用**: 只构建包含 Protobuf 的模块
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
echo "Building ThingsBoard protobuf-containing packages..."
|
||
mvn clean compile -T4 --also-make --projects='
|
||
common/cluster-api,
|
||
common/edge-api,
|
||
common/transport/coap,
|
||
common/transport/mqtt,
|
||
common/transport/transport-api'
|
||
```
|
||
|
||
**使用场景**:
|
||
- 修改了 `.proto` 文件后
|
||
- 需要重新生成 Protobuf Java 代码时
|
||
|
||
**使用方法**:
|
||
```bash
|
||
./build_proto.sh
|
||
```
|
||
|
||
## 7. 构建时间优化
|
||
|
||
### 7.1 并行构建
|
||
|
||
```bash
|
||
# 使用更多线程(根据 CPU 核心数调整)
|
||
mvn -T4 clean install -DskipTests
|
||
```
|
||
|
||
### 7.2 增量构建
|
||
|
||
```bash
|
||
# 只构建变更的模块
|
||
./build.sh msa/tb-node # 只构建 tb-node
|
||
```
|
||
|
||
### 7.3 跳过前端构建
|
||
|
||
```bash
|
||
# 如果不需要前端,可以跳过 ui-ngx 模块
|
||
mvn clean install -DskipTests --projects '!ui-ngx'
|
||
```
|
||
|
||
## 8. 常见问题
|
||
|
||
### 8.1 内存不足
|
||
|
||
**问题**: `java.lang.OutOfMemoryError`
|
||
|
||
**解决**: 增加 Maven 内存
|
||
```bash
|
||
MAVEN_OPTS="-Xmx2048m" ./build.sh
|
||
```
|
||
|
||
### 8.2 Node.js 内存不足
|
||
|
||
**问题**: 前端构建时内存不足
|
||
|
||
**解决**: 增加 Node.js 内存
|
||
```bash
|
||
NODE_OPTIONS="--max_old_space_size=8192" ./build.sh
|
||
```
|
||
|
||
### 8.3 构建失败
|
||
|
||
**检查**:
|
||
1. Java 版本是否正确(需要 Java 17)
|
||
2. Maven 版本(需要 3.6+)
|
||
3. 网络连接(需要下载依赖)
|
||
4. 磁盘空间是否充足
|
||
|
||
### 8.4 依赖下载失败
|
||
|
||
**解决**:
|
||
```bash
|
||
# 清理本地仓库后重试
|
||
rm -rf ~/.m2/repository/org/thingsboard
|
||
./build.sh
|
||
```
|
||
|
||
## 9. 构建脚本 vs 直接使用 Maven
|
||
|
||
### 9.1 使用 build.sh
|
||
|
||
**优点**:
|
||
- ✅ 统一的构建入口
|
||
- ✅ 预设了最佳实践的环境变量
|
||
- ✅ 简化命令
|
||
|
||
**示例**:
|
||
```bash
|
||
./build.sh msa/tb-node
|
||
```
|
||
|
||
### 9.2 直接使用 Maven
|
||
|
||
**优点**:
|
||
- ✅ 更灵活的控制
|
||
- ✅ 可以使用所有 Maven 选项
|
||
|
||
**示例**:
|
||
```bash
|
||
mvn clean install -DskipTests --projects msa/tb-node --also-make
|
||
```
|
||
|
||
## 10. CI/CD 集成
|
||
|
||
### 10.1 在 CI 中使用
|
||
|
||
```yaml
|
||
# GitHub Actions 示例
|
||
- name: Build ThingsBoard
|
||
run: |
|
||
chmod +x build.sh
|
||
./build.sh
|
||
|
||
- name: Build specific modules
|
||
run: |
|
||
./build.sh msa/tb-node,msa/web-ui
|
||
```
|
||
|
||
### 10.2 构建 Docker 镜像
|
||
|
||
```bash
|
||
# 在 CI 中构建并推送 Docker 镜像
|
||
mvn clean install -DskipTests \
|
||
-Ddockerfile.skip=false \
|
||
-Dpush-docker-image=true \
|
||
-Ddocker.repo=your-registry/thingsboard
|
||
```
|
||
|
||
## 11. 总结
|
||
|
||
### 11.1 build.sh 的作用
|
||
|
||
1. **简化构建**: 一键构建整个项目
|
||
2. **环境配置**: 设置合适的内存和构建选项
|
||
3. **选择性构建**: 支持构建特定模块
|
||
4. **标准化**: 统一的构建方式
|
||
|
||
### 11.2 核心命令
|
||
|
||
```bash
|
||
# 构建所有项目
|
||
./build.sh
|
||
|
||
# 构建特定项目
|
||
./build.sh msa/tb-node
|
||
|
||
# 构建多个项目
|
||
./build.sh msa/tb-node,msa/web-ui,msa/transport/mqtt
|
||
```
|
||
|
||
### 11.3 实际等效命令
|
||
|
||
`./build.sh` 实际执行的是:
|
||
|
||
```bash
|
||
MAVEN_OPTS="-Xmx1024m" \
|
||
NODE_OPTIONS="--max_old_space_size=4096" \
|
||
mvn -T2 license:format clean install -DskipTests --also-make
|
||
```
|
||
|
||
**所以 `build.sh` 本质上是一个 Maven 构建的便捷包装脚本!**
|
||
|