cangku/deploy/production/build-frontend.sh
2026-09-17 11:55:37 +08:00

44 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
FRONTEND_DIR="$REPO_DIR/frontend"
SOURCE_GIT_FULL_SHA="$(cd "$REPO_DIR" && git rev-parse HEAD)"
SOURCE_GIT_SHA="$(cd "$REPO_DIR" && git rev-parse --short HEAD)"
SOURCE_GIT_REF="$(cd "$REPO_DIR" && git symbolic-ref --quiet --short HEAD 2>/dev/null || true)"
SOURCE_GIT_REF="${SOURCE_GIT_REF:-main}"
test -f "$FRONTEND_DIR/package-lock.json" || {
echo 'frontend/package-lock.json 不存在,停止构建' >&2
exit 1
}
docker run --rm \
-e "SOURCE_GIT_SHA=$SOURCE_GIT_SHA" \
-e "SOURCE_GIT_FULL_SHA=$SOURCE_GIT_FULL_SHA" \
-e "SOURCE_GIT_REF=$SOURCE_GIT_REF" \
-v "$FRONTEND_DIR:/host-frontend" \
node:22-bookworm-slim \
sh -lc '
set -eu
mkdir -p /workspace
tar -C /host-frontend --exclude=node_modules --exclude=dist -cf - . | tar -C /workspace -xf -
cd /workspace
npm ci --no-audit --no-fund
npm run build
mkdir -p /host-frontend/dist
find /host-frontend/dist -mindepth 1 -delete
cp -a /workspace/dist/. /host-frontend/dist/
'
node - "$FRONTEND_DIR/dist/__build_version__.json" "$SOURCE_GIT_FULL_SHA" <<'NODE'
const fs = require('node:fs');
const [versionPath, expectedSha] = process.argv.slice(2);
const metadata = JSON.parse(fs.readFileSync(versionPath, 'utf8'));
if (metadata.sourceGitFullSha !== expectedSha) {
throw new Error(`前端构建 SHA 不匹配:${metadata.sourceGitFullSha} != ${expectedSha}`);
}
process.stdout.write(`前端构建已验证:${metadata.version}\n`);
NODE