从 Jenkinsfile 中的 yarn 运行 jest 从一个分支获得“jest:not found”,从另一个分支获得成功

Dav*_*arr 5 node.js jenkins yarnpkg

我是一名非常有经验的 Java 开发人员,我在 Java 构建的构建自动化方面做了很多工作。我在前端构建方面做得不多,所以我对大多数前端构建工具中的问题空间并不熟悉。

在一种情况下,我从 Jenkins 中的普通管道脚本构建失败,并出现以下情况:

[xxx-feature%2F...] Running shell script
+ yarn test:coverage -u
yarn run v1.3.2
warning package.json: No license field
$ jest --env=jsdom --coverage -u
/bin/sh: 1: jest: not found
Run Code Online (Sandbox Code Playgroud)

这是来自拉取请求分支的构建。相同的管道脚本用于构建 master 分支,尽管它执行了一些额外的步骤。当主构建到达脚本中的同一点时,它不会失败。

此失败并非特定于特定拉取请求分支。我已经在许多拉取请求构建中看到了同样的错误。我怀疑他们中的任何一个已经通过了。

我比较了“package.json”文件,它们是相同的。

我还应该注意什么来诊断这个问题?

更新

我在这方面没有取得真正的进展。从那以后,我添加了在“主”构建和“拉取请求”构建中运行的额外诊断。我认为获得线索的最佳机会是在它之前运行“env”。不幸的是,我在这些细微的差异中没有看到任何有用的东西。PATH 甚至都没有设置。

更新

只是为了强调不同之处,这里是同一管道脚本的输出,在“主”构建上:

[...] Running shell script
+ yarn --verbose test:coverage -u
yarn run v1.3.2
warning package.json: No license field
$ jest --env=jsdom --coverage -u
[BABEL] Note: The code generator has deoptimised the styling ...
Run Code Online (Sandbox Code Playgroud)

单元测试在主构建中运行良好,尽管它无法在 PR 构建中找到“jest”。

更新

一位评论者认为“纱线安装”可能在这里很重要。构建不会直接运行“yarn install”,但它会运行“yarn”,它在幕后运行“yarn install”。我还注意到这不是它运行的第一个“纱线”命令。我只是更改了脚本以先执行此操作,但并没有解决问题。我将在这里包含一个经过大量编辑的输出,显示“纱线安装”直到失败的调用。或许这里面会有一些相关的线索。

+ yarn
yarn install v1.3.2
warning package.json: No license field
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.4: The platform "linux" is incompatible with this module.
info "fsevents@1.2.4" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > react-router@4.3.1" has unmet peer dependency "react@>=15".
warning " > enzyme-adapter-react-16@1.7.0" has unmet peer dependency "react@^16.0.0-0".
warning " > enzyme-adapter-react-16@1.7.0" has unmet peer dependency "react-dom@^16.0.0-0".
warning "enzyme-adapter-react-16 > enzyme-adapter-utils@1.9.0" has unmet peer dependency "react@0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0".
warning "enzyme-adapter-react-16 > react-test-renderer@16.6.3" has unmet peer dependency "react@^16.6.3".
warning "jest > jest-cli > jest-environment-jsdom > jsdom > request-promise-native@1.0.5" has unmet peer dependency "request@^2.34".
warning "jest > jest-cli > jest-environment-jsdom > jsdom > request-promise-native > request-promise-core@1.1.1" has unmet peer dependency "request@^2.34".
[4/4] Building fresh packages...
Done in 29.01s.
+ yarn cache clean
yarn cache v1.3.2
warning package.json: No license field
success Cleared cache.
Done in 2.08s.
+ yarn clean:all
yarn run v1.3.2
warning package.json: No license field
$ yarn clean:lib && yarn clean:temp
warning package.json: No license field
$ rimraf ./build
/bin/sh: 1: rimraf: not found
error Command failed with exit code 127.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
+ yarn upgrade --scope @idp
yarn upgrade v1.3.2
warning package.json: No license field
[1/4] Resolving packages...
warning css-loader > cssnano > postcss-merge-rules > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > autoprefixer > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > postcss-merge-rules > caniuse-api > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning enzyme > rst-selector-parser > nearley > nomnom@1.6.2: Package no longer supported. Contact support@npmjs.com for more info.
[2/4] Fetching packages...
info fsevents@1.2.4: The platform "linux" is incompatible with this module.
info "fsevents@1.2.4" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > react-router@4.3.1" has unmet peer dependency "react@>=15".
warning " > enzyme-adapter-react-16@1.7.0" has unmet peer dependency "react@^16.0.0-0".
warning " > enzyme-adapter-react-16@1.7.0" has unmet peer dependency "react-dom@^16.0.0-0".
warning "enzyme-adapter-react-16 > enzyme-adapter-utils@1.9.0" has unmet peer dependency "react@0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0".
warning "enzyme-adapter-react-16 > react-test-renderer@16.6.3" has unmet peer dependency "react@^16.6.3".
warning "jest > jest-cli > jest-environment-jsdom > jsdom > request-promise-native@1.0.5" has unmet peer dependency "request@^2.34".
warning "jest > jest-cli > jest-environment-jsdom > jsdom > request-promise-native > request-promise-core@1.1.1" has unmet peer dependency "request@^2.34".
[4/4] Rebuilding all packages...
success Saved lockfile.
success Saved 1294 new dependencies.
?? @types/jest@21.1.10
?? babel-jest@22.4.4
?? babel-plugin-jest-hoist@22.4.4
?? babel-preset-jest@22.4.4
?? jest-changed-files@22.4.3
?? jest-cli@22.4.4
?? jest-config@22.4.4
?? jest-diff@22.4.3
?? jest-docblock@22.4.3
?? jest-environment-jsdom@22.4.3
?? jest-environment-node@22.4.3
?? jest-get-type@22.4.3
?? jest-haste-map@22.4.3
?? jest-jasmine2@22.4.4
?? jest-leak-detector@22.4.3
?? jest-matcher-utils@22.4.3
?? jest-message-util@22.4.3
?? jest-mock@22.4.3
?? jest-regex-util@22.4.3
?? jest-resolve-dependencies@22.4.3
?? jest-resolve@22.4.3
?? jest-runner@22.4.4
?? jest-runtime@22.4.4
?? jest-serializer@22.4.3
?? jest-snapshot@22.4.3
?? jest-util@22.4.3
?? jest-validate@22.4.4
?? jest-worker@22.4.3
?? jest@22.4.4
?? ts-jest@22.4.6
Done in 49.89s.
+ yarn upgrade --scope @idse
yarn upgrade v1.3.2
warning package.json: No license field
[1/4] Resolving packages...
warning css-loader > cssnano > postcss-merge-rules > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > postcss-merge-rules > caniuse-api > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > autoprefixer > browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning enzyme > rst-selector-parser > nearley > nomnom@1.6.2: Package no longer supported. Contact support@npmjs.com for more info.
[2/4] Fetching packages...
info fsevents@1.2.4: The platform "linux" is incompatible with this module.
info "fsevents@1.2.4" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > react-router@4.3.1" has unmet peer dependency "react@>=15".
warning " > enzyme-adapter-react-16@1.7.0" has unmet peer dependency "react@^16.0.0-0".
warning " > enzyme-adapter-react-16@1.7.0" has unmet peer dependency "react-dom@^16.0.0-0".
warning "enzyme-adapter-react-16 > enzyme-adapter-utils@1.9.0" has unmet peer dependency "react@0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0".
warning "enzyme-adapter-react-16 > react-test-renderer@16.6.3" has unmet peer dependency "react@^16.6.3".
warning "jest > jest-cli > jest-environment-jsdom > jsdom > request-promise-native@1.0.5" has unmet peer dependency "request@^2.34".
warning "jest > jest-cli > jest-environment-jsdom > jsdom > request-promise-native > request-promise-core@1.1.1" has unmet peer dependency "request@^2.34".
[4/4] Rebuilding all packages...
success Saved lockfile.
success Saved 1294 new dependencies.
?? @types/jest@21.1.10
?? babel-jest@22.4.4
?? babel-plugin-jest-hoist@22.4.4
?? babel-preset-jest@22.4.4
?? jest-changed-files@22.4.3
?? jest-cli@22.4.4
?? jest-config@22.4.4
?? jest-diff@22.4.3
?? jest-docblock@22.4.3
?? jest-environment-jsdom@22.4.3
?? jest-environment-node@22.4.3
?? jest-get-type@22.4.3
?? jest-haste-map@22.4.3
?? jest-jasmine2@22.4.4
?? jest-leak-detector@22.4.3
?? jest-matcher-utils@22.4.3
?? jest-message-util@22.4.3
?? jest-mock@22.4.3
?? jest-regex-util@22.4.3
?? jest-resolve-dependencies@22.4.3
?? jest-resolve@22.4.3
?? jest-runner@22.4.4
?? jest-runtime@22.4.4
?? jest-serializer@22.4.3
?? jest-snapshot@22.4.3
?? jest-util@22.4.3
?? jest-validate@22.4.4
?? jest-worker@22.4.3
?? jest@22.4.4
?? ts-jest@22.4.6
Done in 34.56s.
+ yarn --verbose test:coverage -u
yarn run v1.3.2
$ jest --env=jsdom --coverage -u
/bin/sh: 1: jest: not found
verbose 0.383 Error: Command failed with exit code 127.
    at /usr/share/yarn/lib/cli.js:35620:15
    at Generator.throw (<anonymous>)
    at step (/usr/share/yarn/lib/cli.js:92:30)
    at /usr/share/yarn/lib/cli.js:105:13
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
error Command failed with exit code 127.
Run Code Online (Sandbox Code Playgroud)

更新

一位评论者让我展示“node_modules/.bin”的内容。我添加了它,以及该列表中引用的另一个目录的内容。

+ ls -lt node_modules/.bin
total 0
lrwxrwxrwx 1 81050 20059 18 Dec  3 17:25 which -> ../which/bin/which
lrwxrwxrwx 1 81050 20059 47 Dec  3 17:25 webpack-dev-server -> ../webpack-dev-server/bin/webpack-dev-server.js
...
lrwxrwxrwx 1 81050 20059 35 Dec  3 17:25 jest-runtime -> ../jest-runtime/bin/jest-runtime.js
lrwxrwxrwx 1 81050 20059 23 Dec  3 17:25 jest -> ../jest-cli/bin/jest.js
...
+ ls -lt node_modules/jest-cli/bin
total 4
-rwxr-xr-x 1 81050 20059 416 Dec  3 17:25 jest.js
Run Code Online (Sandbox Code Playgroud)

我看不出这里有什么问题。

更新

我刚刚找到了解决方法,但我仍然不明白根本原因是什么。

我已经为此苦苦挣扎了将近一个月,没有任何解决方案,然后在周五我注意到同一个拉取请求的两个版本已经通过了这个。在该 PR 的构建之后运行的构建继续失败。我重新运行了其中一个通过的构建,它又通过了。PR 的变化没有任何重大意义。唯一与所有其他 PR 完全不同的是分支名称的形式。

该项目中几乎所有其他分支的形式都是“feature/...”或“bugfix/...”,或“release/...”。通过的那个使用了一个没有“/”的名字。我在构建脚本中有一个机制,通过将分支名称附加到工作区目录来确保 PR 构建的工作区是唯一的,但是由于我不希望“功能/”代表目录级别,因此我首先对分支名称,导致“功能%2F ...”。我在基于 Java 的构建中执行此操作,并且效果很好。

由于此时我非常确定我知道这以某种方式导致了问题,因此我将脚本更改为简单地将“/”替换为“-”。这解决了问题。我不知道为什么。

Cis*_*azz 0

看来这确实与路径名中含有特殊字符有关。您可以将工作空间更改为其他内容,这应该可以解决问题

workspaceDir = "workspace/${env.JOB_NAME}/${env.BRANCH_NAME}-${env.BUILD_ID}".replace('%2F', '_').replace(' ', '_')
ws(workspaceDir) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您在管道内使用 docker,您还可以通过将工作空间目录安装到其他文件夹来修复此问题

def workspace = pwd()
docker.image('node:12.15.0').inside("-v ${workspace}:/app"){
   sh """
      cd /app
      npm install
      npm run test
   """
}
Run Code Online (Sandbox Code Playgroud)