#!/bin/bash # # Copyright © 2016-2025 The Thingsboard Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ################################################################################ # ThingsBoard PostgreSQL 单镜像多平台构建脚本 # # 功能: # 1. 构建 ThingsBoard PostgreSQL 单镜像 # 2. 支持多平台:linux/amd64 (Intel/AMD) 和 linux/arm64 (Mac M1/M2) # 3. 自动推送到私有仓库:registry.t-aaron.com # # 使用方法: # ./build-tb-postgres-multiarch.sh # # 作者:Auto-generated # 日期:2026-01-19 ################################################################################ set -e # 遇到错误立即退出 # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 配置变量 REGISTRY="registry.t-aaron.com" IMAGE_NAME="thingsboard/tb-postgres" PLATFORMS="linux/amd64,linux/arm64" BUILDER_NAME="tb-multiarch-builder" # 打印带颜色的消息 print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_step() { echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}$1${NC}" echo -e "${GREEN}========================================${NC}" } # 检查命令是否存在 check_command() { if ! command -v $1 &> /dev/null; then print_error "$1 未安装,请先安装" exit 1 fi } # 获取项目根目录 PROJECT_ROOT=$(pwd) print_info "项目根目录: $PROJECT_ROOT" ################################################################################ # 步骤 0: 环境检查 ################################################################################ print_step "步骤 0: 环境检查" # 检查必要的命令 print_info "检查必要的命令..." check_command "docker" check_command "mvn" check_command "java" # 检查 Docker Buildx if ! docker buildx version &> /dev/null; then print_error "Docker Buildx 未安装或未启用" print_info "请确保使用 Docker Desktop 或手动安装 Buildx" exit 1 fi print_success "Docker Buildx 已安装" # 检查 Docker 是否运行 if ! docker info &> /dev/null; then print_error "Docker 未运行,请启动 Docker Desktop" exit 1 fi print_success "Docker 正在运行" ################################################################################ # 步骤 1: 获取版本号 ################################################################################ print_step "步骤 1: 获取版本号" if [ ! -f "pom.xml" ]; then print_error "未找到 pom.xml,请确保在项目根目录执行此脚本" exit 1 fi VERSION=$(grep "" pom.xml | head -1 | sed 's/.*\(.*\)<\/version>.*/\1/') if [ -z "$VERSION" ]; then print_error "无法从 pom.xml 获取版本号" exit 1 fi print_success "当前版本: $VERSION" # 构建完整的镜像标签 FULL_IMAGE_TAG="$REGISTRY/$IMAGE_NAME:$VERSION" LATEST_IMAGE_TAG="$REGISTRY/$IMAGE_NAME:latest" print_info "镜像标签: $FULL_IMAGE_TAG" print_info "最新标签: $LATEST_IMAGE_TAG" ################################################################################ # 步骤 2: 拉取基础镜像 ################################################################################ print_step "步骤 2: 拉取基础镜像" print_info "拉取 registry.t-aaron.com/thingsboard/openjdk17:bookworm-slim..." if docker pull registry.t-aaron.com/thingsboard/openjdk17:bookworm-slim; then print_success "基础镜像拉取成功" else print_warning "基础镜像拉取失败,将尝试使用本地缓存" fi ################################################################################ # 步骤 3: Maven 构建 ################################################################################ print_step "步骤 3: Maven 构建代码和 DEB 包" print_info "开始 Maven 构建(跳过测试)..." print_info "这可能需要 5-15 分钟,请耐心等待..." MAVEN_OPTS="-Xmx2048m" mvn clean install -DskipTests --projects msa/tb --also-make if [ $? -ne 0 ]; then print_error "Maven 构建失败" exit 1 fi print_success "Maven 构建完成" ################################################################################ # 步骤 4: 验证构建产物 ################################################################################ print_step "步骤 4: 验证构建产物" BUILD_DIR="msa/tb/target/docker-postgres" if [ ! -d "$BUILD_DIR" ]; then print_error "构建目录不存在: $BUILD_DIR" exit 1 fi print_info "检查构建产物..." REQUIRED_FILES=("Dockerfile" "thingsboard.deb" "start-tb.sh" "start-db.sh" "stop-db.sh" "thingsboard.conf" "logback.xml") for file in "${REQUIRED_FILES[@]}"; do if [ ! -f "$BUILD_DIR/$file" ]; then print_error "缺少必要文件: $file" exit 1 fi done print_success "所有必要文件已就绪" # 显示 DEB 包大小 DEB_SIZE=$(du -h "$BUILD_DIR/thingsboard.deb" | cut -f1) print_info "DEB 包大小: $DEB_SIZE" ################################################################################ # 步骤 5: 配置 Docker Buildx ################################################################################ print_step "步骤 5: 配置 Docker Buildx" # 检查 builder 是否存在 if docker buildx inspect $BUILDER_NAME &> /dev/null; then print_info "使用现有的 builder: $BUILDER_NAME" docker buildx use $BUILDER_NAME else print_info "创建新的 builder: $BUILDER_NAME" docker buildx create --name $BUILDER_NAME --use --driver docker-container fi # 启动 builder print_info "启动 builder..." docker buildx inspect --bootstrap print_success "Buildx 配置完成" ################################################################################ # 步骤 6: 构建多平台镜像 ################################################################################ print_step "步骤 6: 构建多平台 Docker 镜像" print_info "支持的平台: $PLATFORMS" print_info "开始构建镜像,这可能需要 5-15 分钟..." print_warning "注意: 构建 arm64 平台可能需要使用 QEMU 模拟,会比较慢" cd "$BUILD_DIR" # 构建并推送多平台镜像 docker buildx build \ --platform $PLATFORMS \ --tag $FULL_IMAGE_TAG \ --tag $LATEST_IMAGE_TAG \ --push \ . if [ $? -ne 0 ]; then print_error "Docker 镜像构建失败" cd "$PROJECT_ROOT" exit 1 fi cd "$PROJECT_ROOT" print_success "多平台镜像构建完成" ################################################################################ # 步骤 7: 验证镜像推送 ################################################################################ print_step "步骤 7: 验证镜像推送" print_info "验证镜像是否成功推送到仓库..." # 使用 buildx imagetools 检查镜像 if docker buildx imagetools inspect $FULL_IMAGE_TAG &> /dev/null; then print_success "镜像已成功推送到: $FULL_IMAGE_TAG" # 显示镜像详细信息 print_info "镜像详细信息:" docker buildx imagetools inspect $FULL_IMAGE_TAG else print_warning "无法验证镜像推送状态,但构建过程未报错" fi ################################################################################ # 完成 ################################################################################ print_step "构建完成!" echo "" print_success "镜像已成功构建并推送到私有仓库" echo "" echo -e "${GREEN}镜像信息:${NC}" echo -e " 版本镜像: ${BLUE}$FULL_IMAGE_TAG${NC}" echo -e " 最新镜像: ${BLUE}$LATEST_IMAGE_TAG${NC}" echo -e " 支持平台: ${BLUE}$PLATFORMS${NC}" echo "" echo -e "${GREEN}使用方法:${NC}" echo "" echo -e "${YELLOW}1. 在 Mac (M1/M2) 或 Linux (ARM64) 上运行:${NC}" echo -e " docker run -d -p 8080:9090 -p 1883:1883 \\" echo -e " -v ~/.mytb-data:/data \\" echo -e " --name mytb \\" echo -e " $FULL_IMAGE_TAG" echo "" echo -e "${YELLOW}2. 在 Linux (x86_64/AMD64) 上运行:${NC}" echo -e " docker run -d -p 8080:9090 -p 1883:1883 \\" echo -e " -v ~/.mytb-data:/data \\" echo -e " --name mytb \\" echo -e " $FULL_IMAGE_TAG" echo "" echo -e "${YELLOW}3. 访问 ThingsBoard:${NC}" echo -e " http://localhost:8080" echo -e " 默认账号: ${BLUE}sysadmin@thingsboard.org${NC} / ${BLUE}sysadmin${NC}" echo "" print_success "脚本执行完成!"