|
|
#!/usr/bin/env bash
|
|
|
# 在容器内执行:为各子项目 npm ci,再调用仓库根脚本(路径挂载为 /work)。
|
|
|
set -euo pipefail
|
|
|
cd /work
|
|
|
BUILD_ARCH="${BUILD_ARCH:-all}"
|
|
|
|
|
|
# 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
|
|
|
|
|
|
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
|
|
|
|
|
|
echo "==> 补齐 amd64 依赖(当前容器缺少 x86_64 pkg-config 文件)"
|
|
|
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
|
|
|
|
|
|
echo "==> 补齐 arm64 交叉依赖(当前容器缺少 aarch64 pkg-config 文件)"
|
|
|
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
|
|
|
(
|
|
|
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[@]}"
|