测试方案: - lm2机器端口映射到本机:18080, 18081, 8082-8085 - 访问URL: http://localhost:18080/dashboard       端到端测试通过:  Co-authored-by: sundapeng.sdp <sundapeng@hashdata.cn> Reviewed-on: #35 Reviewed-by: xuxt <xuxt@zgclab.edu.cn> Reviewed-by: sundapeng <sundp@mail.zgclab.edu.cn> Reviewed-by: huhy <husteryezi@163.com>
292 lines
8.3 KiB
Bash
Executable File
292 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
GREEN='\033[0;32m'
|
||
BLUE='\033[0;34m'
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
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_help() {
|
||
echo "Argus-Metric Artifact 发布脚本"
|
||
echo
|
||
echo "用法: $0 <版本号> [选项]"
|
||
echo
|
||
echo "参数:"
|
||
echo " <版本号> 要发布的版本号,对应 artifact 目录中的版本"
|
||
echo
|
||
echo "选项:"
|
||
echo " --output-dir <路径> 指定输出目录 (默认: /private/argus/ftp/share/)"
|
||
echo " --owner <uid:gid> 指定文件所有者 (默认: 2133:2015)"
|
||
echo " -h, --help 显示此帮助信息"
|
||
echo
|
||
echo "示例:"
|
||
echo " $0 1.20.0 # 使用默认配置发布"
|
||
echo " $0 1.20.0 --output-dir /tmp/publish # 指定输出目录"
|
||
echo " $0 1.20.0 --owner 1000:1000 # 指定文件所有者"
|
||
echo " $0 1.20.0 --output-dir /srv/ftp --owner root:root # 同时指定两者"
|
||
echo
|
||
}
|
||
|
||
# 默认配置
|
||
DEFAULT_PUBLISH_DIR="/private/argus/ftp/share/"
|
||
DEFAULT_OWNER="2133:2015"
|
||
|
||
# 解析参数
|
||
VERSION=""
|
||
PUBLISH_DIR="$DEFAULT_PUBLISH_DIR"
|
||
OWNER="$DEFAULT_OWNER"
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
-h|--help)
|
||
show_help
|
||
exit 0
|
||
;;
|
||
--output-dir)
|
||
PUBLISH_DIR="$2"
|
||
shift 2
|
||
;;
|
||
--owner)
|
||
OWNER="$2"
|
||
shift 2
|
||
;;
|
||
*)
|
||
if [[ -z "$VERSION" ]]; then
|
||
VERSION="$1"
|
||
shift
|
||
else
|
||
log_error "未知参数: $1"
|
||
show_help
|
||
exit 1
|
||
fi
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# 检查版本号是否提供
|
||
if [[ -z "$VERSION" ]]; then
|
||
log_error "请提供版本号参数"
|
||
show_help
|
||
exit 1
|
||
fi
|
||
|
||
ARTIFACT_DIR="artifact/$VERSION"
|
||
|
||
# 检查版本目录是否存在
|
||
if [[ ! -d "$ARTIFACT_DIR" ]]; then
|
||
log_error "版本目录不存在: $ARTIFACT_DIR"
|
||
exit 1
|
||
fi
|
||
|
||
log_info "开始发布版本: $VERSION"
|
||
log_info "输出目录: $PUBLISH_DIR"
|
||
log_info "文件所有者: $OWNER"
|
||
|
||
# 确保发布目录存在
|
||
log_info "确保发布目录存在: $PUBLISH_DIR"
|
||
mkdir -p "$PUBLISH_DIR"
|
||
|
||
IFS=':' read -r OWNER_UID OWNER_GID <<< "$OWNER"
|
||
if [[ -z "$OWNER_UID" || -z "$OWNER_GID" ]]; then
|
||
log_error "--owner 格式不正确,应为 uid:gid"
|
||
exit 1
|
||
fi
|
||
|
||
CURRENT_UID=$(id -u)
|
||
CURRENT_GID=$(id -g)
|
||
if [[ "$OWNER_UID" != "$CURRENT_UID" || "$OWNER_GID" != "$CURRENT_GID" ]]; then
|
||
if [[ "$CURRENT_UID" -ne 0 ]]; then
|
||
log_error "当前用户 (${CURRENT_UID}:${CURRENT_GID}) 无法设置所有者为 ${OWNER_UID}:${OWNER_GID}"
|
||
log_error "请以目标用户运行脚本或预先调整目录权限"
|
||
exit 1
|
||
fi
|
||
NEED_CHOWN=true
|
||
else
|
||
NEED_CHOWN=false
|
||
fi
|
||
|
||
# 创建临时目录用于打包
|
||
TEMP_PACKAGE_DIR="/tmp/argus-metric-package-$$"
|
||
mkdir -p "$TEMP_PACKAGE_DIR"
|
||
|
||
# 复制所有 tar.gz 文件到临时目录
|
||
log_info "准备 artifact 文件..."
|
||
tar_files=$(find "$ARTIFACT_DIR" -name "*.tar.gz" -type f)
|
||
|
||
if [[ -z "$tar_files" ]]; then
|
||
log_error "在 $ARTIFACT_DIR 中未找到 tar.gz 文件"
|
||
exit 1
|
||
fi
|
||
|
||
for file in $tar_files; do
|
||
filename=$(basename "$file")
|
||
log_info " 准备: $filename"
|
||
cp "$file" "$TEMP_PACKAGE_DIR/"
|
||
done
|
||
|
||
# 复制版本信息文件
|
||
if [[ -f "$ARTIFACT_DIR/version.json" ]]; then
|
||
log_info "复制版本信息文件..."
|
||
cp "$ARTIFACT_DIR/version.json" "$TEMP_PACKAGE_DIR/"
|
||
fi
|
||
|
||
# 复制健康检查脚本
|
||
if [[ -f "$ARTIFACT_DIR/check_health.sh" ]]; then
|
||
log_info "复制健康检查脚本..."
|
||
cp "$ARTIFACT_DIR/check_health.sh" "$TEMP_PACKAGE_DIR/"
|
||
elif [[ -f "scripts/check_health.sh" ]]; then
|
||
log_info "复制健康检查脚本 (从当前目录)..."
|
||
cp "scripts/check_health.sh" "$TEMP_PACKAGE_DIR/"
|
||
else
|
||
log_warning "未找到 check_health.sh 文件"
|
||
fi
|
||
|
||
# 复制 DNS 同步脚本
|
||
if [[ -f "$ARTIFACT_DIR/sync_dns.sh" ]]; then
|
||
log_info "复制 DNS 同步脚本..."
|
||
cp "$ARTIFACT_DIR/sync_dns.sh" "$TEMP_PACKAGE_DIR/"
|
||
elif [[ -f "scripts/sync_dns.sh" ]]; then
|
||
log_info "复制 DNS 同步脚本 (从当前目录)..."
|
||
cp "scripts/sync_dns.sh" "$TEMP_PACKAGE_DIR/"
|
||
else
|
||
log_warning "未找到 sync_dns.sh 文件"
|
||
fi
|
||
|
||
# 复制版本校验脚本
|
||
if [[ -f "$ARTIFACT_DIR/check_version.sh" ]]; then
|
||
log_info "复制版本校验脚本..."
|
||
cp "$ARTIFACT_DIR/check_version.sh" "$TEMP_PACKAGE_DIR/"
|
||
elif [[ -f "scripts/check_version.sh" ]]; then
|
||
log_info "复制版本校验脚本 (从当前目录)..."
|
||
cp "scripts/check_version.sh" "$TEMP_PACKAGE_DIR/"
|
||
else
|
||
log_warning "未找到 check_version.sh 文件"
|
||
fi
|
||
|
||
# 复制重启失败脚本
|
||
if [[ -f "$ARTIFACT_DIR/restart_unhealthy.sh" ]]; then
|
||
log_info "复制重启失败脚本..."
|
||
cp "$ARTIFACT_DIR/restart_unhealthy.sh" "$TEMP_PACKAGE_DIR/"
|
||
elif [[ -f "scripts/restart_unhealthy.sh" ]]; then
|
||
log_info "复制重启失败脚本 (从当前目录)..."
|
||
cp "scripts/restart_unhealthy.sh" "$TEMP_PACKAGE_DIR/"
|
||
else
|
||
log_warning "未找到 restart_unhealthy.sh 文件"
|
||
fi
|
||
|
||
# 复制安装脚本并重命名为 install.sh
|
||
if [[ -f "scripts/install_artifact.sh" ]]; then
|
||
log_info "复制安装脚本..."
|
||
cp "scripts/install_artifact.sh" "$TEMP_PACKAGE_DIR/install.sh"
|
||
fi
|
||
|
||
if [[ -f "scripts/uninstall_artifact.sh" ]]; then
|
||
log_info "复制卸载脚本..."
|
||
cp "scripts/uninstall_artifact.sh" "$TEMP_PACKAGE_DIR/uninstall.sh"
|
||
fi
|
||
|
||
# 复制配置文件
|
||
if [[ -f "$ARTIFACT_DIR/config.env" ]]; then
|
||
log_info "复制配置文件..."
|
||
cp "$ARTIFACT_DIR/config.env" "$TEMP_PACKAGE_DIR/"
|
||
log_success "配置文件复制完成"
|
||
else
|
||
log_warning "未找到 config.env 文件"
|
||
fi
|
||
|
||
# DNS 配置文件将在后面直接复制到发布目录根目录,不包含在 tar.gz 中
|
||
|
||
# 复制 deps 目录
|
||
if [[ -d "$ARTIFACT_DIR/deps" ]]; then
|
||
log_info "复制系统依赖包..."
|
||
cp -r "$ARTIFACT_DIR/deps" "$TEMP_PACKAGE_DIR/"
|
||
log_success "系统依赖包复制完成"
|
||
fi
|
||
|
||
# 创建tar包,使用新的命名规范
|
||
TAR_NAME="argus-metric_$(echo $VERSION | tr '.' '_').tar.gz"
|
||
log_info "创建发布包: $TAR_NAME"
|
||
cd "$TEMP_PACKAGE_DIR"
|
||
tar -czf "$PUBLISH_DIR/$TAR_NAME" *
|
||
cd - > /dev/null
|
||
|
||
if [[ "$NEED_CHOWN" == true ]]; then
|
||
log_info "设置文件所有者为: $OWNER"
|
||
chown "$OWNER" "$PUBLISH_DIR/$TAR_NAME"
|
||
fi
|
||
|
||
# 清理临时目录
|
||
rm -rf "$TEMP_PACKAGE_DIR"
|
||
|
||
# 更新 LATEST_VERSION 文件
|
||
log_info "更新 LATEST_VERSION 文件..."
|
||
echo "$VERSION" > "$PUBLISH_DIR/LATEST_VERSION"
|
||
if [[ "$NEED_CHOWN" == true ]]; then
|
||
chown "$OWNER" "$PUBLISH_DIR/LATEST_VERSION"
|
||
fi
|
||
|
||
# 复制 DNS 配置文件到发布目录根目录(直接从 config 目录复制)
|
||
if [[ -f "config/dns.conf" ]]; then
|
||
log_info "复制 DNS 配置文件到发布目录根目录..."
|
||
cp "config/dns.conf" "$PUBLISH_DIR/"
|
||
if [[ "$NEED_CHOWN" == true ]]; then
|
||
chown "$OWNER" "$PUBLISH_DIR/dns.conf"
|
||
fi
|
||
log_success "DNS 配置文件复制完成: $PUBLISH_DIR/dns.conf"
|
||
else
|
||
log_warning "未找到 config/dns.conf 文件,跳过 DNS 配置文件复制"
|
||
fi
|
||
|
||
# 复制 setup.sh 到发布目录
|
||
if [[ -f "scripts/setup.sh" ]]; then
|
||
log_info "复制 setup.sh 到发布目录..."
|
||
cp "scripts/setup.sh" "$PUBLISH_DIR/"
|
||
if [[ "$NEED_CHOWN" == true ]]; then
|
||
chown "$OWNER" "$PUBLISH_DIR/setup.sh"
|
||
fi
|
||
fi
|
||
|
||
# 显示发布结果
|
||
log_success "版本 $VERSION 发布完成!"
|
||
echo
|
||
echo "发布目录: $PUBLISH_DIR"
|
||
echo "发布包: $PUBLISH_DIR/$TAR_NAME"
|
||
echo "包大小: $(du -h "$PUBLISH_DIR/$TAR_NAME" | cut -f1)"
|
||
echo "最新版本: $(cat "$PUBLISH_DIR/LATEST_VERSION")"
|
||
echo
|
||
echo "发布目录中的文件:"
|
||
ls -la "$PUBLISH_DIR" | while read line; do
|
||
echo " $line"
|
||
done
|
||
echo
|
||
echo "使用方法:"
|
||
echo " 1. 确保 /srv/ftp/share 目录可通过 FTP 访问"
|
||
echo " 2. 用户首先下载安装脚本:"
|
||
echo " curl -u ftpuser:admin1234 ftp://10.211.55.4/setup.sh -o setup.sh"
|
||
echo " 3. 然后执行安装 (自动获取最新版本):"
|
||
echo " sudo sh setup.sh"
|
||
echo " 4. 或者指定版本安装:"
|
||
echo " sudo sh setup.sh --version $VERSION"
|
||
echo " 5. 或者指定不同的FTP服务器:"
|
||
echo " sudo sh setup.sh --server 192.168.1.100 --user myuser --password mypass"
|