node.js - 电子构建器在詹金斯上失败:ENOENT:没有这样的文件或目录,copyfile elevate.exe
问题描述
我已经开始研究一个旧的基于 Electron 的应用程序。作为这项工作的一部分,我需要更新许多包,包括 electron-builder。
在对所有包版本等进行多次调整后,我在本地机器上构建了应用程序,即 Windows 10。
当我将构建推送到 jenkins 并尝试使用电子构建时,出现以下错误: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'。
我了解这意味着该文件基本上不存在?我不明白这将如何发生,因为相同的构建配置正在使用以前版本的电子构建器构建应用程序,但现在它不是。我已经使用了最新版本的电子生成器,并开始在没有运气的情况下重新使用这些版本。
jenkins 服务器是 CentOS,并且使用了 docker-wine 容器。我无法控制我只能提交构建的实际构建服务器。
构建错误:
电子生成器 --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",
生成器.json:
{
"win": {
"icon": "app/ico/icon.ico"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"include": "installer.nsh"
},
"directories": {
"output": "release"
}
}
解决方案
我使用调试器运行了我的构建脚本,我发现了一个标志,它是我解决该问题的方法。
该标志packElevateHelper
如here所述,除非您确实需要提升功能,否则您可以显式省略它,从而完全避免复制文件的尝试。
例如,您的配置应该具有包含此属性的 NSIS 选项:
"nsis": {
"packElevateHelper": false,
},
更新:
我刚刚确认了一种为我制作此通行证的方法,该通行证复制了elevate.exe
.
确保创建应用程序.exe
文件的二进制输出文件夹也包含一个resources
文件夹。copyfile
尝试复制elevate.exe
到软件包中的文件夹进行安装的调用resources
并不能确保该文件夹已经存在。
在我的情况下,使用prepackaged
属性设置为我的二进制构建输出文件夹的编程 API,我在创建目录后electron-builder
build
简单地调用了该函数,如下所示:
fs.promises.mkdir(path.join(<path_to_binary_folder>, 'resources'));
当文件夹存在时,复制命令就可以正常工作。
推荐阅读
- amazon-web-services - 使用胶水(Python/Pyspark)通过配置文件循环从源到s3的多个表?
- maven - 在并行构建中使用 rf (resume from) 时 mvn 会做什么?
- linux - KVM - 获取段寄存器值
- xml - XSLT:基于属性拆分 xml 文件
- python - Django Redis 连接重置
- angular - 如何使用铯做层的时间线?
- kubernetes - 无论稳定窗口如何,Kubernetes HPA 都在摆动副本
- flutter - 将导航栏颜色更改为白色,将图标更改为深色,隐藏/显示应用程序时不会粘住
- actionscript-3 - 在警报对话框中的消息中添加换行符?
- c# - UWP C# 将 png 转换为 pdf