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