Jest: ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์บ์‹œ ์“ฐ๊ธฐ ๊ฒฝ์Ÿ ์กฐ๊ฑด

์— ๋งŒ๋“  2017๋…„ 09์›” 07์ผ  ยท  79์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ๋ณด๊ณ  ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ณค์ถฉ

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ƒˆ๋กœ์šด ์›์ž ์บ์‹œ ์“ฐ๊ธฐ์™€ ๋ณ‘๋ ฌ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์— ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ ํ•  ๋•Œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. --no-cache ์˜ต์…˜์„ ์„ค์ •ํ•ด๋„ ์—ฌ์ „ํžˆ ํŒŒ์ผ์— ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  1. --no-cache ์บ์‹œ ํŒŒ์ผ์„ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
  2. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์บ์‹ฑ์ด ์ถฉ๋Œํ•ด์„œ๋Š” ์•ˆ๋˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ Jest ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  Jest, ๋…ธ๋“œ, yarn / npm ๋ฒ„์ „ ๋ฐ ์šด์˜ ์ฒด์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.

{
    "clearMocks": true,
    "collectCoverageFrom": [
        "packages/**/src/**/*.{ts,tsx}",
        "!packages/sf-lint/**",
        "!**/*.d.ts"
    ],
    "coverageReporters": [
        "text-summary"
    ],
    "moduleFileExtensions": [
        "ts",
        "tsx",
        "js",
        "json"
    ],
    "setupTestFrameworkScriptFile": "<rootDir>/jestEnvironment.js",
    "transform": {
        "\\.(ts|tsx)$": "<rootDir>/scripts/preprocessTypescript.js",
        "\\.(less|css|svg|gif|png|jpg|jpeg)$": "<rootDir>/scripts/preprocessText.js"
    },
    "testRegex": "(Spec|.spec).tsx?$"
}

๋†๋‹ด 21.0.1
๋…ธ๋“œ 6.9.2
์›์‚ฌ 0.27.x / 1.0.0
OS Windows

Help Wanted Windows

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๋ƒฅ ์นฉ ์ธ-Windows Jenkins CI ์„œ๋ฒ„์—์„œ jest 23.6์œผ๋กœ ์ด๊ฒƒ์„๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • --runInBand ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์„ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ ค์„œ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘ธ์‹œ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์›์„ ๋งค์šฐ ์Šฌํ”„๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • @jsheetzati (https://github.com/facebook/jest/issues/4444#issuecomment-370533355)์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด package.json ์˜ graceful-fs ์žฌ์ •์˜๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค.

graceful-fs ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ์ผ์„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— (https://github.com/isaacs/node-graceful-fs/pull/131์€ ์ž‘๋…„ 7 ์›” ์ดํ›„๋กœ ํ–‰๋™์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค), ์•„๋งˆ๋„ ํฌํฌ ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ? ๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ์ž”์†Œ๋ฆฌ ์ฃผ์„์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ด๊ฒƒ์„ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋›ฐ์–ด๋“ค ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ':

๋ชจ๋“  79 ๋Œ“๊ธ€

๊ด€๋ จ์ด ์—†๋‚˜์š”? https://github.com/facebook/jest/pull/4432

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ฏฟ์ง€ ์•Š๋Š”๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ๋Š” 2 ๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค (๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ)์— ๋Œ€ํ•ด ๋™์ผํ•œ ํŒŒ์ผ์ด ์กฐ๋กฑ๋˜์–ด ํ•œ ํ”„๋กœ์„ธ์Šค์— ํŒŒ์ผ์ด ์ž ๊ฒจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ์“ฐ๊ธฐ ์ž‘์—…์ด ์‹คํŒจํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ‹ฐ์ผ“์€ ๊ฐ™์€ ๋‚ด์šฉ์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๊ด€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์‚ฌ๋ก€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค. ์žฌํ˜„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ jest cacheDirectory ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋‹ค์Œ ์‹คํ–‰์‹œ ์บ์‹œ ์ƒ์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
```ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

jest: failed to cache transform results in:

C : / myniceproject / src / jest-cache / jest-transform-cache-b2e8f1f700b9bd266a0d27bb01b47a2b-34a7e3d71d38ff01f65fdb5abdf5126b / 3f / settingsProvider_3f1439e55275a95ecfdb7dcb432f7958
์‹คํŒจ ๋ฉ”์‹œ์ง€ : EPERM : ์ž‘์—…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ, ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ
'C : myniceprojectsrcjest-cachejest-transform-cache-b2e8f1f700b9bd266a0d27bb01b47a2b-34a7e3d71d38ff01f65fdb5abdf5126b3fsettingsProvider_3f1439e55275a95ecfdb7dcb432f7958.1630729137'
->
'C : myniceprojectsrcjest-cachejest-transform-cache-b2e8f1f700b9bd266a0d27bb01b47a2b-34a7e3d71d38ff01f65fdb5abdf5126b3fsettingsProvider_3f1439e55275a95ecfdb7dcb432f7958'`

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Jest๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

20.0.4์—์„œ 21.2.0์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ ํ•˜๋Š”๋ฐ ์ด์ œ ๋นŒ๋“œ ์„œ๋ฒ„์— ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Test suite failed to run
[13:46:50]
[13:46:50]    jest: failed to cache transform results in: C:/TeamCity/buildAgent/temp/buildTmp/jest/jest-transform-cache-c60bb8ad55f1dbc29115038800657f2f-4895fc34da3cd9ad1e120af622bca745/3b/fe-selectors_3b56db772e798e2e4d0c9fc7c9e4a770
[13:46:50]    Failure message: EPERM: operation not permitted, rename '...\jest\jest-transform-cache-c60bb8ad55f1dbc29115038800657f2f-4895fc34da3cd9ad1e120af622bca745\3b\fe-selectors_3b56db772e798e2e4d0c9fc7c9e4a770.1701848979' -> '...\jest\jest-transform-cache-c60bb8ad55f1dbc29115038800657f2f-4895fc34da3cd9ad1e120af622bca745\3b\fe-selectors_3b56db772e798e2e4d0c9fc7c9e4a770'
[13:46:50]      
[13:46:50]      at Object.fs.renameSync (fs.js:772:18)
[13:46:50]      at Function.writeFileSync [as sync] (node_modules/write-file-atomic/index.js:192:8)

๋‚˜๋Š” ์ด์ œ ๋™์ผํ•œ ๋ฌธ์ œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค.

--runInBand ํ”Œ๋ž˜๊ทธ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์ƒ๋‹นํžˆ ์ผ๊ด€๋˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  โ— Test suite failed to run

    jest: failed to cache transform results in: .../jest-transform-cache-...
    Failure message: EPERM: operation not permitted, rename '...' -> '...'
        at Error (native)

      at Object.fs.renameSync (fs.js:810:18)
      at Function.writeFileSync [as sync] (node_modules/write-file-atomic/index.js:192:8)

๋†๋‹ด 21.2.1
๋…ธ๋“œ 6.11.1
OS Windows

--no-cache ๋Š” ๋„์›€ jest-transform-cache ๋Š” ์•„์ง ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค. ๋„์›€์ด๋˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ --runInBand ์ด๋ฉฐ, ์ด๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฑฐ์˜ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์ง„๋‹จ์„ ์œ„ํ•ด ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์žฌํ˜„ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ด ์˜ค๋ฅ˜๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ? ์ „์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ๊ฒฝ๊ณ ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฑ ์˜คํ”„ํ•˜๊ณ  ์žฌ ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ž‘์€ ์žฌํ˜„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/asapach/jest-cache-issue/
๋ณ€ํ™˜ ์บ์‹œ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด babel-jest ๊นŒ์ง€ lodash-es ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ (Win8.1 ๋ฐ Win10)์—์„œ 80 %์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
--no-cache ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด 100 % ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. --runInBand ์ถ”๊ฐ€ํ•˜๋ฉด 0 %๋กœ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

(ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ Win10์˜ WSL ์—์„œ ์‹คํ–‰์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ Posix API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Œ)

Windows์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๊ฐ€์ƒ ๋จธ์‹  ์ด์™ธ์˜ Windows ๋จธ์‹ ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

@jeanlauliac # 4088์— write-file-atomic ์„ (๋ฅผ) ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์™€ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” https://github.com/npm/write-file-atomic/issues/10 ๋ฐ https://github.com/npm/write-file-atomic/pull/22 ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋ฐฉ๊ธˆ procmon ์ถ”์ ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฌธ์ œ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์‹œ๊ฐ„ | ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„ | PID | ์šด์˜ | ๊ฒฝ๋กœ | ๊ฒฐ๊ณผ | ์„ธ๋ถ€ ๋ฌ˜์‚ฌ
-| -| -| -| -| -| -
16 : 54 : 43.2304011 | node.exe | 7624 | SetRenameInformationFile | ... constant_ee286bbcf367680ce61a90e506522f92.82986661 | ์„ฑ๊ณต | ReplaceIfExists : True, ํŒŒ์ผ ์ด๋ฆ„ : ... constant_ee286bbcf367680ce61a90e506522f92
16 : 54 : 43.2305499 | node.exe | 8208 | SetRenameInformationFile | ... constant_ee286bbcf367680ce61a90e506522f92.103872574 | ์•ก์„ธ์Šค ๊ฑฐ๋ถ€ | ReplaceIfExists : True, ํŒŒ์ผ ์ด๋ฆ„ : ... constant_ee286bbcf367680ce61a90e506522f92

๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ 1ms ์ด๋‚ด์— ๋™์ผํ•œ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

npm / write-file-atomic # 22๊ฐ€ writeFile() ์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „์„ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ writeFileSync() ๋Š” ์—ฌ์ „ํžˆ ์˜ํ–ฅ์„๋ฐ›์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ํŒŒ์ผ์— ๋Œ€ํ•ด worker-farm ์—์„œ write-file-atomic ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์‹คํŒจ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์žฌํ˜„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ์‹œ์ž‘์ด ๋  ์ˆ˜์žˆ๋Š” ๋™์ผํ•œ ์˜ค๋ฅ˜ (์‘์šฉ ์ž CI๊ฐ€ ์žˆ์Œ)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” jest ๋‚ด์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด?

์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์“ฐ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ „์ฒด ํ…Œ์ŠคํŠธ ํŒŒ์ผ?

์ข‹์•„์š”. ๋‹ค๋ฅธ ์žฌํ˜„์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์บ์‹œ๋ฅผ ๋น„ํ™œ์„ฑํ™” / ์ •๋ฆฌํ•˜๊ณ  ์‹คํŒจ ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋†๋‹ด ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์Œ, ์šฐ์„  --no-cache ๊ฐ€ ์ผœ์ ธ์žˆ์„ ๋•Œ๋„ ์บ์‹œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์•„์•ผํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
๋‘˜์งธ, ๋™๊ธฐํ™” ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์žฌ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. writeFile() ๋Œ€์‹  writeFileSync() ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด write-file-atomic ๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ ์‹œ๋„๋ฉ๋‹ˆ๋‹ค (ํ™•์ธ์„ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค).

์Œ, ์šฐ์„  --no-cache ๊ฐ€ ์ผœ์ ธ์žˆ์„ ๋•Œ๋„ ์บ์‹œ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์•„์•ผํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ ์ด๋ฉฐ ๋ณ„๋„๋กœ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ --no-cache ๋Š” ์ ์–ด๋„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, ๋™๊ธฐํ™” ์ž‘์—…์„ ์ œ๋Œ€๋กœ ์žฌ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. writeFile() ๋Œ€์‹  writeFileSync() ์žˆ์Šต๋‹ˆ๊นŒ?

@cpojer ๊ฐ€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋„๋ก ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ

  • --no-cache ์€ ์‹ค์ œ๋กœ --reset-cache ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ์กด ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ์“ฐ๊ธฐ ์บ์‹œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์‚ฌ์šฉ์ž ์ฝ”๋“œ์—์„œ require ํ˜ธ์ถœ ์ค‘์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™”๋˜์–ด์•ผํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

worker-farm ๋ฐ write-file-atomic ์˜ ๋‹ค๋ฅธ ์žฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/asapach/write-atomic-issue

์ง€๊ธˆ๊นŒ์ง€ ์ฐพ์€ ๊ฒฐ๊ณผ : ๋™๊ธฐํ™” ๋ฒ„์ „์ด ์˜ˆ์ƒ๋Œ€๋กœ ์‹คํŒจํ•˜์ง€๋งŒ ๋†€๋ž๊ฒŒ๋„ ๋น„๋™๊ธฐ ๋ฒ„์ „๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์žฌ์‹œ๋„ ๋Œ€๊ธฐ์—ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์— ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค.

์ƒˆ ๊นƒ๋ฐœ? ๋งค์šฐ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€์žˆ๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด CI์—์„œ๋Š” ์–ด์จŒ๋“  ์บ์‹œ๋ฅผ ๊ฑฐ์˜ ์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด --no-cache ๋™์•ˆ ๋‹จ์ผ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋‚ด์—์„œ ์ƒ์„ฑ ๋œ ์บ์‹œ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ธฐ์กด ์บ์‹œ ๋งŒ ๋ฌด์‹œํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์€ worker-farm ๋ฐ write-file-atomic ์˜ ๋‹ค๋ฅธ ์žฌํ˜„์ž…๋‹ˆ๋‹ค.

๋Œ€๋ฐ•! write-file-atomic์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ (ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ) ์šฐ๋ฆฌ ์ชฝ์—์„œ ๋‹ค์‹œ ๊ฒ€ํ†  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋กœ์ปฌ์—์„œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๋˜ ํŒจ์น˜๋Š” ๋™์ผํ•œ ๋‚ด์šฉ์„ ๊ฐ€์ง„ ํŒŒ์ผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณผ์ •์ด ๊ฒฝ์ฃผ์—์„œ '์Šน๋ฆฌ'ํ•œ๋‹ค๋Š” ์˜๋ฏธ ์ผ ๋ฟ์ด๋ฏ€๋กœ ๋ฌด์‹œํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const cacheWriteErrorSafeToIgnore = (
  e: Error,
  cachePath: Path,
  fileData: string,
) => {
  if (
    e.message &&
    e.message.indexOf('EPERM: operation not permitted, rename') > -1
  ) {
    try {
      const currentContent = fs.readFileSync(cachePath, 'utf8');
      return fileData === currentContent;
    } catch (e) {
    }
  }
  return false;
};

@SimenB , ๋ฌผ๋ก  ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@cpojer ,์ด ์˜ค๋ฅ˜๋ฅผ ์‚ผํ‚ค๊ฑฐ๋‚˜ ๋ฌด์‹œํ•˜๊ณ  ๊ฒฝ๊ณ ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” ํŒŒ์ผ์ด ์ด๋ฏธ ๊ธฐ๋ก๋˜์—ˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์—…์ŠคํŠธ๋ฆผ ๋ฌธ์ œ : npm / write-file-atomic # 28

๋‚˜๋Š” ์ด๊ฒƒ์ด "์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ"๊ฐ€ Windows์—์„œ ์›์ž ์  ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ write-file-atomic ์˜ ๊ฐ€์ •์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. Windows API ์ˆ˜์ค€์—์„œ ํ™œ์„ฑํ™” ํ•  ์ˆ˜์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์œผ๋ฉด Windows์—์„œ ์›์ž ์  ์“ฐ๊ธฐ / ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jwbay ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์ด ๋‚˜์—๊ฒŒ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค! ๐Ÿ‘ indexOf ๋Œ€์‹  e.code === 'EPERM' (๋” ๊ฐ•๋ ฅํ•˜๊ณ  ํŠน์ • ๋ฉ”์‹œ์ง€์— ์˜์กดํ•˜์ง€ ์•Š์Œ). ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์„ ๋‹ค์‹œ ์ฝ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ถ”๊ฐ€ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์˜ˆ : ํŒŒ์ผ์ด ๋™์‹œ์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ž‘์„ฑ๋˜๋Š” ๊ฒฝ์šฐ). PR ์ข€ ๋ณด๋‚ด ์ฃผ ์‹œ๊ฒ ์–ด์š”?

write-file-atomic ์— ๋Œ€ํ•œ PR ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. "ํŒŒ์ผ ๋™๊ธฐํ™”๋ฅผ ์ž‘์„ฑํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜์ง€๋งŒ ์ด๋ฏธ ๋น„๋™๊ธฐ๋กœ ์ž‘์„ฑ๋˜๋„๋ก ๋Œ€๊ธฐ์—ด์—์žˆ๋Š” ๊ฒฝ์šฐ, ๊ตฌ์ œ ์กฐ์น˜๋ฅผ ์ทจํ•˜์‹ญ์‹œ์˜ค."(์˜ต์…˜์ด์žˆ์„ ์ˆ˜ ์žˆ์Œ) ๋™์ž‘์„ ์ผœ๋ ค๋ฉด). ํ•˜์ง€๋งŒ Jest ์ˆ˜์ค€์—์„œ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋‹ค๋ฉด ์„œ๋‘๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. cc @jeanlauliac

ํ•„์ž๋Š” "ํŒŒ์ผ ๋™๊ธฐํ™”๋ฅผ ์ž‘์„ฑํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜์ง€๋งŒ ๋น„๋™๊ธฐ๋กœ ์ž‘์„ฑ ๋  ๋Œ€๊ธฐ์—ด์— ์ด๋ฏธ์žˆ๋Š” ๊ฒฝ์šฐ"(์•„๋งˆ๋„ ๋‹ค์Œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ)์— ๋Œ€ํ•œ PR ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์ž‘์„ ์ผœ์‹ญ์‹œ์˜ค).

์ด ๋…ผ๋ฆฌ (๋กœ์ปฌ ํ)๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์— ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ (์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ) ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์บ์‹ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์žฌ๊ณ ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์บ์‹œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๊ณ  ์ผ์ข…์˜ IPC๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. memcached ์™€ ๊ฐ™์€ ๊ธฐ์กด ํ‚ค / ๊ฐ’ ์ €์žฅ์†Œ ์‹œ์Šคํ…œ์ด ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋…ผ๋ฆฌ (๋กœ์ปฌ ํ)๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์— ์“ฐ๋ ค๊ณ  ํ•  ๋•Œ (์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ) ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„, ์•„๋งˆ ๊ทธ ๋ฌธ์ œ๋ฅผ ์˜คํ•ดํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ์€ ๋ฐฉ์‹์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ด๋ฏธ ๋น„๋™๊ธฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋Œ€๊ธฐ์—ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์ง€๋งŒ ๋™๊ธฐํ™” ์š”์ฒญ์„ ํ˜ผํ•ฉํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ํ’€ ์š”์ฒญ์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ํ–ˆ๋‹ค!

@mekwall, ๋‚˜๋Š” ๊ทธ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ƒ๊ฐ rename() ์—์„œ ์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „ writeFile() , ๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ๋‚ด ํ…Œ์ŠคํŠธ์— ์‹คํŒจ https://github.com/asapach/write-atomic-issue. ๋‚ด ์žฌํ˜„์„ ์‹คํ–‰ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ท€ํ•˜์˜ ๋ณ€๊ฒฝ์ด์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@asapach ๋‚ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์ด๋Š” ๋งค๋ฒˆ ๊ฐ€์ ธ ์˜ค๋Š” ๋™์•ˆ EPERM: operation not permitted, rename ๋ฅผ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@mekwall , ๊ทธ๋ž˜, ์—ฌ์ „ํžˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค (๋น„๋™๊ธฐ ์ ์ด์ง€๋งŒ). (์•„๋ž˜์—์„œ ์ˆ˜์ • ๋จ)

๋˜๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์‹คํŒจํ•˜์ง€ ์•Š์ง€๋งŒ (๋™๊ธฐํ™” ํ๋ฆ„์ด ์ค‘๋‹จ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—) ์ฝ˜์†”์€ ์—ฌ์ „ํžˆ โ€‹โ€‹EPERM ์˜ค๋ฅ˜๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค.

@asapach ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. graceful-fs ํด๋ฆฌ ํ•„์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด PR์— ์ˆ˜์ • ์‚ฌํ•ญ์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/isaacs/node-graceful-fs/pull/119

@mekwall , ์˜ˆ ์ด๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ๋ฐ ๋น„๋™๊ธฐ ๋ฒ„์ „ ๋ชจ๋‘์—์„œ ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋ฌธ์ œ๋Š” fs.unlinkSync(tmpfile) ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž„์‹œ ํŒŒ์ผ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/npm/write-file-atomic/pull/29/files#diff -168726dbe96b3ce427e7fedce31bb0bcR198

@asapach graceful-fs ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์— ์—ฐ๊ฒฐ ํ•ด์ œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Afaik fs.rename ๋Š” MoveFile ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์†Œ์Šค๋ฅผ ๋Œ€์ƒ์— ๋ณต์‚ฌํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๋Š” ์ด๋ฆ„ ๋งŒ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋ฉฐ ์†Œ์Šค์™€ ๋Œ€์ƒ์€ ๋™์‹œ์— ์กด์žฌํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

@mekwall ์€ ์•ฝ๊ฐ„ ๋„์›€์ด๋˜์ง€๋งŒ ์ž‘์—…์ž๊ฐ€ ์ผ์ฐ ์ข…๋ฃŒ๋˜๋ฉด (๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—) ์ผ๋ถ€ ํŒŒ์ผ์€ ์ •๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ฒ„์ „์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@asapach ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์˜๋„ ํ•œ ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. graceful-fs์˜ ์š”์ ์€ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋” ์ž์„ธํžˆ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๋ฒ”์ธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค :)

@asapach ๋‚˜๋Š” ๊นจ๋‹ฌ์•˜๋‹ค ๋‚ด PR์„์œ„ํ•œ write-file-atomic ํ•˜๊ณ ์žํ•˜์ง€ ์ž‘์—…, ๋‚˜๋Š” ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค๋ฅธ ์ ‘๊ทผ์„ํ–ˆ๋‹ค, ๊ทธ๋ž˜์„œ fs.renameSync ์—์„œ graceful-fs ์™€ ๊ฐ™์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ fs.rename ๊ทธ๋Ÿฌ๋‚˜ ์ฐจ๋‹จ. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

@mekwall , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์žฌํ˜„ ์‚ฌ๋ก€ ๋ชจ๋‘์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ–ˆ์ง€๋งŒ ์‹คํŒจํ•œ ์‚ฌ๋ก€๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๋‹จ์ ์œผ๋กœ๋Š” ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด CPU ๋ฐ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ์˜ˆ์ƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹  ๋งŽ์€ ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ์‚ฌ! โค๏ธ graceful-fs์˜ ์ˆ˜์ •์ด ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์ •์ด๋˜์–ด ์ถœ์‹œ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@SimenB ์ฒœ๋งŒ ์—์š”! ์šฐ๋ฆฌ๋Š” ์ง์žฅ์—์„œ ์ด๋กœ ์ธํ•ด ๊ณ ํ†ต์Šค๋Ÿฌ์›Œ์„œ ์šฐ๋ฆฌ ํŒ€์—์„œ ์ด๊ฒƒ์„ ์กฐ์‚ฌ ํ•  ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋งŽ์€ ํŒจํ‚ค์ง€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์–ธ์ œ ์ถœ์‹œ ๋ ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@cpojer ํ์‡„ ์ด์œ ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ๊ณต๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•„์ง graceful-fs์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด https://github.com/isaacs/node-graceful-fs/pull/119 ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์›์‚ฌ ํ•ด์ƒ๋„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( https://yarnpkg.com/en/docs/selective-version-resolutions ์ฐธ์กฐ). CI ๋“ฑ์— ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ

{
  "resolutions": {
    "graceful-fs": "mekwall/node-graceful-fs#a10aa576f771d7cf3dfaee523f2e02d6eb11a89f"
  }
}

@SimenB ๊ทธ๊ฒƒ์€ ์ ์–ด๋„ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

+1 ๋‚˜์—๊ฒŒ๋„.

@SimenB ๋˜ํ•œ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ ์ด์ œ Windows์—์„œ

ํŽธ์ง‘ : ์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ ๋‚ด dev ๋žฉํ†ฑ์—์„œ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๋นŒ๋“œ ์„œ๋ฒ„์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ yarn 1.2.1์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ด์œ ์ผ๊นŒ์š”?

[16:47:55][Step 5/8]     jest: failed to read cache file: D:/TeamCity/buildAgent2/temp/buildTmp/jest/jest-transform-cache-c39254d365b4bcb2c90f133d4b359d91-56a1804d8d831b3401a35a7e81857f3b/7e/rafPolyfill_7e7a83ed3f2680ba9aec0e45f59ade5d
[16:47:55][Step 5/8]     Failure message: EPERM: operation not permitted, open 'D:\TeamCity\buildAgent2\temp\buildTmp\jest\jest-transform-cache-c39254d365b4bcb2c90f133d4b359d91-56a1804d8d831b3401a35a7e81857f3b\7e\rafPolyfill_7e7a83ed3f2680ba9aec0e45f59ade5d'
[16:47:55][Step 5/8]       
[16:47:55][Step 5/8]       at readCacheFile (node_modules/jest-runtime/build/script_transformer.js:465:60)

Yarn 1.0.0์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์„ ๋„ฃ์œผ๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ENOENT ๋ฐ EPERM ์œ„๋ฐ˜์ด ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค.

    jest: failed to read cache file: C:/Users/dev/AppData/Local/Temp/jest/jest-transform-cache-857f905b2da01d52a9d1d17b6772ea4a-3a91587e29d4fef23c6e0cf16b2f5679/7d/index_7d0afc82f0b29ec31c4b5f296cbdee74
    Failure message: ENOENT: no such file or directory, open 'C:\Users\dev\AppData\Local\Temp\jest\jest-transform-cache-857f905b2da01d52a9d1d17b6772ea4a-3a91587e29d4fef23c6e0cf16b2f5679\7d\index_7d0afc82f0b29ec31c4b5f296cbdee74'

      at Object.fs.openSync (../fs.js:653:18)
      at Object.fs.readFileSync (../fs.js:554:33)

๊ณผ

    jest: failed to read cache file: C:/Users/dev/AppData/Local/Temp/jest/jest-transform-cache-857f905b2da01d52a9d1d17b6772ea4a-3a91587e29d4fef23c6e0cf16b2f5679/c4/std_pb_c403e6e7645c904896b66f44a3e43606
    Failure message: EPERM: operation not permitted, open 'C:\Users\dev\AppData\Local\Temp\jest\jest-transform-cache-857f905b2da01d52a9d1d17b6772ea4a-3a91587e29d4fef23c6e0cf16b2f5679\c4\std_pb_c403e6e7645c904896b66f44a3e43606'

      at Object.fs.openSync (../fs.js:653:18)
      at Object.fs.readFileSync (../fs.js:554:33)

@mreishus ๋นŒ๋“œ ์„œ๋ฒ„์—์„œ Windows๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ? graceful-fs ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์€ Windows ๋งŒ ๋Œ€์ƒ์œผ๋กœํ•˜์ง€๋งŒ Linux ๊ธฐ๋ฐ˜ OS์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

@mekwall ์˜ˆ,

์ด๊ฒƒ์€ ์ €์—๊ฒŒ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ด๋ฉฐ 2016 ๋…„ 11 ์›” ์ดํ›„๋กœ graceful-fs ๋Œ€ํ•ด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @mekwall์ด ์ œ๊ณต ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๊ณง ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋น„๊ด€์ ์ž…๋‹ˆ๋‹ค. -i ํ”Œ๋ž˜๊ทธ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์™ธ์— ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ž„์‹œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

--runInBand๊ฐ€ @frenic์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

-i ์™€ ๋™์ผํ•˜๋ฉฐ ๋„ค, ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ˆํƒ€๊น๊ฒŒ๋„ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์žฅ๊ธฐ์ ์œผ๋กœ ์ง€์† ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฌํฌํ•˜๊ณ  ์šฐ๋ฆฌ ์ž์‹ ์˜ ๊ฒƒ์„ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ˆ˜์ •์ด ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํšจ๊ณผ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋„ ๊ฐ™์€ ์ƒํ™ฉ์ด์ง€๋งŒ ์ œ ๊ฒฝ์šฐ์—๋Š” --runInBand๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์˜ Jest๋กœ graceful-fs ์žฌ์ •์˜๋ฅผ ํ™•์ธํ–ˆ๋Š”๋ฐ ์•ˆํƒ€๊น๊ฒŒ๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•œ ์ดํ›„๋กœ ๋” ์ด์ƒ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹0์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์Šคํฌ๋กค ํ•œ ํ›„ yarn ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  npm ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ๊นŒ์ง€ package.json์— graceful-fs ํŒจ์น˜ ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค. npm๊ณผ ์‹ค๋กœ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ผํ•ฉ๋‹ˆ๋‹ค.

"graceful-fs": "https://github.com/mekwall/node-graceful-fs.git#patch-1",

์•ˆ๋…•ํ•˜์„ธ์š”,

์–ด๋–ค ์ด์œ ๋กœ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ Jenkins์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋งŒ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (๋™์ผํ•œ ์ปดํ“จํ„ฐ / ํด๋” ๋“ฑ์—์„œ๋„).
@jsheetzati ์˜ ์†”๋ฃจ์…˜์€ (npm ์‚ฌ์šฉ) ์šฐ๋ฆฌ์—๊ฒŒ๋„ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ ํŒจ์น˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ETA๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ,
๋ชจ๋ฅด

Jenkins์—์„œ jest๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. --runInBand ์˜ต์…˜์€ ๋‹จ์ผ ์ž‘์—… ์‹คํ–‰ ์ค‘ ์‹คํŒจ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋นŒ๋“œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ๋•Œ jest๋Š” ์—ฌ์ „ํžˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž ๊ธˆ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ ์‚ฌ์šฉํ•˜์—ฌ --runInBand ์˜ต์…˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ jest ํ”„๋กœ์„ธ์Šค ๋งŒ ์‹คํ–‰๋˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.
์ด ์˜๊ฒฌ์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@nyrkovalex ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ํ•˜๋Š” ์ผ์€ Jest์˜ ์บ์‹œ ๋””๋ ‰ํ† ๋ฆฌ ์˜ต์…˜ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๊ฐ€ ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

cacheDirectory: '<rootDir>/.jest-cache' ๋ฅผ ์„ค์ •ํ•˜๋Š” Jest ์‚ฌ์ „ ์„ค์ •์„ ๊ฒŒ์‹œํ•˜๊ณ  ๋ชจ๋“  ํŒจํ‚ค์ง€์—์„œ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ .jest-cache ์„ .gitignore ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— Jenkins ์—์ด์ „ํŠธ ๋‹น 16 ๊ฐœ์˜ ์‹คํ–‰๊ธฐ์—์„œ ์ „์—ญ Jest ์บ์‹œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒฐ๊ณผ๋กœ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธ€ ์ˆ˜์žˆ๋Š” ๋ฆฌ์†Œ์Šค ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ๊ธ‰ ํ•œ๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Jenkins ์—์ด์ „ํŠธ๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค (Jest ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋จ).

@ anescobar1991 ์ด ์˜ต์…˜์€ ํ™•์‹คํžˆ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ฏ€๋กœ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํŒ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”,

์šฐ๋ฆฌ๋Š” gradle์„ ์‚ฌ์šฉํ•˜์—ฌ npm์„ ์‹คํ–‰ํ•˜๊ณ  (์ด์œ ๋ฅผ ๋ฌป์ง€ ๋งˆ์‹ญ์‹œ์˜ค :)) Jenkins์™€์˜ ์กฐํ•ฉ์€ ํ‚ฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค :

  1. ์บ์‹œ๋ฅผ ์ „์—ญ ์บ์‹œ ๋Œ€์‹  ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋„๋ก ์„ค์ •
  2. --runInBand ์‚ฌ์šฉ
  3. ์—์ด์ „ํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹จ์ผ ์ž‘์—… ๋งŒ-๋ณ‘๋ ฌ ์ž‘์—… ์—†์Œ
  4. gradle test --max-workers 1 ์‹คํ–‰ (--parallel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)

๋ชจ๋‘ ๋™์ผํ•œ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ @jsheetzati ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ ์ˆ˜์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ทธ ์ˆ˜์ •์œผ๋กœ ํฌํฌํ•˜๊ณ  ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑฐ ๊ต‰์žฅ ํ• ๊ฑฐ์•ผ ...

๋‚˜๋Š”์ด ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์šฐ์•„ํ•œ fs์— ๋Œ€ํ•œ ํŒจ์น˜๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š”์ด ์ˆ˜์ •์„ ๊ณ ๋ง™๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

graceful-fs๋ฅผ ๋‹ค๋ฃจ๊ธฐ์œ„ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค / ์Šค๋ ˆ๋“œ์— ๊ฒฝํ•ฉ ์ƒํƒœ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด ์บ์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๊นŒ?

๋Š๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ CI ์„œ๋ฒ„์—์„œ --runInBand๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฉฐ ์ด๋Š” ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๋‚˜์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ํŒŒ์ผ์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํŒจ์น˜๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋†๋‹ด์˜ ์›์ธ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์ •๋ง ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ช‡ ์ฃผ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋‘ ๋‹ฌ์ด ์ง€๋‚ฌ์œผ๋ฉฐ ๋” ์ด์ƒ ์‹คํŒจ๋ฅผ ๊ด€์ฐฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•œ๋™์•ˆ jest 22.4.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ตœ๊ทผ์—๋Š” 22.4.4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ํŒจํ‚ค์ง€๋„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์นฉ ์ธ-Windows Jenkins CI ์„œ๋ฒ„์—์„œ jest 23.6์œผ๋กœ ์ด๊ฒƒ์„๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • --runInBand ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์„ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ ค์„œ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘ธ์‹œ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์›์„ ๋งค์šฐ ์Šฌํ”„๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • @jsheetzati (https://github.com/facebook/jest/issues/4444#issuecomment-370533355)์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด package.json ์˜ graceful-fs ์žฌ์ •์˜๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค.

graceful-fs ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ์ผ์„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— (https://github.com/isaacs/node-graceful-fs/pull/131์€ ์ž‘๋…„ 7 ์›” ์ดํ›„๋กœ ํ–‰๋™์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค), ์•„๋งˆ๋„ ํฌํฌ ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ? ๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ์ž”์†Œ๋ฆฌ ์ฃผ์„์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ด๊ฒƒ์„ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋›ฐ์–ด๋“ค ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ':

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
Failure message: EBADF: bad file descriptor, close

jest: failed to cache transform results in: C:/agent/_work/_temp/jest/jest-transform-cache-2a12bf9796741cb06fb97a276aa09712-7d718cda2d798ae78eb741b3feff799e/7b/test-setup_7bdb1937d8dbbf5088142bc21e74a530
2019-01-24T13:44:55.5496091Z     Failure message: EBADF: bad file descriptor, close

--runInBand๋กœ jest๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์‹คํ–‰ ํ›„์— ๋งŒ โ€‹โ€‹์˜ค๋ฅ˜์—†์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TFS ๋นŒ๋“œ์˜ ์ผ๋ถ€๋กœ Windows 10 Enterprise VM์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

@EthanSankin ๋งํฌ ๋œ graceful-fs PR

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  graceful-fs ์˜ ๋Œ€์ฒดํ’ˆ์„ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์•ŒํŒŒ ๋ฒ„์ „์ด์ง€๋งŒ ์–ผ๋ฆฌ ์–ด๋‹ตํ„ฐ๋ฅผ ํ™•๋ณดํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค : https://github.com/mekwall/normalized-fs

์ด์ „ ๋ฒ„์ „์˜ write-file-atomic์œผ๋กœ ๋˜ ๋Œ๋ฆฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@moizgh ์–ด๋–ค ๋ฒ„์ „์—์„œ ์–ด๋–ค ๋ฒ„์ „์œผ๋กœ?

@moizgh ์–ด๋–ค ๋ฒ„์ „์—์„œ ์–ด๋–ค ๋ฒ„์ „์œผ๋กœ?

2.4.2์—์„œ 2.3.0

@iarna ๋Š” som ํšŒ๊ท€๊ฐ€ ๋„์ž… ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์—ฌ ๋” ๋‚˜์€ / ์˜๊ตฌ์  ์ธ ์ˆ˜์ •์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์šฐ๋ฆฌ์—๊ฒŒ ๋‹ค์‹œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค-์ฐฝ๋ฌธ-๋งค์šฐ ๊ฐ„ํ—์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

write-file-atomic์€ ๋” ์ด์ƒ graceful-fs๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰