From b57d269f9b57dfc735831d6284df0fecdbc29042 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 26 Jul 2026 14:21:06 +0100 Subject: [PATCH] Fixed build config. --- Jenkinsfile | 89 ++++++++++++++++++++++--------------- package.json | 49 ++++++++++++++++++-- src/electron/vite.config.js | 1 + 3 files changed, 101 insertions(+), 38 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index de14984..1e35dac 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,38 @@ +def buildLinux() { + node('ubuntu') { + try { + stage('Checkout (Ubuntu)') { + checkout scm + } + + stage('Setup Node.js (Ubuntu)') { + nodejs(nodeJSInstallationName: 'Node23') { + sh 'node -v' + sh 'pnpm -v' + } + } + + stage('Install Dependencies (Ubuntu)') { + nodejs(nodeJSInstallationName: 'Node23') { + sh 'pnpm install --frozen-lockfile --production=false' + } + } + + stage('Build (Ubuntu)') { + nodejs(nodeJSInstallationName: 'Node23') { + sh "VITE_BUILD_NUMBER=${env.BUILD_NUMBER} NODE_ENV=production pnpm build:linux" + } + } + + stage('Archive Artifacts (Ubuntu)') { + archiveArtifacts artifacts: 'app_dist/**/*.deb, app_dist/**/*.rpm', fingerprint: true + } + } finally { + cleanWs() + } + } +} + def buildOnLabel(label, buildCommand) { return { node(label) { @@ -30,61 +65,45 @@ def buildOnLabel(label, buildCommand) { stage("Build (${label})") { nodejs(nodeJSInstallationName: 'Node23') { if (isUnix()) { - sh "NODE_ENV=production ${buildCommand}" + sh "VITE_BUILD_NUMBER=${env.BUILD_NUMBER} NODE_ENV=production ${buildCommand}" } else { - bat "set NODE_ENV=production && ${buildCommand}" + bat "set VITE_BUILD_NUMBER=${env.BUILD_NUMBER} && set NODE_ENV=production && ${buildCommand}" } } } stage("Archive Artifacts (${label})") { - archiveArtifacts artifacts: 'app_dist/**/*.dmg, app_dist/**/*.exe, app_dist/**/*.AppImage, app_dist/**/*.deb, app_dist/**/*.rpm', fingerprint: true + archiveArtifacts artifacts: 'app_dist/**/farmcontrol-server-*.dmg, app_dist/**/farmcontrol-server-*.exe, app_dist/**/farmcontrol-server-*.pkg, app_dist/**/farmcontrol-server-*.msi', fingerprint: true } } } } -def buildLinuxWithBun() { - return { - node('ubuntu') { - stage("Checkout (Linux)") { - checkout scm - } - - stage("Setup Bun (Linux)") { - sh ''' - curl -fsSL https://bun.sh/install | bash - export PATH="$HOME/.bun/bin:$PATH" - bun --version - ''' - } - - stage("Install Dependencies (Linux)") { - sh ''' - export PATH="$HOME/.bun/bin:$PATH" - bun install --frozen-lockfile - ''' - } - - stage("Build (Linux)") { - sh ''' - export PATH="$HOME/.bun/bin:$PATH" - NODE_ENV=production bun run build:linux - ''' - } - - stage("Archive Artifacts (Linux)") { - archiveArtifacts artifacts: 'app_dist/**/*.deb, app_dist/**/*.rpm', fingerprint: true +def setBuildNameFromPackageVersion() { + node('ubuntu') { + stage('Set Build Name') { + checkout scm + def version + nodejs(nodeJSInstallationName: 'Node23') { + version = sh( + script: "node -p \"require('./package.json').version\"", + returnStdout: true + ).trim() } + def buildName = "v${version}-b${env.BUILD_NUMBER}" + currentBuild.displayName = buildName + echo "Build name set to: ${buildName}" } } } try { + setBuildNameFromPackageVersion() + parallel( 'Windows Build': buildOnLabel('windows', 'pnpm build:electron'), 'MacOS Build': buildOnLabel('macos', 'pnpm build:electron'), - 'Linux Build': buildLinuxWithBun() + 'Ubuntu Build': { buildLinux() } ) echo 'All parallel stages completed successfully!' diff --git a/package.json b/package.json index 3ccf93c..8ad5f93 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "build:renderer": "pnpm build:electron-renderer && shx cp src/electron/preload.js build/electron/ && shx rm -rf build/electron/App.jsx build/electron/main.jsx build/electron/App.css build/electron/index.css build/electron/FarmControlLogo.jsx build/electron/vite.config.js build/electron/public build/electron/build", "build:electron-renderer": "vite build src/electron --outDir build/electron", "build:electron": "pnpm build && electron-builder", - "build:linux": "bun run cleanBuild && bun run build:server && shx mkdir -p app_dist/linux && pkg . --targets node18-linux-x64 --output app_dist/linux/farmcontrol-server && fpm -f -s dir -t deb -n farmcontrol-server -p app_dist/linux/ -v $(node -p \"require('./package.json').version\") --after-install packaging/linux/after-install.sh --after-remove packaging/linux/after-remove.sh app_dist/linux/farmcontrol-server=/usr/bin/farmcontrol-server packaging/linux/farmcontrol-server.service=/lib/systemd/system/farmcontrol-server.service && fpm -f -s dir -t rpm -n farmcontrol-server -p app_dist/linux/ -v $(node -p \"require('./package.json').version\") --after-install packaging/linux/after-install.sh --after-remove packaging/linux/after-remove.sh app_dist/linux/farmcontrol-server=/usr/bin/farmcontrol-server packaging/linux/farmcontrol-server.service=/lib/systemd/system/farmcontrol-server.service", + "build:linux": "pnpm run cleanBuild && pnpm run build:server && shx mkdir -p app_dist/linux && pkg . --targets node18-linux-x64 --output app_dist/linux/farmcontrol-server && fpm -f -s dir -t deb -n farmcontrol-server -p app_dist/linux/ -v $(node -p \"require('./package.json').version\") --after-install packaging/linux/after-install.sh --after-remove packaging/linux/after-remove.sh app_dist/linux/farmcontrol-server=/usr/bin/farmcontrol-server packaging/linux/farmcontrol-server.service=/lib/systemd/system/farmcontrol-server.service && fpm -f -s dir -t rpm -n farmcontrol-server -p app_dist/linux/ -v $(node -p \"require('./package.json').version\") --after-install packaging/linux/after-install.sh --after-remove packaging/linux/after-remove.sh app_dist/linux/farmcontrol-server=/usr/bin/farmcontrol-server packaging/linux/farmcontrol-server.service=/lib/systemd/system/farmcontrol-server.service", "cleanBuild": "rimraf build" }, "author": "Tom Butcher", @@ -74,6 +74,7 @@ "appId": "com.tombutcher.farmcontrolserver", "productName": "Farm Control Server", "executableName": "farmcontrol-server", + "artifactName": "farmcontrol-server-${version}-${arch}.${ext}", "icon": "assets/farmcontrolhosticon.png", "directories": { "output": "app_dist" @@ -83,10 +84,52 @@ "node_modules/**/*" ], "mac": { - "target": "dmg" + "target": [ + { + "target": "dmg", + "arch": [ + "arm64" + ] + }, + { + "target": "pkg", + "arch": [ + "arm64" + ] + }, + { + "target": "dmg", + "arch": [ + "x64" + ] + }, + { + "target": "pkg", + "arch": [ + "x64" + ] + } + ], + "mergeASARs": true, + "x64ArchFiles": "**/node_modules/@esbuild/darwin-x64/**", + "singleArchFiles": "**/node_modules/**" }, "win": { - "target": "nsis" + "target": [ + "nsis", + "msiWrapped" + ] + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true, + "perMachine": true + }, + "msiWrapped": { + "upgradeCode": "{A4E29F1C-8B3D-5E2A-9C71-1D6F8E4A2B90}", + "perMachine": true, + "impersonate": false, + "wrappedInstallerArgs": "/S" } } } diff --git a/src/electron/vite.config.js b/src/electron/vite.config.js index c6619ab..ada16e9 100644 --- a/src/electron/vite.config.js +++ b/src/electron/vite.config.js @@ -5,6 +5,7 @@ import svgr from "vite-plugin-svgr"; import svgo from "vite-plugin-svgo"; export default defineConfig({ + base: "./", plugins: [react(), svgr(), svgo()], root: path.resolve(__dirname), build: {