#!/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" <&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[@]}"