first commit
Some checks failed
Some checks failed
This commit is contained in:
318
build-and-push.sh
Executable file
318
build-and-push.sh
Executable file
@@ -0,0 +1,318 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 创智未来信奥工具箱 - Docker镜像构建和发布脚本
|
||||
# 发布到阿里云镜像仓库: registry.cn-hangzhou.aliyuncs.com/nick-x86
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
# 配置变量
|
||||
REGISTRY="registry.cn-hangzhou.aliyuncs.com"
|
||||
NAMESPACE="nick-x86"
|
||||
IMAGE_NAME="i-tools"
|
||||
# 目标平台配置(服务器是x86架构)
|
||||
PLATFORM="linux/amd64"
|
||||
CURRENT_ARCH=$(uname -m)
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 日志函数
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# 显示横幅
|
||||
show_banner() {
|
||||
echo -e "${BLUE}"
|
||||
echo "================================================="
|
||||
echo " 创智未来信奥工具箱 Docker 构建发布脚本"
|
||||
echo "================================================="
|
||||
echo -e "${NC}"
|
||||
}
|
||||
|
||||
# 获取版本号
|
||||
get_version() {
|
||||
if [ -f "package.json" ]; then
|
||||
VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "latest")
|
||||
else
|
||||
VERSION="latest"
|
||||
fi
|
||||
|
||||
# 如果传入了版本参数,使用传入的版本
|
||||
if [ ! -z "$1" ]; then
|
||||
VERSION="$1"
|
||||
log_info "使用指定版本: $VERSION"
|
||||
else
|
||||
log_info "从 package.json 读取版本: $VERSION"
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查Docker是否安装
|
||||
check_docker() {
|
||||
if ! command -v docker &> /dev/null; then
|
||||
log_error "Docker 未安装或不在 PATH 中"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! docker info &> /dev/null; then
|
||||
log_error "Docker 守护进程未运行"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Docker 环境检查通过"
|
||||
}
|
||||
|
||||
# 检查是否已登录阿里云镜像仓库
|
||||
check_registry_login() {
|
||||
log_info "检查阿里云镜像仓库登录状态..."
|
||||
|
||||
if ! docker system info | grep -q "Registry:"; then
|
||||
log_warning "建议先登录阿里云镜像仓库"
|
||||
echo "请运行以下命令登录:"
|
||||
echo "docker login --username=yf6230065@163.com $REGISTRY"
|
||||
|
||||
read -p "是否已经登录?(y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
log_error "请先登录阿里云镜像仓库后再运行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
log_success "镜像仓库登录状态检查通过"
|
||||
}
|
||||
|
||||
# 构建镜像
|
||||
build_image() {
|
||||
local full_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:$VERSION"
|
||||
local latest_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:latest"
|
||||
|
||||
log_info "开始构建 Docker 镜像..."
|
||||
log_info "镜像名称: $full_image_name"
|
||||
log_info "当前架构: $CURRENT_ARCH"
|
||||
log_info "目标平台: $PLATFORM (服务器x86架构)"
|
||||
|
||||
# 构建x86架构镜像
|
||||
local build_opts=()
|
||||
if [ "$NO_CACHE" = true ]; then
|
||||
build_opts+=(--no-cache)
|
||||
fi
|
||||
|
||||
if docker build \
|
||||
"${build_opts[@]}" \
|
||||
--platform "$PLATFORM" \
|
||||
--tag "$full_image_name" \
|
||||
--tag "$latest_image_name" \
|
||||
--build-arg BUILD_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
|
||||
--build-arg VERSION="$VERSION" \
|
||||
. ; then
|
||||
log_success "x86架构镜像构建成功"
|
||||
echo " - $full_image_name"
|
||||
echo " - $latest_image_name"
|
||||
|
||||
if [ "$CURRENT_ARCH" = "arm64" ]; then
|
||||
log_warning "注意: 在ARM64机器上构建的x86镜像,适用于x86服务器部署"
|
||||
fi
|
||||
else
|
||||
log_error "镜像构建失败"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 推送镜像
|
||||
push_image() {
|
||||
local full_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:$VERSION"
|
||||
local latest_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:latest"
|
||||
|
||||
log_info "开始推送镜像到阿里云镜像仓库..."
|
||||
|
||||
# 推送带版本号的镜像
|
||||
log_info "推送版本镜像: $full_image_name"
|
||||
if docker push "$full_image_name"; then
|
||||
log_success "版本镜像推送成功"
|
||||
else
|
||||
log_error "版本镜像推送失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 推送latest镜像
|
||||
log_info "推送latest镜像: $latest_image_name"
|
||||
if docker push "$latest_image_name"; then
|
||||
log_success "latest镜像推送成功"
|
||||
else
|
||||
log_error "latest镜像推送失败"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 清理本地镜像(可选)
|
||||
cleanup_local() {
|
||||
read -p "是否清理本地构建的镜像?(y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
local full_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:$VERSION"
|
||||
local latest_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:latest"
|
||||
|
||||
log_info "清理本地镜像..."
|
||||
docker rmi "$full_image_name" "$latest_image_name" 2>/dev/null || true
|
||||
log_success "本地镜像清理完成"
|
||||
fi
|
||||
}
|
||||
|
||||
# 显示部署信息
|
||||
show_deployment_info() {
|
||||
local full_image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:$VERSION"
|
||||
|
||||
echo -e "${GREEN}"
|
||||
echo "================================================="
|
||||
echo " 镜像发布成功!"
|
||||
echo "================================================="
|
||||
echo -e "${NC}"
|
||||
echo "镜像地址:"
|
||||
echo " 版本镜像: $full_image_name"
|
||||
echo " 最新镜像: $REGISTRY/$NAMESPACE/$IMAGE_NAME:latest"
|
||||
echo ""
|
||||
echo "使用方法:"
|
||||
echo " docker pull $full_image_name"
|
||||
echo " docker run -p 3000:3000 $full_image_name"
|
||||
echo ""
|
||||
echo "启用测试点生成-大模型(可选,需宿主机有 .env):"
|
||||
echo " docker run -p 3000:3000 --env-file .env $full_image_name"
|
||||
echo " 或: docker run -p 3000:3000 -e ENABLE_AI=true -e DASHSCOPE_API_KEY=sk-xxx $full_image_name"
|
||||
echo ""
|
||||
echo "Docker Compose 示例:"
|
||||
echo " image: $full_image_name"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# 解析命令行参数
|
||||
parse_args() {
|
||||
BUILD_ONLY=false
|
||||
NO_CACHE=false
|
||||
VERSION_ARG=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-v|--version)
|
||||
if [ -z "$2" ]; then
|
||||
log_error "-v/--version 参数需要指定版本号"
|
||||
exit 1
|
||||
fi
|
||||
VERSION_ARG="$2"
|
||||
shift 2
|
||||
;;
|
||||
--build-only)
|
||||
BUILD_ONLY=true
|
||||
shift
|
||||
;;
|
||||
--no-cache)
|
||||
NO_CACHE=true
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
# 如果没有使用 -v 参数,第一个参数作为版本号
|
||||
if [ -z "$VERSION_ARG" ]; then
|
||||
VERSION_ARG="$1"
|
||||
else
|
||||
log_error "未知参数: $1"
|
||||
show_help
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
show_banner
|
||||
|
||||
# 解析命令行参数
|
||||
parse_args "$@"
|
||||
|
||||
# 获取版本号
|
||||
get_version "$VERSION_ARG"
|
||||
|
||||
# 环境检查
|
||||
check_docker
|
||||
check_registry_login
|
||||
|
||||
# 构建镜像
|
||||
if [ "$NO_CACHE" = true ]; then
|
||||
# 如果支持 --no-cache,需要修改 build_image 函数
|
||||
log_info "使用 --no-cache 选项构建(当前版本暂不支持,将正常构建)"
|
||||
fi
|
||||
build_image
|
||||
|
||||
# 如果不是仅构建,则推送镜像
|
||||
if [ "$BUILD_ONLY" = false ]; then
|
||||
push_image
|
||||
# 显示结果
|
||||
show_deployment_info
|
||||
else
|
||||
log_info "仅构建模式,跳过推送步骤"
|
||||
log_success "镜像构建完成!"
|
||||
fi
|
||||
|
||||
# 可选清理
|
||||
cleanup_local
|
||||
|
||||
log_success "所有操作完成!"
|
||||
}
|
||||
|
||||
# 帮助信息
|
||||
show_help() {
|
||||
echo "创智未来信奥工具箱 Docker 构建发布脚本"
|
||||
echo ""
|
||||
echo "用法:"
|
||||
echo " $0 [选项] [版本号]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " -v, --version <版本号> 指定要构建的版本号"
|
||||
echo " --build-only 仅构建镜像,不推送"
|
||||
echo " --no-cache 不使用缓存构建(暂未实现)"
|
||||
echo " -h, --help 显示此帮助信息"
|
||||
echo ""
|
||||
echo "参数:"
|
||||
echo " 版本号 可选,指定要构建的版本号,默认从package.json读取"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
echo " $0 # 使用package.json中的版本"
|
||||
echo " $0 1.0.4 # 使用指定版本1.0.4"
|
||||
echo " $0 -v 1.0.4 # 使用 -v 参数指定版本1.0.4"
|
||||
echo " $0 --version 1.0.4 # 使用 --version 参数指定版本1.0.4"
|
||||
echo " $0 --build-only # 仅构建,不推送"
|
||||
echo " $0 -v 1.0.4 --build-only # 指定版本并仅构建"
|
||||
echo ""
|
||||
echo "环境要求:"
|
||||
echo " - Docker已安装并运行"
|
||||
echo " - 已登录阿里云镜像仓库"
|
||||
echo ""
|
||||
echo "登录命令:"
|
||||
echo " docker login --username=<用户名> $REGISTRY"
|
||||
}
|
||||
|
||||
# 脚本入口
|
||||
# 运行主函数,传入所有参数
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user