#!/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