修改打包脚本

master
cysamurai 2 months ago
parent 95441e5247
commit c7a2af7559

@ -9,22 +9,17 @@
# 见 README.md「交叉编译 arm64」或本脚本 check_arm64_pkgconfig 失败时的提示。 # 见 README.md「交叉编译 arm64」或本脚本 check_arm64_pkgconfig 失败时的提示。
# #
# 用法: # 用法:
# ./scripts/build-linux-deb-all.sh # 构建 PROJECTS 中全部项目 # ./scripts/build-linux-deb-all.sh # 构建自动发现的全部项目amd64 + arm64
# ./scripts/build-linux-deb-all.sh call-client # 仅构建指定项目(可多个) # ./scripts/build-linux-deb-all.sh --arch amd64 # 仅构建 amd64
# ./scripts/build-linux-deb-all.sh --arch arm64 call-client # 仅构建指定项目的 arm64
# ./scripts/build-linux-deb-all.sh --list-projects # 打印可构建项目列表
# #
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
BUILD_ARCH="all"
# --------------------------------------------------------------------------- LIST_PROJECTS=0
# 同框架项目列表(相对 REPO_ROOT 的目录名)。后续新增项目在此追加一行即可。
# ---------------------------------------------------------------------------
PROJECTS=(
"call-client"
"broadcast-client"
# "another-tauri-app"
)
# 统一收集 .deb 的根目录(相对 REPO_ROOT # 统一收集 .deb 的根目录(相对 REPO_ROOT
OUTPUT_ROOT="$REPO_ROOT/dist/linux-deb" OUTPUT_ROOT="$REPO_ROOT/dist/linux-deb"
@ -32,6 +27,82 @@ OUTPUT_ROOT="$REPO_ROOT/dist/linux-deb"
# aarch64 交叉编译时 pkg-config 查找路径(与下方 export 一致) # aarch64 交叉编译时 pkg-config 查找路径(与下方 export 一致)
ARM64_PKGCONFIG_DIR="/usr/lib/aarch64-linux-gnu/pkgconfig" ARM64_PKGCONFIG_DIR="/usr/lib/aarch64-linux-gnu/pkgconfig"
X64_PKGCONFIG_DIR="/usr/lib/x86_64-linux-gnu/pkgconfig" X64_PKGCONFIG_DIR="/usr/lib/x86_64-linux-gnu/pkgconfig"
AVAILABLE_PROJECTS=()
usage() {
cat <<EOF
用法:
$(basename "$0") [--arch all|amd64|arm64] [项目名...]
$(basename "$0") --list-projects
EOF
}
discover_projects() {
local pkg_file project_dir
shopt -s nullglob
for pkg_file in "$REPO_ROOT"/*/package.json; do
project_dir="${pkg_file#$REPO_ROOT/}"
project_dir="${project_dir%/package.json}"
if node -e '
const fs = require("fs");
const pkg = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
const scripts = pkg.scripts || {};
process.exit(scripts["build:deb:x64"] && scripts["build:deb:arm64"] ? 0 : 1);
' "$pkg_file" >/dev/null 2>&1; then
echo "$project_dir"
fi
done
shopt -u nullglob
}
parse_args() {
while (($# > 0)); do
case "$1" in
--arch)
BUILD_ARCH="${2:-}"
if [[ -z "$BUILD_ARCH" ]]; then
echo "错误: --arch 需要参数all|amd64|arm64" >&2
exit 1
fi
shift 2
;;
--arch=*)
BUILD_ARCH="${1#*=}"
shift
;;
--list-projects)
LIST_PROJECTS=1
shift
;;
--help|-h)
usage
exit 0
;;
--)
shift
break
;;
-*)
echo "错误: 未知参数 $1" >&2
usage >&2
exit 1
;;
*)
break
;;
esac
done
case "$BUILD_ARCH" in
all|amd64|arm64) ;;
*)
echo "错误: --arch 仅支持 all|amd64|arm64当前为 \"$BUILD_ARCH\"" >&2
exit 1
;;
esac
printf '%s\n' "$@"
}
check_x64_pkgconfig() { check_x64_pkgconfig() {
local missing=() local missing=()
@ -142,44 +213,50 @@ collect_debs() {
build_project() { build_project() {
local project_dir="$1" local project_dir="$1"
echo "" if [[ "$BUILD_ARCH" == "all" || "$BUILD_ARCH" == "amd64" ]]; then
echo "######## $project_dir: amd64 ########" echo ""
unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_CROSS 2>/dev/null || true echo "######## $project_dir: amd64 ########"
check_x64_pkgconfig unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_ALLOW_CROSS 2>/dev/null || true
export PKG_CONFIG_PATH="$X64_PKGCONFIG_DIR" check_x64_pkgconfig
export PKG_CONFIG_LIBDIR="$X64_PKGCONFIG_DIR:/usr/share/pkgconfig" export PKG_CONFIG_PATH="$X64_PKGCONFIG_DIR"
build_one_target "$project_dir" "build:deb:x64" export PKG_CONFIG_LIBDIR="$X64_PKGCONFIG_DIR:/usr/share/pkgconfig"
collect_debs "$project_dir" "amd64" "x86_64-unknown-linux-gnu" build_one_target "$project_dir" "build:deb:x64"
unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR collect_debs "$project_dir" "amd64" "x86_64-unknown-linux-gnu"
unset PKG_CONFIG_PATH PKG_CONFIG_LIBDIR
fi
echo "" if [[ "$BUILD_ARCH" == "all" || "$BUILD_ARCH" == "arm64" ]]; then
echo "######## $project_dir: arm64 (cross) ########" echo ""
check_arm64_pkgconfig echo "######## $project_dir: arm64 (cross) ########"
export PKG_CONFIG_ALLOW_CROSS=1 check_arm64_pkgconfig
export PKG_CONFIG_SYSROOT_DIR=/ export PKG_CONFIG_ALLOW_CROSS=1
export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig export PKG_CONFIG_SYSROOT_DIR=/
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
build_one_target "$project_dir" "build:deb:arm64" export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig
collect_debs "$project_dir" "arm64" "aarch64-unknown-linux-gnu" build_one_target "$project_dir" "build:deb:arm64"
unset PKG_CONFIG_ALLOW_CROSS PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR collect_debs "$project_dir" "arm64" "aarch64-unknown-linux-gnu"
unset PKG_CONFIG_ALLOW_CROSS PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_PATH PKG_CONFIG_LIBDIR
fi
} }
select_projects() { select_projects() {
local available=("${AVAILABLE_PROJECTS[@]}")
if (($# == 0)); then if (($# == 0)); then
printf '%s\n' "${PROJECTS[@]}" printf '%s\n' "${available[@]}"
return return
fi fi
local name ok local name ok p
for name in "$@"; do for name in "$@"; do
ok=0 ok=0
for p in "${PROJECTS[@]}"; do for p in "${available[@]}"; do
if [[ "$p" == "$name" ]]; then if [[ "$p" == "$name" ]]; then
ok=1 ok=1
break break
fi fi
done done
if [[ "$ok" -eq 0 ]]; then if [[ "$ok" -eq 0 ]]; then
echo "错误: 未知项目 \"$name\"请加入 scripts/build-linux-deb-all.sh 的 PROJECTS 数组" >&2 echo "错误: 未知项目 \"$name\"可用项目见 --list-projects" >&2
exit 1 exit 1
fi fi
echo "$name" echo "$name"
@ -187,7 +264,20 @@ select_projects() {
} }
main() { main() {
mapfile -t to_build < <(select_projects "$@") local -a positional to_build
mapfile -t positional < <(parse_args "$@")
mapfile -t AVAILABLE_PROJECTS < <(discover_projects)
if (( ${#AVAILABLE_PROJECTS[@]} == 0 )); then
echo "错误: 未发现可构建项目(需包含 build:deb:x64 与 build:deb:arm64 脚本)" >&2
exit 1
fi
if [[ "$LIST_PROJECTS" -eq 1 ]]; then
printf '%s\n' "${AVAILABLE_PROJECTS[@]}"
return
fi
mapfile -t to_build < <(select_projects "${positional[@]}")
mkdir -p "$OUTPUT_ROOT" mkdir -p "$OUTPUT_ROOT"
for p in "${to_build[@]}"; do for p in "${to_build[@]}"; do
@ -196,6 +286,7 @@ main() {
echo "" echo ""
echo "==> 全部完成" echo "==> 全部完成"
echo " 构建架构: $BUILD_ARCH"
echo " 统一输出目录: $OUTPUT_ROOT" echo " 统一输出目录: $OUTPUT_ROOT"
echo " 每项目下: <项目名>/amd64/*.deb 与 <项目名>/arm64/*.deb" echo " 每项目下: <项目名>/amd64/*.deb 与 <项目名>/arm64/*.deb"
echo " Tauri 原始路径仍在各项目:" echo " Tauri 原始路径仍在各项目:"

@ -2,6 +2,7 @@
# 在容器内执行:为各子项目 npm ci再调用仓库根脚本路径挂载为 /work # 在容器内执行:为各子项目 npm ci再调用仓库根脚本路径挂载为 /work
set -euo pipefail set -euo pipefail
cd /work cd /work
BUILD_ARCH="${BUILD_ARCH:-all}"
# npm 网络增强:默认使用官方 registry可通过 NPM_REGISTRY 覆盖;增加超时与重试,减少 ECONNRESET 失败概率。 # npm 网络增强:默认使用官方 registry可通过 NPM_REGISTRY 覆盖;增加超时与重试,减少 ECONNRESET 失败概率。
npm config set registry "${NPM_REGISTRY:-https://registry.npmjs.org/}" npm config set registry "${NPM_REGISTRY:-https://registry.npmjs.org/}"
@ -11,7 +12,18 @@ npm config set fetch-retry-mintimeout 20000
npm config set fetch-retry-maxtimeout 120000 npm config set fetch-retry-maxtimeout 120000
npm config set fetch-timeout 300000 npm config set fetch-timeout 300000
for d in call-client broadcast-client; do 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 if [[ ! -f "$d/package.json" ]]; then
echo "错误: 缺少 /work/$d/package.json" >&2 echo "错误: 缺少 /work/$d/package.json" >&2
exit 1 exit 1
@ -32,4 +44,4 @@ for d in call-client broadcast-client; do
done done
) )
done done
exec bash /work/scripts/build-linux-deb-all.sh "$@" exec bash /work/scripts/build-linux-deb-all.sh --arch "$BUILD_ARCH" "${projects[@]}"

@ -1,23 +1,48 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# 在宿主机上:构建镜像并在容器内挂载仓库、npm ci、执行 build-linux-deb-all.sh # 在宿主机上:先打 amd64再在容器中打 arm64均支持自动发现项目
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
IMAGE_TAG="${IMAGE_TAG:-tauri-linux-deb:24.04}" IMAGE_TAG="${IMAGE_TAG:-tauri-linux-deb:24.04}"
PROJECT_ARGS=("$@")
cd "$REPO_ROOT" 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
if ((${#SELECTED_PROJECTS[@]} == 0)); then
echo "错误: 没有可构建项目" >&2
exit 1
fi
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[@]}"
echo "==> docker build --platform linux/amd64 -f scripts/docker/Dockerfile -t $IMAGE_TAG $REPO_ROOT" 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" docker build --platform linux/amd64 -f scripts/docker/Dockerfile -t "$IMAGE_TAG" "$REPO_ROOT"
echo "==> docker run (npm ci + build-linux-deb-all.sh)" echo "==> docker run (arm64: npm ci + build-linux-deb-all.sh)"
docker run --rm \ docker run --rm \
--platform linux/amd64 \ --platform linux/amd64 \
-v "$REPO_ROOT:/work" \ -v "$REPO_ROOT:/work" \
-w /work \ -w /work \
-e RUSTUP_HOME=/opt/rustup \ -e RUSTUP_HOME=/opt/rustup \
-e CARGO_HOME=/opt/cargo \ -e CARGO_HOME=/opt/cargo \
-e BUILD_ARCH=arm64 \
-e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \ -e NPM_REGISTRY="${NPM_REGISTRY:-https://registry.npmjs.org/}" \
"$IMAGE_TAG" \ "$IMAGE_TAG" \
bash /work/scripts/docker/container-entry.sh "$@" bash /work/scripts/docker/container-entry.sh "${SELECTED_PROJECTS[@]}"

Loading…
Cancel
Save