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.

130 lines
3.6 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:20.04}"
RUN_MODE="${RUN_MODE:-docker}" # docker: dual-container all; hybrid: host amd64 + docker arm64
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] [项目名...]
说明:
--docker-only 双容器模式:容器内分别构建 amd64 + arm64默认
--hybrid 宿主机构建 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/}" \
-e CLEAN_TAURI_TARGET="${CLEAN_TAURI_TARGET:-1}" \
"$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/}" \
-e CLEAN_TAURI_TARGET="${CLEAN_TAURI_TARGET:-1}" \
"$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/}" \
-e CLEAN_TAURI_TARGET="${CLEAN_TAURI_TARGET:-1}" \
"$IMAGE_TAG" \
bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"
fi