Build optimization: pre-built PM3 binaries, ARM64 CI, base image caching
Replace PM3 compile-from-source in pi-gen with pre-built tarball extraction (saves 43-58 min). Merge stagePM3 into stageDangerousPi as 02-pm3-install substage, renumber all subsequent substages. Switch CI PM3 build to native ARM64 runner (ubuntu-24.04-arm64) eliminating QEMU overhead. Add weekly base-image workflow for pre-baking stages 0-2. Support PM3_TARBALL, BASE_IMAGE, and APT_PROXY env vars in build-image.sh. Also includes prior Phase 5 work: theme system, design system integration, component update system, OS updates, CI build pipeline, and test results. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
100
ci/build-theme.sh
Executable file
100
ci/build-theme.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build the theme component from the @dangerousthings/tokens package.
|
||||
# Generates token CSS files and packages them for distribution.
|
||||
#
|
||||
# Environment variables:
|
||||
# OUTPUT_DIR - where to write the tarball (default: ./dist)
|
||||
# VERSION - version string (default: read from VERSION file)
|
||||
# DESIGN_SYSTEM_DIR - path to dt-design-system monorepo
|
||||
# (default: ../dt-design-system relative to workspace)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
WORKSPACE="${SCRIPT_DIR}/.."
|
||||
OUTPUT_DIR="${OUTPUT_DIR:-${WORKSPACE}/dist}"
|
||||
VERSION="${VERSION:-$(cat "${WORKSPACE}/VERSION" 2>/dev/null || echo "0.1.0")}"
|
||||
DESIGN_SYSTEM_DIR="${DESIGN_SYSTEM_DIR:-$(realpath "${WORKSPACE}/../dt-design-system")}"
|
||||
|
||||
echo "=== Dangerous Pi Theme Build ==="
|
||||
echo "Version: ${VERSION}"
|
||||
echo "Design system: ${DESIGN_SYSTEM_DIR}"
|
||||
|
||||
if [ ! -d "$DESIGN_SYSTEM_DIR" ]; then
|
||||
echo "Error: dt-design-system not found at ${DESIGN_SYSTEM_DIR}"
|
||||
echo "Set DESIGN_SYSTEM_DIR to the monorepo path"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Build tokens to generate CSS
|
||||
cd "$DESIGN_SYSTEM_DIR"
|
||||
npm ci --production=false
|
||||
npm run build:tokens
|
||||
|
||||
# Package theme CSS files
|
||||
STAGING="/tmp/theme-staging/theme"
|
||||
rm -rf /tmp/theme-staging
|
||||
|
||||
BRANDS=("dt" "classic" "supra")
|
||||
for brand in "${BRANDS[@]}"; do
|
||||
CSS_FILE="${DESIGN_SYSTEM_DIR}/packages/tokens/dist/css/${brand}.css"
|
||||
if [ -f "$CSS_FILE" ]; then
|
||||
mkdir -p "${STAGING}/${brand}"
|
||||
cp "$CSS_FILE" "${STAGING}/${brand}/tokens.css"
|
||||
|
||||
# Read brand metadata from the generated CSS or tokens
|
||||
cat > "${STAGING}/${brand}/theme.json" << TJEOF
|
||||
{
|
||||
"id": "${brand}",
|
||||
"supportsModes": ["dark", "light", "auto"],
|
||||
"defaultMode": "dark"
|
||||
}
|
||||
TJEOF
|
||||
else
|
||||
echo "Warning: ${CSS_FILE} not found, skipping ${brand}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Add brand metadata from tokens package if available
|
||||
TOKENS_INDEX="${DESIGN_SYSTEM_DIR}/packages/tokens/dist/index.js"
|
||||
if [ -f "$TOKENS_INDEX" ]; then
|
||||
# Extract brand names/descriptions from the built tokens
|
||||
node -e "
|
||||
const tokens = require('${TOKENS_INDEX}');
|
||||
const brands = Object.values(tokens.brands || {}).map(b => ({
|
||||
id: b.id, name: b.name, description: b.description,
|
||||
supportsModes: ['dark', 'light', 'auto'], defaultMode: 'dark'
|
||||
}));
|
||||
require('fs').writeFileSync('/tmp/theme-staging/theme/themes.json',
|
||||
JSON.stringify({ schema_version: 1, themes: brands }, null, 2));
|
||||
" 2>/dev/null || echo '{"schema_version": 1, "themes": []}' > "${STAGING}/themes.json"
|
||||
else
|
||||
# Fallback: generate registry from what we packaged
|
||||
cat > "${STAGING}/themes.json" << REOF
|
||||
{
|
||||
"schema_version": 1,
|
||||
"themes": [
|
||||
{"id": "dt", "name": "Dangerous Things", "description": "Official DT brand", "supportsModes": ["dark", "light", "auto"], "defaultMode": "dark"},
|
||||
{"id": "classic", "name": "Classic Cyberpunk", "description": "Original dark navy aesthetic", "supportsModes": ["dark", "light", "auto"], "defaultMode": "dark"},
|
||||
{"id": "supra", "name": "VivoKey Supra", "description": "Material Design 3 with VivoKey blue", "supportsModes": ["dark", "light", "auto"], "defaultMode": "dark"}
|
||||
]
|
||||
}
|
||||
REOF
|
||||
fi
|
||||
|
||||
cat > "${STAGING}/COMPONENT_VERSION" << EOF
|
||||
{
|
||||
"component_id": "theme",
|
||||
"version": "${VERSION}",
|
||||
"build_date": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
|
||||
"tokens_package_version": "$(node -p "require('${DESIGN_SYSTEM_DIR}/packages/tokens/package.json').version" 2>/dev/null || echo "unknown")"
|
||||
}
|
||||
EOF
|
||||
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
TARBALL="theme-${VERSION}.tar.gz"
|
||||
cd /tmp/theme-staging
|
||||
tar -czf "${OUTPUT_DIR}/${TARBALL}" theme/
|
||||
echo "✅ Built: ${OUTPUT_DIR}/${TARBALL}"
|
||||
|
||||
rm -rf /tmp/theme-staging
|
||||
Reference in New Issue
Block a user