44 lines
1.6 KiB
Bash
Executable File
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
|