mirror of
https://github.com/MengMengCode/CLICD.git
synced 2026-08-07 22:24:42 +08:00
增强安装脚本发行版下载回退
This commit is contained in:
+130
-13
@@ -8,6 +8,7 @@ ACTION="${1:-install}"
|
|||||||
ACTION_CONFIRM="${2:-}"
|
ACTION_CONFIRM="${2:-}"
|
||||||
ISSUE_URL="https://github.com/${REPO}/issues"
|
ISSUE_URL="https://github.com/${REPO}/issues"
|
||||||
LOG_FILE="${CLICD_LOG_FILE:-/var/log/clicd-install.log}"
|
LOG_FILE="${CLICD_LOG_FILE:-/var/log/clicd-install.log}"
|
||||||
|
INSTALL_DOWNLOAD_MARKER="${CLICD_INSTALL_DOWNLOAD_MARKER:-/tmp/clicd-install-dir.$$}"
|
||||||
|
|
||||||
echo "====================================="
|
echo "====================================="
|
||||||
echo " CLICD 中文安装/卸载脚本"
|
echo " CLICD 中文安装/卸载脚本"
|
||||||
@@ -828,6 +829,59 @@ try_enable_project_quota() {
|
|||||||
log "ext4 project quota 未启用,CLICD 将自动回退到 loopback 镜像磁盘限制模式。"
|
log "ext4 project quota 未启用,CLICD 将自动回退到 loopback 镜像磁盘限制模式。"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
download_file() {
|
||||||
|
url="$1"
|
||||||
|
dest="$2"
|
||||||
|
rm -f "$dest"
|
||||||
|
|
||||||
|
if has_cmd curl; then
|
||||||
|
curl -fL --retry 6 --retry-delay 2 --connect-timeout 20 --max-time 600 "$url" -o "$dest"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if has_cmd wget; then
|
||||||
|
wget --tries=6 --timeout=30 --waitretry=2 -O "$dest" "$url"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
return 127
|
||||||
|
}
|
||||||
|
|
||||||
|
release_api_json() {
|
||||||
|
api_url="https://api.github.com/repos/${REPO}/releases/latest"
|
||||||
|
|
||||||
|
if has_cmd curl; then
|
||||||
|
curl -fsSL --retry 3 --retry-delay 2 --connect-timeout 20 --max-time 120 "$api_url" 2>/dev/null || true
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if has_cmd wget; then
|
||||||
|
wget -qO- --tries=3 --timeout=30 "$api_url" 2>/dev/null || true
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
release_asset_url() {
|
||||||
|
asset_name="$1"
|
||||||
|
|
||||||
|
if [ "$CLICD_INSTALL_VERSION" != "latest" ]; then
|
||||||
|
printf '%s\n' "https://github.com/${REPO}/releases/download/${CLICD_INSTALL_VERSION}/${asset_name}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
api_data="$(release_api_json)"
|
||||||
|
url="$(printf '%s\n' "$api_data" | sed -n 's/.*"browser_download_url": *"\([^"]*\/'"$asset_name"'\)".*/\1/p' | head -n 1)"
|
||||||
|
if [ -n "$url" ]; then
|
||||||
|
printf '%s\n' "$url"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
tag="$(printf '%s\n' "$api_data" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | head -n 1)"
|
||||||
|
if [ -n "$tag" ]; then
|
||||||
|
printf '%s\n' "https://github.com/${REPO}/releases/download/${tag}/${asset_name}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '%s\n' "https://github.com/${REPO}/releases/latest/download/${asset_name}"
|
||||||
|
}
|
||||||
|
|
||||||
download_release_if_needed() {
|
download_release_if_needed() {
|
||||||
if [ -f "./clicd" ]; then
|
if [ -f "./clicd" ]; then
|
||||||
return
|
return
|
||||||
@@ -843,22 +897,66 @@ download_release_if_needed() {
|
|||||||
log "正在下载发行版包:${download_url}"
|
log "正在下载发行版包:${download_url}"
|
||||||
|
|
||||||
tmp_dir="$(mktemp -d)"
|
tmp_dir="$(mktemp -d)"
|
||||||
trap 'rm -rf "$tmp_dir"' 0
|
rm -f "$INSTALL_DOWNLOAD_MARKER"
|
||||||
|
printf '%s\n' "$tmp_dir" > "$INSTALL_DOWNLOAD_MARKER" || die "Failed to write install temp marker."
|
||||||
|
|
||||||
if has_cmd curl; then
|
if ! has_cmd curl && ! has_cmd wget; then
|
||||||
curl -fL --retry 6 --retry-delay 2 --connect-timeout 20 --max-time 600 "$download_url" -o "$tmp_dir/$ASSET" ||
|
|
||||||
die "Release package download failed: $download_url"
|
|
||||||
elif has_cmd wget; then
|
|
||||||
wget --tries=6 --timeout=30 --waitretry=2 -O "$tmp_dir/$ASSET" "$download_url" ||
|
|
||||||
die "Release package download failed: $download_url"
|
|
||||||
else
|
|
||||||
die "下载发行版包需要 curl 或 wget。"
|
die "下载发行版包需要 curl 或 wget。"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -s "$tmp_dir/$ASSET" ] || die "Release package is empty: $download_url"
|
archive_path="$tmp_dir/$ASSET"
|
||||||
tar -xzf "$tmp_dir/$ASSET" -C "$tmp_dir" || die "Failed to extract release package: $tmp_dir/$ASSET"
|
archive_urls="$download_url"
|
||||||
cd "$tmp_dir/clicd-linux-amd64" || die "Release package layout is invalid: missing clicd-linux-amd64 directory"
|
resolved_archive_url="$(release_asset_url "$ASSET")"
|
||||||
[ -f "./clicd" ] || die "下载的发行版包中未找到 clicd 二进制。"
|
if [ "$resolved_archive_url" != "$download_url" ]; then
|
||||||
|
archive_urls="$archive_urls $resolved_archive_url"
|
||||||
|
fi
|
||||||
|
|
||||||
|
archive_ok=0
|
||||||
|
for url in $archive_urls; do
|
||||||
|
[ -n "$url" ] || continue
|
||||||
|
log "Trying release archive: $url"
|
||||||
|
if download_file "$url" "$archive_path" && [ -s "$archive_path" ]; then
|
||||||
|
archive_ok=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
warn "Release archive download failed, trying next source: $url"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$archive_ok" = "1" ]; then
|
||||||
|
tar -xzf "$archive_path" -C "$tmp_dir" || die "Failed to extract release package: $archive_path"
|
||||||
|
else
|
||||||
|
binary_asset="clicd-linux-amd64"
|
||||||
|
if [ "$CLICD_INSTALL_VERSION" = "latest" ]; then
|
||||||
|
binary_url="https://github.com/${REPO}/releases/latest/download/${binary_asset}"
|
||||||
|
else
|
||||||
|
binary_url="https://github.com/${REPO}/releases/download/${CLICD_INSTALL_VERSION}/${binary_asset}"
|
||||||
|
fi
|
||||||
|
binary_urls="$binary_url"
|
||||||
|
resolved_binary_url="$(release_asset_url "$binary_asset")"
|
||||||
|
if [ "$resolved_binary_url" != "$binary_url" ]; then
|
||||||
|
binary_urls="$binary_urls $resolved_binary_url"
|
||||||
|
fi
|
||||||
|
|
||||||
|
binary_path="$tmp_dir/$binary_asset"
|
||||||
|
binary_ok=0
|
||||||
|
for url in $binary_urls; do
|
||||||
|
[ -n "$url" ] || continue
|
||||||
|
log "Trying release binary: $url"
|
||||||
|
if download_file "$url" "$binary_path" && [ -s "$binary_path" ]; then
|
||||||
|
mkdir -p "$tmp_dir/clicd-linux-amd64"
|
||||||
|
cp "$binary_path" "$tmp_dir/clicd-linux-amd64/clicd"
|
||||||
|
chmod +x "$tmp_dir/clicd-linux-amd64/clicd"
|
||||||
|
binary_ok=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
warn "Release binary download failed, trying next source: $url"
|
||||||
|
done
|
||||||
|
|
||||||
|
[ "$binary_ok" = "1" ] || die "Release package download failed: $download_url"
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -d "$tmp_dir/clicd-linux-amd64" ] || die "Release package layout is invalid: missing clicd-linux-amd64 directory"
|
||||||
|
[ -f "$tmp_dir/clicd-linux-amd64/clicd" ] || die "下载的发行版包中未找到 clicd 二进制。"
|
||||||
}
|
}
|
||||||
|
|
||||||
install_binary() {
|
install_binary() {
|
||||||
@@ -869,12 +967,31 @@ install_binary() {
|
|||||||
rc-service clicd stop >/dev/null 2>&1 || true
|
rc-service clicd stop >/dev/null 2>&1 || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
bin_src="./clicd"
|
||||||
|
download_dir=""
|
||||||
|
if [ ! -f "$bin_src" ] && [ -f "$INSTALL_DOWNLOAD_MARKER" ]; then
|
||||||
|
download_dir="$(sed -n '1p' "$INSTALL_DOWNLOAD_MARKER" 2>/dev/null || true)"
|
||||||
|
if [ -n "$download_dir" ] && [ -f "$download_dir/clicd-linux-amd64/clicd" ]; then
|
||||||
|
bin_src="$download_dir/clicd-linux-amd64/clicd"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
[ -f "$bin_src" ] || die "未找到 clicd 二进制,安装无法继续。"
|
||||||
|
|
||||||
tmp_bin="/usr/local/bin/clicd.new.$$"
|
tmp_bin="/usr/local/bin/clicd.new.$$"
|
||||||
cp ./clicd "$tmp_bin"
|
cp "$bin_src" "$tmp_bin"
|
||||||
chmod +x "$tmp_bin"
|
chmod +x "$tmp_bin"
|
||||||
mv -f "$tmp_bin" /usr/local/bin/clicd
|
mv -f "$tmp_bin" /usr/local/bin/clicd
|
||||||
chmod +x /usr/local/bin/clicd
|
chmod +x /usr/local/bin/clicd
|
||||||
log "已安装二进制:/usr/local/bin/clicd"
|
log "已安装二进制:/usr/local/bin/clicd"
|
||||||
|
|
||||||
|
if [ -n "$download_dir" ]; then
|
||||||
|
case "$download_dir" in
|
||||||
|
/tmp/*)
|
||||||
|
rm -rf "$download_dir"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
rm -f "$INSTALL_DOWNLOAD_MARKER"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
install_systemd_service() {
|
install_systemd_service() {
|
||||||
|
|||||||
Reference in New Issue
Block a user