From 54f1f6970c2056c67ab660328e19e1cefb3909e3 Mon Sep 17 00:00:00 2001 From: Syngnat Date: Mon, 8 Jun 2026 16:14:05 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(ci):=20=E5=A2=9E=E5=BC=BADuc?= =?UTF-8?q?kDB=E5=BA=93=E4=B8=8B=E8=BD=BD=E5=AE=B9=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 Windows DuckDB 动态库下载增加 curl 重试和超时控制 - 增加 zip 校验与 duckdb.dll/duckdb.lib 存在性检查 - 下载失败时清理临时目录后重试,避免空文件继续参与链接 - 同步修复 dev-build 与 release 工作流的相同脆弱点 --- .github/workflows/dev-build.yml | 38 ++++++++++++++++++++++++++++----- .github/workflows/release.yml | 38 ++++++++++++++++++++++++++++----- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 65d3150..37c4463 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -550,11 +550,39 @@ jobs: return 0 fi mkdir -p "$lib_dir" - curl -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path" - unzip -qo "$zip_path" -d "$lib_dir" - cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.dll.a" - cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.a" - echo "$lib_dir" + rm -f "$zip_path" + local attempt dll_path lib_path + for attempt in 1 2 3; do + echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}" + if curl --retry 3 --retry-delay 2 --retry-all-errors --connect-timeout 20 --max-time 300 -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path"; then + if unzip -tq "$zip_path" >/dev/null 2>&1; then + rm -rf "$lib_dir" + mkdir -p "$lib_dir" + unzip -qo "$zip_path" -d "$lib_dir" + dll_path="$(find "$lib_dir" -type f -name duckdb.dll | head -n 1 || true)" + lib_path="$(find "$lib_dir" -type f -name duckdb.lib | head -n 1 || true)" + if [ -n "$dll_path" ] && [ -n "$lib_path" ]; then + cp "$dll_path" "$lib_dir/duckdb.dll" + cp "$lib_path" "$lib_dir/duckdb.lib" + cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.dll.a" + cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.a" + echo "$lib_dir" + return 0 + fi + echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll 或 duckdb.lib,准备重试" + else + echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试" + fi + else + echo "⚠️ DuckDB Windows 动态库下载失败,准备重试" + fi + rm -f "$zip_path" + rm -rf "$lib_dir" + mkdir -p "$lib_dir" + sleep $((attempt * 2)) + done + echo "❌ 无法准备 DuckDB Windows 动态库:${DUCKDB_WINDOWS_LIBRARY_URL}" >&2 + return 1 } for DRIVER in "${DRIVERS[@]}"; do diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7a621fb..75af6fe 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -548,11 +548,39 @@ jobs: return 0 fi mkdir -p "$lib_dir" - curl -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path" - unzip -qo "$zip_path" -d "$lib_dir" - cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.dll.a" - cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.a" - echo "$lib_dir" + rm -f "$zip_path" + local attempt dll_path lib_path + for attempt in 1 2 3; do + echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}" + if curl --retry 3 --retry-delay 2 --retry-all-errors --connect-timeout 20 --max-time 300 -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path"; then + if unzip -tq "$zip_path" >/dev/null 2>&1; then + rm -rf "$lib_dir" + mkdir -p "$lib_dir" + unzip -qo "$zip_path" -d "$lib_dir" + dll_path="$(find "$lib_dir" -type f -name duckdb.dll | head -n 1 || true)" + lib_path="$(find "$lib_dir" -type f -name duckdb.lib | head -n 1 || true)" + if [ -n "$dll_path" ] && [ -n "$lib_path" ]; then + cp "$dll_path" "$lib_dir/duckdb.dll" + cp "$lib_path" "$lib_dir/duckdb.lib" + cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.dll.a" + cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.a" + echo "$lib_dir" + return 0 + fi + echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll 或 duckdb.lib,准备重试" + else + echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试" + fi + else + echo "⚠️ DuckDB Windows 动态库下载失败,准备重试" + fi + rm -f "$zip_path" + rm -rf "$lib_dir" + mkdir -p "$lib_dir" + sleep $((attempt * 2)) + done + echo "❌ 无法准备 DuckDB Windows 动态库:${DUCKDB_WINDOWS_LIBRARY_URL}" >&2 + return 1 } for DRIVER in "${DRIVERS[@]}"; do