|
|
#!/usr/bin/env bash
|
|
|
# 在宿主机上:先打 amd64,再在容器中打 arm64(均支持自动发现项目)。
|
|
|
set -euo pipefail
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
IMAGE_TAG="${IMAGE_TAG:-tauri-linux-deb:24.04}"
|
|
|
RUN_MODE="${RUN_MODE:-hybrid}" # hybrid: host amd64 + docker arm64; docker: docker all
|
|
|
PROJECT_ARGS=()
|
|
|
|
|
|
while (($# > 0)); do
|
|
|
case "$1" in
|
|
|
--docker-only)
|
|
|
RUN_MODE="docker"
|
|
|
shift
|
|
|
;;
|
|
|
--hybrid)
|
|
|
RUN_MODE="hybrid"
|
|
|
shift
|
|
|
;;
|
|
|
--help|-h)
|
|
|
cat <<EOF
|
|
|
用法:
|
|
|
$(basename "$0") [--docker-only|--hybrid] [项目名...]
|
|
|
|
|
|
说明:
|
|
|
--hybrid 宿主机构建 amd64,容器构建 arm64(默认)
|
|
|
--docker-only 容器内同时构建 amd64 + arm64(绕过宿主机依赖)
|
|
|
EOF
|
|
|
exit 0
|
|
|
;;
|
|
|
--)
|
|
|
shift
|
|
|
break
|
|
|
;;
|
|
|
-*)
|
|
|
echo "错误: 未知参数 $1" >&2
|
|
|
exit 1
|
|
|
;;
|
|
|
*)
|
|
|
PROJECT_ARGS+=("$1")
|
|
|
shift
|
|
|
;;
|
|
|
esac
|
|
|
done
|
|
|
|
|
|
if (($# > 0)); then
|
|
|
PROJECT_ARGS+=("$@")
|
|
|
fi
|
|
|
|
|
|
cd "$REPO_ROOT"
|
|
|
|
|
|
if ((${#PROJECT_ARGS[@]} == 0)); then
|
|
|
mapfile -t SELECTED_PROJECTS < <(bash "$REPO_ROOT/scripts/build-linux-deb-all.sh" --list-projects)
|
|
|
else
|
|
|
SELECTED_PROJECTS=("${PROJECT_ARGS[@]}")
|
|
|
fi
|
|
|
|
|
|
# 防御性过滤空行,避免出现未知项目 ""
|
|
|
FILTERED_PROJECTS=()
|
|
|
for d in "${SELECTED_PROJECTS[@]}"; do
|
|
|
if [[ -n "$d" ]]; then
|
|
|
FILTERED_PROJECTS+=("$d")
|
|
|
fi
|
|
|
done
|
|
|
SELECTED_PROJECTS=("${FILTERED_PROJECTS[@]}")
|
|
|
|
|
|
if ((${#SELECTED_PROJECTS[@]} == 0)); then
|
|
|
echo "错误: 没有可构建项目" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
if [[ "$RUN_MODE" == "hybrid" ]]; then
|
|
|
echo "==> host npm ci (${SELECTED_PROJECTS[*]})"
|
|
|
for d in "${SELECTED_PROJECTS[@]}"; do
|
|
|
if [[ ! -f "$REPO_ROOT/$d/package.json" ]]; then
|
|
|
echo "错误: 缺少 $REPO_ROOT/$d/package.json" >&2
|
|
|
exit 1
|
|
|
fi
|
|
|
(cd "$REPO_ROOT/$d" && npm ci)
|
|
|
done
|
|
|
|
|
|
echo "==> host build amd64 (${SELECTED_PROJECTS[*]})"
|
|
|
bash "$REPO_ROOT/scripts/build-linux-deb-all.sh" --arch amd64 "${SELECTED_PROJECTS[@]}"
|
|
|
fi
|
|
|
|
|
|
echo "==> docker build --platform linux/amd64 -f scripts/docker/Dockerfile -t $IMAGE_TAG $REPO_ROOT"
|
|
|
docker build --platform linux/amd64 -f scripts/docker/Dockerfile -t "$IMAGE_TAG" "$REPO_ROOT"
|
|
|
|
|
|
if [[ "$RUN_MODE" == "docker" ]]; then
|
|
|
echo "==> docker run #1 (amd64: npm ci + build-linux-deb-all.sh)"
|
|
|
docker run --rm \
|
|
|
--platform linux/amd64 \
|
|
|
-v "$REPO_ROOT:/work" \
|
|
|
-w /work \
|
|
|
-e RUSTUP_HOME=/opt/rustup \
|
|
|
-e CARGO_HOME=/opt/cargo \
|
|
|
-e BUILD_ARCH=amd64 \
|
|
|
-e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \
|
|
|
"$IMAGE_TAG" \
|
|
|
bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"
|
|
|
|
|
|
echo "==> docker run #2 (arm64: npm ci + build-linux-deb-all.sh)"
|
|
|
docker run --rm \
|
|
|
--platform linux/amd64 \
|
|
|
-v "$REPO_ROOT:/work" \
|
|
|
-w /work \
|
|
|
-e RUSTUP_HOME=/opt/rustup \
|
|
|
-e CARGO_HOME=/opt/cargo \
|
|
|
-e BUILD_ARCH=arm64 \
|
|
|
-e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \
|
|
|
"$IMAGE_TAG" \
|
|
|
bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"
|
|
|
else
|
|
|
echo "==> docker run (arm64: npm ci + build-linux-deb-all.sh)"
|
|
|
docker run --rm \
|
|
|
--platform linux/amd64 \
|
|
|
-v "$REPO_ROOT:/work" \
|
|
|
-w /work \
|
|
|
-e RUSTUP_HOME=/opt/rustup \
|
|
|
-e CARGO_HOME=/opt/cargo \
|
|
|
-e BUILD_ARCH=arm64 \
|
|
|
-e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \
|
|
|
"$IMAGE_TAG" \
|
|
|
bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"
|
|
|
fi
|