@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 === REM version: repo-root VERSION is the single source of truth. The Node script REM writes deploy\version.gen.bat (pure ASCII, for cmd) and syncs the installer REM version in console\package.json. Must run before the go build below. node deploy\prepare-extra.mjs || exit /b 1 call deploy\version.gen.bat || exit /b 1 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 compile-time version: -X main.version targets package main (no import path), REM unlike the two vars below which are import-path-qualified. set "VERSION_LDFLAG=-X 'main.version=%SCOREBOARD_VERSION%'" 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%' %VERSION_LDFLAG% %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 "%VERSION_LDFLAG% %BUILD_TIME_LDFLAG%" -o ..\dist\scoreboard.exe . || exit /b 1 echo no internal signature ) echo build time %BUILD_TIME% echo version %SCOREBOARD_VERSION% 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 ) REM prepare-extra.mjs already ran in step 3 (version, user docs, installer script). 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