@echo off chcp 65001 >nul REM Build Windows artifacts on the build machine (Meowhome). REM Output: REM dist\scoreboard.exe server (frontend embedded via go:embed) REM dist\console\ Scoreboard Console installer + portable dir REM REM IMPORTANT: keep this file ASCII-only. cmd.exe mis-parses UTF-8 non-ASCII text REM inside batch files (especially inside if(...) blocks). Anything that needs a REM non-ASCII path is done by a Node script under deploy\. setlocal REM electron / electron-builder downloads: use mirrors so GitHub is reachable set "ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/" set "ELECTRON_BUILDER_BINARIES_MIRROR=https://gh-proxy.com/https://github.com/electron-userland/electron-builder-binaries/releases/download/" set "CSC_IDENTITY_AUTO_DISCOVERY=false" cd /d "%~dp0.." echo === [1/4] git pull === git pull || exit /b 1 echo === [2/4] web deps + build === cd web call pnpm install --frozen-lockfile || exit /b 1 call pnpm build || exit /b 1 cd .. echo === [3/4] server build === cd server if not exist ..\dist mkdir ..\dist REM internal signature is injected from a machine-local file (gitignored, never in repo). REM set /p returns empty under chcp 65001; PowerShell piping re-encodes the text and REM corrupts non-ASCII. So a Node script normalizes it (BOM/whitespace stripped) into REM deploy\signature.build.txt, and for /f reads that file directly (no re-encoding). node ..\deploy\prepare-signature.mjs || exit /b 1 set "INTERNAL_SIGNATURE=" if exist "..\deploy\signature.build.txt" for /f "usebackq delims= eol=" %%A in ("..\deploy\signature.build.txt") do if not defined INTERNAL_SIGNATURE set "INTERNAL_SIGNATURE=%%A" REM build time for the About page. Do NOT use %DATE%/%TIME%: a localized Windows REM prints non-ASCII weekday names, which cmd mis-parses (see the header note). set "BUILD_TIME=" for /f "usebackq delims=" %%T in (`powershell -NoProfile -Command "(Get-Date).ToString('yyyy-MM-dd HH:mm:ss')"`) do if not defined BUILD_TIME set "BUILD_TIME=%%T" set "BUILD_TIME_LDFLAG=-X 'git.yeij.top/AskaEth/Scoreboard/server/internal/version.BuildTime=%BUILD_TIME%'" if defined INTERNAL_SIGNATURE ( REM single quotes keep spaces inside the value intact for go's ldflags parser go build -ldflags "-X 'git.yeij.top/AskaEth/Scoreboard/server/internal/version.InternalSignature=%INTERNAL_SIGNATURE%' %BUILD_TIME_LDFLAG%" -o ..\dist\scoreboard.exe . || exit /b 1 node ..\deploy\verify-signature.mjs || exit /b 1 echo internal signature injected ) else ( go build -ldflags "%BUILD_TIME_LDFLAG%" -o ..\dist\scoreboard.exe . || exit /b 1 echo no internal signature ) echo build time %BUILD_TIME% cd .. echo === [4/4] console package (electron-builder) === REM win.icon is written into the PE resources by electron-builder (via rcedit); REM it needs winCodeSign / nsis, fetched through the gh proxy above. taskkill /im "Scoreboard_Console.exe" /f >nul 2>&1 REM builds from before the exe rename used a space in the file name - kill that too taskkill /im "Scoreboard Console.exe" /f >nul 2>&1 taskkill /im scoreboard.exe /f >nul 2>&1 if not exist "rules" ( echo [ERROR] rules dir missing - electron-builder extraFiles needs it exit /b 1 ) node deploy\prepare-extra.mjs || exit /b 1 cd console REM console\pnpm-workspace.yaml uses allowBuilds so electron's install script is REM allowed to run; do NOT add --ignore-scripts here, it makes pnpm run fail its REM dependency check with ERR_PNPM_IGNORED_BUILDS. REM Keep this file ASCII-only: cmd.exe mis-parses UTF-8 text inside .bat files. call pnpm install --frozen-lockfile || exit /b 1 call :ensure_electron || exit /b 1 call pnpm run dist || exit /b 1 cd .. echo. echo === BUILD OK === echo dist\scoreboard.exe server echo dist\console\ console installer + portable dir dir /b dist\console endlocal exit /b 0 REM ---- ensure the electron runtime binary is present (fallback for mirror failures) -- :ensure_electron REM path.txt tells the electron package where the binary is; without it REM electron-builder tries to download the runtime and hits a Node 24 bug. if not exist node_modules\electron\path.txt echo electron.exe> node_modules\electron\path.txt if exist node_modules\electron\dist\electron.exe exit /b 0 set "EV=38.8.6" echo downloading electron %EV% ... curl -L --fail --max-time 900 -o electron-dl.zip "%ELECTRON_MIRROR%%EV%/electron-v%EV%-win32-x64.zip" || exit /b 1 powershell -NoProfile -Command "Expand-Archive -LiteralPath 'electron-dl.zip' -DestinationPath 'node_modules/electron/dist' -Force" || exit /b 1 del /q electron-dl.zip echo electron.exe> node_modules\electron\path.txt echo electron runtime ready exit /b 0