|
|
#!/usr/bin/env bash
|
|
|
# 在容器内执行:为各子项目 npm ci,再调用仓库根脚本(路径挂载为 /work)。
|
|
|
set -euo pipefail
|
|
|
cd /work
|
|
|
BUILD_ARCH="${BUILD_ARCH:-all}"
|
|
|
ALLOW_RUNTIME_APT_FIX="${ALLOW_RUNTIME_APT_FIX:-1}"
|
|
|
CARGO_REGISTRY_MIRROR="${CARGO_REGISTRY_MIRROR:-https://rsproxy.cn/index/}"
|
|
|
CARGO_NET_RETRY="${CARGO_NET_RETRY:-8}"
|
|
|
CARGO_HTTP_TIMEOUT="${CARGO_HTTP_TIMEOUT:-120}"
|
|
|
CARGO_HTTP_MULTIPLEXING="${CARGO_HTTP_MULTIPLEXING:-false}"
|
|
|
|
|
|
# npm 网络增强:默认使用官方 registry,可通过 NPM_REGISTRY 覆盖;增加超时与重试,减少 ECONNRESET 失败概率。
|
|
|
npm config set registry "${NPM_REGISTRY:-https://registry.npmjs.org/}"
|
|
|
npm config set fetch-retries 5
|
|
|
npm config set fetch-retry-factor 2
|
|
|
npm config set fetch-retry-mintimeout 20000
|
|
|
npm config set fetch-retry-maxtimeout 120000
|
|
|
npm config set fetch-timeout 300000
|
|
|
|
|
|
mkdir -p "${CARGO_HOME:-/opt/cargo}"
|
|
|
cat > "${CARGO_HOME:-/opt/cargo}/config.toml" <<EOF
|
|
|
[net]
|
|
|
retry = ${CARGO_NET_RETRY}
|
|
|
|
|
|
[http]
|
|
|
timeout = ${CARGO_HTTP_TIMEOUT}
|
|
|
multiplexing = ${CARGO_HTTP_MULTIPLEXING}
|
|
|
|
|
|
[registries.crates-io]
|
|
|
protocol = "sparse"
|
|
|
|
|
|
[source.crates-io]
|
|
|
replace-with = "mirror"
|
|
|
|
|
|
[source.mirror]
|
|
|
registry = "sparse+${CARGO_REGISTRY_MIRROR}"
|
|
|
EOF
|
|
|
|
|
|
ensure_amd64_deps() {
|
|
|
local x64_pc_dir="/usr/lib/x86_64-linux-gnu/pkgconfig"
|
|
|
local missing=0
|
|
|
for f in glib-2.0.pc gdk-3.0.pc webkit2gtk-4.0.pc; do
|
|
|
if [[ ! -f "$x64_pc_dir/$f" ]]; then
|
|
|
missing=1
|
|
|
break
|
|
|
fi
|
|
|
done
|
|
|
if [[ "$missing" -eq 0 ]]; then
|
|
|
return
|
|
|
fi
|
|
|
|
|
|
if [[ "$ALLOW_RUNTIME_APT_FIX" != "1" ]]; then
|
|
|
echo "错误: 缺少 amd64 依赖(x86_64 pkg-config 文件不完整),且 ALLOW_RUNTIME_APT_FIX=0。" >&2
|
|
|
echo "请先重建镜像(scripts/docker/Dockerfile),或设置 ALLOW_RUNTIME_APT_FIX=1 允许运行时联网补依赖。" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
echo "==> 运行时补齐 amd64 依赖(ALLOW_RUNTIME_APT_FIX=1)"
|
|
|
apt-get update
|
|
|
apt-get install -y --no-install-recommends \
|
|
|
build-essential:amd64 pkg-config:amd64 patchelf:amd64 \
|
|
|
libglib2.0-dev:amd64 libgtk-3-dev:amd64 \
|
|
|
libbrotli-dev:amd64 \
|
|
|
libsoup2.4-dev:amd64 \
|
|
|
libwebkit2gtk-4.0-dev:amd64 libjavascriptcoregtk-4.0-dev:amd64 \
|
|
|
libayatana-appindicator3-dev:amd64 librsvg2-dev:amd64 libssl-dev:amd64
|
|
|
}
|
|
|
|
|
|
ensure_arm64_deps() {
|
|
|
local arm64_pc_dir="/usr/lib/aarch64-linux-gnu/pkgconfig"
|
|
|
local missing=0
|
|
|
for f in glib-2.0.pc gdk-3.0.pc webkit2gtk-4.0.pc; do
|
|
|
if [[ ! -f "$arm64_pc_dir/$f" ]]; then
|
|
|
missing=1
|
|
|
break
|
|
|
fi
|
|
|
done
|
|
|
if [[ "$missing" -eq 0 ]]; then
|
|
|
return
|
|
|
fi
|
|
|
|
|
|
if [[ "$ALLOW_RUNTIME_APT_FIX" != "1" ]]; then
|
|
|
echo "错误: 缺少 arm64 交叉依赖(aarch64 pkg-config 文件不完整),且 ALLOW_RUNTIME_APT_FIX=0。" >&2
|
|
|
echo "请先重建镜像(scripts/docker/Dockerfile),或设置 ALLOW_RUNTIME_APT_FIX=1 允许运行时联网补依赖。" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
echo "==> 运行时补齐 arm64 交叉依赖(ALLOW_RUNTIME_APT_FIX=1)"
|
|
|
apt-get update
|
|
|
apt-get install -y --no-install-recommends \
|
|
|
-o Dpkg::Options::="--force-overwrite" \
|
|
|
gcc-aarch64-linux-gnu \
|
|
|
libglib2.0-dev:arm64 libgtk-3-dev:arm64 \
|
|
|
libbrotli-dev:arm64 \
|
|
|
libsoup2.4-dev:arm64 \
|
|
|
libcairo2-dev:arm64 libpango1.0-dev:arm64 \
|
|
|
libgdk-pixbuf2.0-dev:arm64 libatk1.0-dev:arm64 libepoxy-dev:arm64 \
|
|
|
libwebkit2gtk-4.0-dev:arm64 libjavascriptcoregtk-4.0-dev:arm64 \
|
|
|
libssl-dev:arm64 libayatana-appindicator3-dev:arm64 librsvg2-dev:arm64
|
|
|
}
|
|
|
|
|
|
case "$BUILD_ARCH" in
|
|
|
amd64)
|
|
|
ensure_amd64_deps
|
|
|
;;
|
|
|
arm64)
|
|
|
ensure_arm64_deps
|
|
|
;;
|
|
|
all)
|
|
|
ensure_amd64_deps
|
|
|
ensure_arm64_deps
|
|
|
;;
|
|
|
*)
|
|
|
echo "错误: BUILD_ARCH 仅支持 all|amd64|arm64,当前为 \"$BUILD_ARCH\"" >&2
|
|
|
exit 1
|
|
|
;;
|
|
|
esac
|
|
|
|
|
|
if (($# == 0)); then
|
|
|
mapfile -t projects < <(bash /work/scripts/build-linux-deb-all.sh --list-projects)
|
|
|
else
|
|
|
projects=("$@")
|
|
|
fi
|
|
|
|
|
|
if (( ${#projects[@]} == 0 )); then
|
|
|
echo "错误: 没有可构建项目" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
for d in "${projects[@]}"; do
|
|
|
if [[ ! -f "$d/package.json" ]]; then
|
|
|
echo "错误: 缺少 /work/$d/package.json" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
if [[ "${CLEAN_TAURI_TARGET:-1}" == "1" && -d "$d/src-tauri/target" ]]; then
|
|
|
echo "==> 清理 $d/src-tauri/target(避免复用损坏缓存)"
|
|
|
rm -rf "$d/src-tauri/target"
|
|
|
fi
|
|
|
(
|
|
|
cd "$d"
|
|
|
# npm ci 网络偶发抖动时最多重试 3 次
|
|
|
for i in 1 2 3; do
|
|
|
if npm ci; then
|
|
|
break
|
|
|
fi
|
|
|
if [[ "$i" -eq 3 ]]; then
|
|
|
echo "错误: $d npm ci 连续 3 次失败" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
echo "警告: $d npm ci 失败,10 秒后重试($i/3)..." >&2
|
|
|
sleep 10
|
|
|
done
|
|
|
)
|
|
|
done
|
|
|
exec bash /work/scripts/build-linux-deb-all.sh --arch "$BUILD_ARCH" "${projects[@]}"
|