165 lines
5.0 KiB
Bash
Executable File
165 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CALLER_DIR="$(pwd)"
|
|
SAVE_ARTIFACT=false
|
|
ARTIFACT_DIR=""
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $(basename "$0") [--save-artifact] [--artifact-dir PATH]
|
|
|
|
Options:
|
|
--save-artifact Build image and export a compressed docker image archive.
|
|
Default export location is the current shell directory.
|
|
--artifact-dir Custom directory for exported archive. Implies --save-artifact.
|
|
-h, --help Show this help message.
|
|
EOF
|
|
}
|
|
|
|
parse_args() {
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--save-artifact)
|
|
SAVE_ARTIFACT=true
|
|
;;
|
|
--artifact-dir)
|
|
if [ $# -lt 2 ]; then
|
|
echo "缺少 --artifact-dir 的路径参数。"
|
|
exit 1
|
|
fi
|
|
SAVE_ARTIFACT=true
|
|
ARTIFACT_DIR="$2"
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "未知参数: $1"
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
}
|
|
|
|
export_image_artifact() {
|
|
local image_name=$1
|
|
local version=$2
|
|
local output_dir="${ARTIFACT_DIR:-$CALLER_DIR}"
|
|
local archive_name="nanobot-base-${version}.tar.gz"
|
|
local archive_path="${output_dir}/${archive_name}"
|
|
|
|
mkdir -p "${output_dir}"
|
|
|
|
echo ">> [额外步骤] 导出镜像产物到: ${archive_path}"
|
|
docker save "${image_name}" | gzip > "${archive_path}"
|
|
echo "✅ 已导出镜像产物: ${archive_path}"
|
|
}
|
|
|
|
# 执行拷贝和打包的核心函数
|
|
build_image() {
|
|
local dir_name=$1
|
|
local version=$2
|
|
local image_name="nanobot-base:${version}"
|
|
local previous_dir="${PWD}"
|
|
|
|
echo "=================================================="
|
|
echo "准备构建镜像: ${image_name}"
|
|
echo "=================================================="
|
|
|
|
# 1. 拷贝 Dashboard.Dockerfile
|
|
echo ">> [1/3] 拷贝 Dashboard.Dockerfile 到根目录 ..."
|
|
cp "${BASE_DIR}/Dashboard.Dockerfile" "${BASE_DIR}/${dir_name}/"
|
|
|
|
# 2. 拷贝 dashboard.py
|
|
echo ">> [2/3] 拷贝 dashboard.py 到 channels 目录 ..."
|
|
if [ -d "${BASE_DIR}/${dir_name}/nanobot/channels" ]; then
|
|
cp "${BASE_DIR}/dashboard.py" "${BASE_DIR}/${dir_name}/nanobot/channels/"
|
|
else
|
|
# 兜底创建 nanobot/channels/
|
|
mkdir -p "${BASE_DIR}/${dir_name}/nanobot/channels/"
|
|
cp "${BASE_DIR}/dashboard.py" "${BASE_DIR}/${dir_name}/nanobot/channels/"
|
|
fi
|
|
|
|
# 3. 执行 Docker build
|
|
echo ">> [3/3] 开始打包 Docker 镜像: ${image_name} ..."
|
|
cd "${BASE_DIR}/${dir_name}"
|
|
DOCKER_BUILDKIT=1 docker build \
|
|
--build-arg INSTALL_EXTRA_CLI="${INSTALL_EXTRA_CLI:-false}" \
|
|
-f Dashboard.Dockerfile \
|
|
-t "${image_name}" \
|
|
.
|
|
|
|
echo "=================================================="
|
|
echo "✅ 构建完成: ${image_name}"
|
|
echo "=================================================="
|
|
|
|
cd "${previous_dir}"
|
|
|
|
if [ "${SAVE_ARTIFACT}" = "true" ]; then
|
|
export_image_artifact "${image_name}" "${version}"
|
|
fi
|
|
}
|
|
|
|
parse_args "$@"
|
|
|
|
echo "请选择操作模式:"
|
|
echo "1) 从 Git 拉取最新代码并打包 (会覆盖已有同名目录)"
|
|
echo "2) 扫描本地已有的目录并打包"
|
|
read -p "输入选项 [1/2]: " mode
|
|
|
|
if [ "$mode" = "1" ]; then
|
|
echo "正在从 https://github.com/HKUDS/nanobot.git 获取最新版本号..."
|
|
LATEST_TAG=$(git ls-remote --tags https://github.com/HKUDS/nanobot.git | awk -F/ '{print $3}' | grep -v '\^{}$' | sort -V | tail -n1)
|
|
|
|
if [ -z "$LATEST_TAG" ]; then
|
|
echo "获取远程版本号失败,请检查网络或仓库地址。"
|
|
exit 1
|
|
fi
|
|
|
|
VERSION="${LATEST_TAG}"
|
|
DIR_NAME="nanobot-base-${VERSION}"
|
|
|
|
if [ -d "${BASE_DIR}/${DIR_NAME}" ]; then
|
|
echo ">> 清理已有的目录 ${DIR_NAME} ..."
|
|
rm -rf "${BASE_DIR}/${DIR_NAME}"
|
|
fi
|
|
|
|
echo ">> 正在克隆 nanobot (版本: ${VERSION}) ..."
|
|
git clone -b "${VERSION}" https://github.com/HKUDS/nanobot.git "${BASE_DIR}/${DIR_NAME}"
|
|
|
|
build_image "${DIR_NAME}" "${VERSION}"
|
|
|
|
elif [ "$mode" = "2" ]; then
|
|
echo "正在扫描本地目录..."
|
|
# 查找 nanobot-base-* 格式的目录
|
|
dirs=($(find "${BASE_DIR}" -maxdepth 1 -type d -name "nanobot-base-*" | awk -F/ '{print $NF}'))
|
|
|
|
if [ ${#dirs[@]} -eq 0 ]; then
|
|
echo "未找到任何本地克隆的目录 (格式: nanobot-base-*)。"
|
|
exit 1
|
|
fi
|
|
|
|
echo "找到以下本地目录,请选择要打包的目录:"
|
|
select DIR_NAME in "${dirs[@]}"; do
|
|
if [ -n "$DIR_NAME" ]; then
|
|
echo "您选择了: $DIR_NAME"
|
|
# 提取版本号,例如从 nanobot-base-v0.1.5 提取 v0.1.5
|
|
VERSION=${DIR_NAME#nanobot-base-}
|
|
build_image "${DIR_NAME}" "${VERSION}"
|
|
break
|
|
else
|
|
echo "无效的选项,请重新选择。"
|
|
fi
|
|
done
|
|
|
|
else
|
|
echo "无效的选项,退出。"
|
|
exit 1
|
|
fi
|