#node.js #jenkins #electron
#node.js #дженкинс #electron
Вопрос:
Я начал работать над старым приложением на базе Electron. В рамках этой работы мне нужно было обновить многие пакеты, включая electron-builder.
После многих настроек всех версий пакетов и т. Д. У меня есть приложение, созданное на моем локальном компьютере, который является Windows 10.
Когда я отправляю сборку в jenkins и пытаюсь выполнить сборку electron, я получаю следующую ошибку: ENOENT: нет такого файла или каталога, copyfile ‘/root/.cache/electron-builder/nsis/nsis-3.0.3.2/elevate.exe ‘ -> ‘/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/electron-packager/win32-x64/MYAPP-win32-x64/resources/elevate.exe’.
Я понимаю, что это означает, что файл в основном не существует? Я не понимаю, как это могло произойти, поскольку та же конфигурация сборки создавала приложение с предыдущими версиями electron-builder, но теперь это не так. Я перешел на последнюю версию electron-builder и начал работать с версиями, но безуспешно.
Сервер jenkins — CentOS, и используется контейнер docker-wine. У меня нет контроля над фактическим сервером сборки, я могу только фиксировать свои сборки.
ОШИБКА СБОРКИ:
electron-builder —win —x64 —ia32 —pd=»electron-packager /win32-x64/MYAPP-win32-x64″ —config=builder.json
• electron-builder version=21.2.0 os=3.10.0-327.18.2.el7.x86_64
• artifacts will be published if draft release exists reason=CI detected
• loaded configuration file=/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/builder.json
• building target=nsis file=release/MYAPP Setup 3.0.3.exe archs=x64, ia32 oneClick=false perMachine=true
• downloading url=https://github.com/electron-userland/electron-builder-binaries/releases/download/nsis-3.0.3.2/nsis-3.0.3.2.7z size=1.4 MB parts=1
• downloaded url=https://github.com/electron-userland/electron-builder-binaries/releases/download/nsis-3.0.3.2/nsis-3.0.3.2.7z duration=6.237s
⨯ ENOENT: no such file or directory, copyfile '/root/.cache/electron-builder/nsis/nsis-3.0.3.2/elevate.exe' -> '/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/electron-packager/win32-x64/MYAPP-win32-x64/resources/elevate.exe' stackTrace=
Error: ENOENT: no such file or directory, copyfile '/root/.cache/electron-builder/nsis/nsis-3.0.3.2/elevate.exe' -> '/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/electron-packager/win32-x64/MYAPP-win32-x64/resources/elevate.exe'
at processImmediate (internal/timers.js:458:21)
From previous event:
at NsisTarget.buildInstaller (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/app-builder-lib/src/targets/nsis/NsisTarget.ts:203:29)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at NsisTarget.finishBuild (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/app-builder-lib/src/targets/nsis/NsisTarget.ts:110:7)
at async Promise.all (index 2)
at AsyncTaskManager.awaitTasks (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/builder-util/src/asyncTaskManager.ts:65:25)
at Packager.doBuild (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/app-builder-lib/src/packager.ts:449:5)
at executeFinally (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/builder-util/src/promise.ts:12:14)
at Packager._build (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/app-builder-lib/src/packager.ts:366:31)
at Packager.build (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/app-builder-lib/src/packager.ts:330:12)
at executeFinally (/home/jenkins/workspace/MYAPP_myapp-client_master-BZL24OQAMKV5LCPISXOCH6VJELCMS26NKBSHJ6R43G746JVMSVBQ/node_modules/builder-util/src/promise.ts:12:14)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! myapp-client@3.0.3 installer:win: `electron-builder --win --x64 --ia32 --pd="electron-packager/win32-x64/MYAPP-win32-x64" --config=builder.json`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the myapp-client@3.0.3 installer:win script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2020-09-01T12_10_26_791Z-debug.log
[Pipeline]
[Pipeline] // node
[Pipeline] End of Pipeline
[Bitbucket] Notifying commit build result
[Bitbucket] Build result notified
ERROR: script returned exit code 1
Finished: FAILURE
Версии пакетов:
"electron-builder": "21.2.0",
"electron-packager": "7.6.0",
"electron": "8.5.0",
Builder.json:
{
"win": {
"icon": "app/ico/icon.ico"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"include": "installer.nsh"
},
"directories": {
"output": "release"
}
}
Ответ №1:
Я запустил свой скрипт сборки с помощью отладчика и нашел флаг, который был моим решением проблемы.
Флаг, packElevateHelper
как описано здесь, и если вам действительно не нужна функция повышения, вы можете явно опустить его и, следовательно, полностью избежать попытки скопировать файл.
Например, в вашей конфигурации должны быть параметры NSIS, которые включают это свойство:
"nsis": {
"packElevateHelper": false,
},
Обновить:
Я только что подтвердил способ сделать этот проход для меня, который копирует elevate.exe
.
Убедитесь, что папка двоичного вывода, в которой был создан .exe
файл вашего приложения, также содержит resources
папку. copyfile
Вызов, который пытался скопировать elevate.exe
в resources
папку в вашем пакете для установки, не гарантирует, что эта папка уже существует.
В моем случае, используя программный API со prepackaged
свойством, установленным для моей папки вывода двоичной сборки, я просто вызвал electron-builder
build
функцию после создания каталога следующим образом:
fs.promises.mkdir(path.join(<path_to_binary_folder>, 'resources'));
Когда папка существует, команда копирования работает просто отлично.
Комментарии:
1. Можете ли вы привести реальный пример?