npm run dist -> fails in CI environment, works locally (EEXIST error during cleanup).
See original GitHub issue- electron-builder: tried with 22.2.0, 21.2.0, 20.0.0
- electron-updater: 4.0.0 (not relevant)
- node: 8 or 10 (tried both, same effect)
- target: MacOS (on MacOS agent)
Hi, first of all thanks everybody working on this great library. I’ve been using it over 2 years without issues in our CI environment (using electron-builder@19.56.0). I’m building the MacOS variant on a physical Mac agent.
Due to the notarizing and other fixes I updated to the latest electron builder. Locally everything works fine. However, when I run this build via the CI system (TeamCity) it always fails with EEXIST after building (during cleanup). When I move to the mac agent and run “npm run dist” from terminal (from that same working directory the build just failed in) it works fine, so it only fails when triggered by the CI environment. I’ve also swapped the physical agent for another one without luck, so I’m sure nothing is/was lingering on the agent.
If anyone could point me in any direction as to why this is happening? This doesn’t seem to happen on our window variant (which is built by the same system but on a windows agent). I also have a Jenkins instance available where I’ll be testing this on tomorrow, but I’m afraid the results will remain the same.
This is the error in question, it seems to copy a file that already exists.
Error: EEXIST: file already exists, link ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/debug/LICENSE’ -> ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac/Electron.app/Contents/Resources/app/node_modules/debug/LICENSE’
I noticed this is about the “debug” package, this package is not added to the package.json by myself, but rather trough other packages dependecies. I did confirm that some packages rely on 2.6.8 and others rely on 4.0.0 of that same package. Maybe this has something to do with the failure to copy?
I’ve ran the build with DEBUG=electron-builder which gave me this output: Note that I omitted the package.json, if that is needed I’ll follow up this post with it.
[17:21:27][npm run dist] • two package.json structure is used devPackageFile=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/package.json appPackageFile=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/package.json [17:21:28][npm run dist] • no native production dependencies [17:21:28][npm run dist] • packaging platform=darwin arch=x64 electron=6.1.7 appOutDir=dist/mac [17:21:28][npm run dist] • spawning command=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-bin/mac/app-builder unpack-electron --configuration [{“platform”:“darwin”,“arch”:“x64”,“version”:“6.1.7”}] --output /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac --distMacOsAppName Electron.app [17:21:28][npm run dist] • map async taskCount=2 [17:21:28][npm run dist] • map async taskCount=1 [17:21:28][npm run dist] • map async taskCount=334 [17:21:29][npm run dist] • exited command=app-builder code=0 pid=49637 [17:21:29][npm run dist] • asar using is disabled — it is strongly not recommended solution=enable asar and use asarUnpack to unpack files that must be externally available [17:21:29][npm run dist] • spawning command=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-bin/mac/app-builder node-dep-tree --dir /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=wrappy, once [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=@types/semver, builder-util-runtime, fs-extra, js-yaml, lazy-val, lodash.isequal, pako [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=sax [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=graceful-fs [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=graceful-fs [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=deep-equal, mkdirp [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=graceful-fs [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=1 unresolved=graceful-fs [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=graceful-fs [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=1 unresolved=graceful-fs [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=angular [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=native-promise-only [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=if-async, stream-slicer, through2 [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=inherits [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=lodash [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=angular-translate [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=angular-translate [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=electron-localshortcut [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=cookie, debug [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=debug, encodeurl, escape-html, on-finished, parseurl, statuses [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=depd, qs, content-type, debug, on-finished, type-is [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules round=0 unresolved=depd, setprototypeof, statuses [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=1 unresolved=depd, setprototypeof, statuses [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=unpipe, bytes, http-errors, iconv-lite [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=ms, on-finished, range-parser, debug, depd, escape-html, etag, fresh, statuses, encodeurl, http-errors [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=parseurl, send, encodeurl, escape-html [17:21:29][npm run dist] • unresolved deps nodeModuleDir=/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules round=0 unresolved=mime-types [17:21:29][npm run dist] • exited command=app-builder code=0 pid=49638 out=[{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules”,“deps”:[“debug”,“graceful-fs”,“iconv-lite”,“inherits”,“lodash”,“mime-db”,“mime-types”,“ms”,“once”,“qs”,“safer-buffer”,“wrappy”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules”,“deps”:[“7zip”,“@types/semver”,“accepts”,“accessibility-developer-tools”,“angular”,“angular-translate”,“angular-translate-loader-static-files”,“angular-translate-loader-url”,“argparse”,“array-flatten”,“async”,“balanced-match”,“body-parser”,“bootstrap”,“brace-expansion”,“builder-util-runtime”,“bytes”,“charenc”,“concat-map”,“connected-domain”,“content-disposition”,“content-type”,“cookie”,“cookie-signature”,“core-util-is”,“cross-unzip”,“crypt”,“debug”,“deep-equal”,“depd”,“destroy”,“devtron”,“each-async”,“ee-first”,“electron-debug”,“electron-devtools-installer”,“electron-is-accelerator”,“electron-is-dev”,“electron-localshortcut”,“electron-log”,“electron-updater”,“electron-window-state”,“encodeurl”,“escape-html”,“esprima”,“etag”,“express”,“finalhandler”,“forwarded”,“fresh”,“fs-extra”,“fs.realpath”,“glob”,“graceful-fs”,“highlight.js”,“http-errors”,“humanize-plus”,“iconv-lite”,“if-async”,“inflight”,“inherits”,“ipaddr.js”,“is-buffer”,“isarray”,“jquery”,“js-yaml”,“jsonfile”,“keyboardevent-from-electron-accelerator”,“keyboardevents-areequal”,“lazy-val”,“lodash”,“lodash.isequal”,“md5”,“media-typer”,“merge-descriptors”,“methods”,“mime”,“mime-db”,“mime-types”,“minimatch”,“minimist”,“mkdirp”,“moment”,“ms”,“native-promise-only”,“negotiator”,“netstats”,“on-finished”,“once”,“onetime”,“pako”,“parseurl”,“path-is-absolute”,“path-to-regexp”,“proxy-addr”,“ps-node”,“qs”,“range-parser”,“raven”,“raw-body”,“readable-stream”,“regedit”,“rimraf”,“safe-buffer”,“safer-buffer”,“sax”,“selective-whitespace”,“semver”,“send”,“serve-static”,“set-immediate-shim”,“setprototypeof”,“sprintf-js”,“stack-trace”,“statuses”,“stream-slicer”,“string_decoder”,“table-parser”,“through2”,“timed-out”,“tokenize-whitespace”,“type-is”,“universalify”,“unpipe”,“utils-merge”,“uuid”,“vary”,“wrappy”,“xtend”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/builder-util-runtime/node_modules”,“deps”:[“debug”,“ms”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/electron-debug/node_modules”,“deps”:[“electron-is-dev”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/electron-updater/node_modules”,“deps”:[“semver”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/electron-window-state/node_modules”,“deps”:[“jsonfile”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/http-errors/node_modules”,“deps”:[“inherits”]},{“dir”:“/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/regedit/node_modules”,“deps”:[“debug”,“ms”]}] [17:21:31][npm run dist] • async task error error=EEXIST: file already exists, link ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/debug/LICENSE’ -> ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac/Electron.app/Contents/Resources/app/node_modules/debug/LICENSE’ [17:21:31][npm run dist] • async task error error=EEXIST: file already exists, link ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/debug/LICENSE’ -> ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac/Electron.app/Contents/Resources/app/node_modules/debug/LICENSE’ [17:21:31][npm run dist] • async task error error=EEXIST: file already exists, link ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/debug/src/browser.js’ -> ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac/Electron.app/Contents/Resources/app/node_modules/debug/src/browser.js’ [17:21:31][npm run dist] • async task error error=EEXIST: file already exists, link ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/debug/src/index.js’ -> ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac/Electron.app/Contents/Resources/app/node_modules/debug/src/index.js’ [17:21:31][npm run dist] Error: EEXIST: file already exists, link ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/app/node_modules/debug/LICENSE’ -> ‘/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/dist/mac/Electron.app/Contents/Resources/app/node_modules/debug/LICENSE’ [17:21:31][npm run dist] at copyOrLinkFile (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/builder-util/src/fs.ts:189:12) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/builder-util/src/fs.ts:264:11 [17:21:31][npm run dist] at Generator.next (<anonymous>) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at FileCopier.copy (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/builder-util/src/fs.ts:242:64) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/util/appFileCopier.ts:74:36 [17:21:31][npm run dist] at Generator.next (<anonymous>) [17:21:31][npm run dist] at xfs.stat (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/fs-extra-p/node_modules/fs-extra/lib/mkdirs/mkdirs.js:56:16) [17:21:31][npm run dist] at callback (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/graceful-fs/polyfills.js:295:20) [17:21:31][npm run dist] at FSReqWrap.oncomplete (fs.js:154:5) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at copyAppFiles (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/out/util/appFileCopier.js:160:24) [17:21:31][npm run dist] at taskManager.addTask._bluebirdLst.default.each.it (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/platformPackager.ts:310:86) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at MacPackager.copyAppFiles (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/platformPackager.ts:310:43) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/platformPackager.ts:214:10 [17:21:31][npm run dist] at Generator.next (<anonymous>) [17:21:31][npm run dist] at runCallback (timers.js:705:18) [17:21:31][npm run dist] at tryOnImmediate (timers.js:676:5) [17:21:31][npm run dist] at processImmediate (timers.js:658:5) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at MacPackager.doPack (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/platformPackager.ts:167:165) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/macPackager.ts:90:63 [17:21:31][npm run dist] at Generator.next (<anonymous>) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at MacPackager.pack (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/macPackager.ts:82:95) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/packager.ts:430:24 [17:21:31][npm run dist] at Generator.next (<anonymous>) [17:21:31][npm run dist] at xfs.mkdir.er (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/fs-extra-p/node_modules/fs-extra/lib/mkdirs/mkdirs.js:37:14) [17:21:31][npm run dist] at FSReqWrap.args [as oncomplete] (fs.js:140:20) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at Packager.doBuild (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/packager.ts:396:24) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/packager.ts:366:57 [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at Packager._build (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/packager.ts:335:133) [17:21:31][npm run dist] at /Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/packager.ts:331:23 [17:21:31][npm run dist] at Generator.next (<anonymous>) [17:21:31][npm run dist] at runCallback (timers.js:705:18) [17:21:31][npm run dist] at tryOnImmediate (timers.js:676:5) [17:21:31][npm run dist] at processImmediate (timers.js:658:5) [17:21:31][npm run dist] From previous event: [17:21:31][npm run dist] at Packager.build (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/packager.ts:288:14) [17:21:31][npm run dist] at build (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/app-builder-lib/src/index.ts:59:28) [17:21:31][npm run dist] at build (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/electron-builder/src/builder.ts:228:10) [17:21:31][npm run dist] at then (/Users/rend/Documents/buildAgent/work/97a47f0f7948b943/src/node_modules/electron-builder/src/cli/cli.ts:49:19) [17:21:31][npm run dist] npm ERR! code ELIFECYCLE [17:21:31][npm run dist] npm ERR! errno 1 [17:21:31][npm run dist] npm ERR! niko_smart_config_tool@2.7.21510 dist:
electron-builder --x64 --ia32
[17:21:31][npm run dist] npm ERR! Exit status 1 [17:21:31][npm run dist] npm ERR! [17:21:31][npm run dist] npm ERR! Failed at the niko_smart_config_tool@2.7.21510 dist script. [17:21:31][npm run dist] npm ERR! This is probably not a problem with npm. There is likely additional logging output above. [17:21:31][npm run dist] [17:21:31][npm run dist] npm ERR! A complete log of this run can be found in: [17:21:31][npm run dist] npm ERR! /Users/rend/.npm/_logs/2020-01-14T16_21_31_648Z-debug.log
Thanks!
Issue Analytics
- State:
- Created 4 years ago
- Comments:6
Top GitHub Comments
Thanks for the test cases. If I may ask, what is
USE_HARD_LINKS
doing? The inline if-statement seems a bit…extravagant, curious as to why it’s only an env var instead of in the config?I’ve managed to track down a solution for the issue here.
This line seems to be causing me trouble. I’m not sure why I’m having this issue as I would believe this code to work fine.
Found in packages/builder-util/src/fs.ts line 140 (at time of writing)
const _isUseHardLink = process.platform !== "win32" && process.env.USE_HARD_LINKS !== "false" && (require("is-ci") || process.env.USE_HARD_LINKS === "true")
I have 3 cases (tested local and on agent)
Initial situation, no USE_HARD_LINKS variable (described in original post) -> succes local, fails in ci
add USE_HARD_LINKS=true -> fails local, fails ci
add USE_HARD_LINKS=false -> success local, success on ci
Based on the code, _isUseHardLink is true when running from CI or setting the environment variable (except for win32 builds). It seems I can only run my CI build with the hard links disabled, but from the code it looks that it’s supposed to be on. Am I missing something here?
On the positive, my issue seems to be resolved by adding the USE_HARD_LINKS=false explicitly on the build configuration. I’m just wondering if this is OK (as I didn’t need to do this before updating electron-builder).