149 lines
3.9 KiB
Bash
Executable File
149 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
version="${1:-}"
|
|
if [[ -z "$version" ]]; then
|
|
echo "Usage: $0 <version>"
|
|
exit 1
|
|
fi
|
|
|
|
# 修改此处为本机 JDK 21 的实际安装目录。
|
|
project_java_home="/home/orangeroll/.jdks/ms-21.0.12"
|
|
if [[ ! -x "$project_java_home/bin/java" ]]; then
|
|
echo "Java 21 was not found at: $project_java_home"
|
|
echo "Update project_java_home in scripts/package-release.sh."
|
|
exit 1
|
|
fi
|
|
|
|
export JAVA_HOME="$project_java_home"
|
|
export PATH="$JAVA_HOME/bin:$PATH"
|
|
echo "Using Java: $JAVA_HOME"
|
|
|
|
if ! command -v npm >/dev/null 2>&1; then
|
|
echo "npm was not found. Install Node.js/npm before packaging."
|
|
exit 1
|
|
fi
|
|
|
|
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
project_dir="$(cd "$script_dir/.." && pwd)"
|
|
release_dir="$project_dir/release"
|
|
bundle_dir="$release_dir/screen-share-$version"
|
|
archive="$release_dir/screen-share-$version.tar.gz"
|
|
|
|
if ! mkdir -p "$release_dir" || [[ ! -w "$release_dir" ]]; then
|
|
echo "Release directory is not writable: $release_dir"
|
|
echo "Fix it once with: sudo chown -R \$USER:\$USER \"$release_dir\""
|
|
exit 1
|
|
fi
|
|
|
|
if docker info >/dev/null 2>&1; then
|
|
docker_command=(docker)
|
|
else
|
|
docker_command=(sudo docker)
|
|
fi
|
|
|
|
run_docker() {
|
|
"${docker_command[@]}" "$@"
|
|
}
|
|
|
|
ensure_docker_image() {
|
|
local image="$1"
|
|
if run_docker image inspect "$image" >/dev/null 2>&1; then
|
|
echo "Using local Docker image: $image"
|
|
else
|
|
retry run_docker pull "$image"
|
|
fi
|
|
}
|
|
|
|
if [[ -e "$bundle_dir" || -e "$archive" ]]; then
|
|
if [[ -d "$bundle_dir" && ! -e "$archive" ]] && [[ -z "$(find "$bundle_dir" -type f -print -quit)" ]]; then
|
|
find "$bundle_dir" -depth -type d -empty -delete
|
|
else
|
|
echo "Release already exists: $bundle_dir or $archive"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
retry() {
|
|
local attempt
|
|
for attempt in 1 2 3; do
|
|
if "$@"; then
|
|
return 0
|
|
fi
|
|
if [[ "$attempt" -lt 3 ]]; then
|
|
echo "Command failed; retrying in 5 seconds ($attempt/3)..."
|
|
sleep 5
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
docker_build() {
|
|
local build_args=()
|
|
local network_args=()
|
|
local proxy_enabled=false
|
|
local variable
|
|
local value
|
|
local build_network="${DOCKER_BUILD_NETWORK-}"
|
|
for variable in HTTP_PROXY HTTPS_PROXY NO_PROXY http_proxy https_proxy no_proxy; do
|
|
value="${!variable-}"
|
|
if [[ -n "$value" ]]; then
|
|
build_args+=(--build-arg "$variable=$value")
|
|
proxy_enabled=true
|
|
fi
|
|
done
|
|
if [[ "$proxy_enabled" == true ]]; then
|
|
echo "Using proxy environment variables for Docker build containers."
|
|
fi
|
|
if [[ -n "$build_network" ]]; then
|
|
network_args=(--network "$build_network")
|
|
echo "Using Docker build network: $build_network"
|
|
fi
|
|
run_docker build "${build_args[@]}" "${network_args[@]}" "$@"
|
|
}
|
|
|
|
build_api_distribution() {
|
|
(
|
|
cd "$project_dir/apps/ScreenShareApi"
|
|
./gradlew installDist --no-daemon
|
|
)
|
|
}
|
|
|
|
build_web_assets() {
|
|
(
|
|
cd "$project_dir/apps/ScreenShareWeb"
|
|
npm run build
|
|
)
|
|
}
|
|
|
|
build_api_distribution
|
|
build_web_assets
|
|
retry docker_build -t "screenshare-api:$version" "$project_dir/apps/ScreenShareApi"
|
|
ensure_docker_image postgres:16-alpine
|
|
ensure_docker_image livekit/livekit-server:v1.9.10
|
|
ensure_docker_image nginx:1.27-alpine
|
|
|
|
mkdir -p "$bundle_dir/infra/livekit" "$bundle_dir/infra/nginx" "$bundle_dir/docs" "$bundle_dir/web"
|
|
|
|
run_docker save \
|
|
"screenshare-api:$version" \
|
|
postgres:16-alpine \
|
|
livekit/livekit-server:v1.9.10 \
|
|
nginx:1.27-alpine \
|
|
> "$bundle_dir/images.tar"
|
|
|
|
cp -a "$project_dir/apps/ScreenShareWeb/dist/." "$bundle_dir/web/"
|
|
cp "$project_dir/docker-compose.yml" "$bundle_dir/"
|
|
cp "$project_dir/.env.example" "$bundle_dir/"
|
|
cp "$project_dir/infra/livekit/livekit.yaml" "$bundle_dir/infra/livekit/"
|
|
cp "$project_dir/infra/nginx/gateway.conf" "$bundle_dir/infra/nginx/"
|
|
cp "$project_dir/infra/nginx/screenshare.conf.example" "$bundle_dir/infra/nginx/"
|
|
cp "$project_dir/docs/SERVER_DEPLOYMENT.md" "$bundle_dir/docs/"
|
|
|
|
cat > "$bundle_dir/RELEASE_VERSION" <<EOF
|
|
$version
|
|
EOF
|
|
|
|
tar -C "$release_dir" -czf "$archive" "screen-share-$version"
|
|
echo "Created offline deployment archive: $archive"
|