pipeline { agent { label 'ubuntu' } environment { NODE_ENV = 'production' } stages { stage('Checkout') { steps { checkout scm } } stage('Setup Node.js') { steps { nodejs(nodeJSInstallationName: 'Node23') { sh 'node -v' sh 'pnpm -v' } } } stage('Install Dependencies') { steps { nodejs(nodeJSInstallationName: 'Node23') { sh 'pnpm install --frozen-lockfile --production=false' } } } stage('Run Tests') { steps { nodejs(nodeJSInstallationName: 'Node23') { sh ''' export NODE_ENV=test export SESSION_SECRET=test-session-secret-for-testing-only pnpm test ''' } } post { always { junit 'test-results.xml' } } } stage('Deploy via SSH') { steps { sshPublisher(publishers: [ sshPublisherDesc( configName: 'farmcontrol.tombutcher.local', transfers: [ sshTransfer( cleanRemote: false, excludes: '*.*', execCommand: ''' if [ -e /home/farmcontrol/farmcontrol-api/src ]; then rm -rf /home/farmcontrol/farmcontrol-api/src fi if [ -e /home/farmcontrol/farmcontrol-api/package.json ]; then rm -rf /home/farmcontrol/farmcontrol-api/package.json fi if [ -e /home/farmcontrol/farmcontrol-api/package-lock.json ]; then rm -rf /home/farmcontrol/farmcontrol-api/package-lock.json fi if [ -e /home/farmcontrol/farmcontrol-api/node_modules ]; then rm -rf /home/farmcontrol/farmcontrol-api/node_modules fi ''', execTimeout: 120000, flatten: true, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/farmcontrol/farmcontrol-api', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '' ), sshTransfer( cleanRemote: false, excludes: 'node_modules/**', execCommand: ''' cd /home/farmcontrol/farmcontrol-api pnpm install --production sudo systemctl restart farmcontrol-api ''', execTimeout: 120000, flatten: false, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/farmcontrol/farmcontrol-api', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '**/*' ) ], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true ) ]) } } } post { always { cleanWs() } } }