thingsboard/summary/09-构建脚本说明.md

360 lines
7.1 KiB
Markdown
Raw Permalink Normal View History

2026-01-19 11:50:37 +08:00
# 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 构建的便捷包装脚本!**