首页 > 解决方案 > 电子构建器在詹金斯上失败: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"
  }
}

标签: node.jsjenkinselectron

解决方案


我使用调试器运行了我的构建脚本,我发现了一个标志,它是我解决该问题的方法。

该标志packElevateHelperhere所述,除非您确实需要提升功能,否则您可以显式省略它,从而完全避免复制文件的尝试。

例如,您的配置应该具有包含此属性的 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'));

当文件夹存在时,复制命令就可以正常工作。


推荐阅读