You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.8 KiB
Bash

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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
DOCKER_BUILD_ARCH="all"
echo "==> docker run (amd64+arm64: npm ci + build-linux-deb-all.sh)"
else
DOCKER_BUILD_ARCH="arm64"
echo "==> docker run (arm64: npm ci + build-linux-deb-all.sh)"
fi
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="$DOCKER_BUILD_ARCH" \
-e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \
"$IMAGE_TAG" \
bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"