【问题标题】:npm scripts hang indefinitely on Concourse CInpm 脚本在 Concourse CI 上无限期挂起
【发布时间】:2017-08-09 22:57:40
【问题描述】:

在 Concourse 上,我正在运行某些 npm 脚本的集成测试。有一个特定的脚本可以构建我的后端/前端,然后继续运行测试。但是,一旦测试完成(失败或成功)。 npm 脚本不会停止。当测试失败或成功时,它不会出错并无限期地挂起。我已经在本地机器和本地容器上运行了这个脚本,并且 npm 脚本工作正常。只有在 Concourse 上,脚本才会永远挂起。

为了给我的设置提供更多背景信息,这里是一个在前端运行的 npm 脚本示例

"ci:start:backend": "npm run --prefix ../emailservice/mock-service dev & npm run --prefix ../server-repo ci:start:server & sleep 3"

"ci:test:system": "npm run ci:start:backend && npm run build:dist:serve & sleep 90 && npm run test:browser:ci"

npm run ci:test:system 是运行的主脚本。它会立即开始运行电子邮件服务、服务器和前端,以便运行测试。这是一种混乱的做事方式,但它适用于本地和容器。此方法已用于服务器测试的类似测试,并且在大厅上运行良好。

流水线的任务可见下图

# runs unit tests for frontend
  - name: run-tests
    plan:
    - get: frontend-repo
    - get: server-repo
    - get: emailservice
    - task: run-npm-tests
      privileged: true
      config:
        platform: linux
        image_resource:
          type: docker-image
          source:
            repository: jonoc/techradar-integration
        inputs:
          - name: frontend-repo
          - name: server-repo
          - name: emailservice
        run:
          path: sh
          args:
          - -exc
          - |
            mongod --fork --logpath /var/log/mongodb.log
            export SHELL=/bin/bash

            cd server-repo
            npm install --silent

            cd ../emailservice/mock-service
            npm install --silent

            cd ../../frontend-repo
            npm install --silent

            npm rebuild node-sass --silent
            npm run postinstall --silent
            npm run ci:test:system

一切似乎都没有异常,但大厅拒绝提供绿色或红色的构建。我怀疑这是由于其他脚本永远运行但挂在后台并且大厅不想结束。然而,在大厅中运行 npm run ci:start:backend 可以正常工作,但运行 npm run test:browser:ci 将永远挂起,这进一步增加了问题的混乱。

大厅版本:3.3.2

部署类型(BOSH/Docker/二进制):Docker

基础设施/IaaS:AWS/EC2

浏览器(如果适用):Chrome

这曾经有效吗?从不

【问题讨论】:

  • 您是否尝试过在测试完成后终止启动的 pid?如果在npm run ci:test:system 下方添加回显行,你看到输出了吗?
  • 是的,所以我在npm run ci:test:system 下方添加了一行,它永远不会运行,因为关于脚本的内容没有结束。由于该脚本运行测试,我不确定在测试期间如何杀死 pid
  • 您是否正在运行 PhantomJS?
  • 不,我们正在运行量角器和无头 chrome

标签: node.js amazon-web-services npm concourse


【解决方案1】:

您确定您的资源在任务 docker 容器中可用吗?

您在此处指定多个输入

 - name: frontend-repo
 - name: server-repo
 - name: emailservice

但如果您有多个输入,则 concourse 要求您为每个输入指定正确的路径。

执行后尝试劫持任务容器,检查资源是否可用。也可以在容器中执行脚本,调试起来更方便。

fly -t <your_target> hijack -j demo_job/demo_task

【讨论】:

  • 资源在容器中可用,因为我可以 cd 进入每个输入并运行 npm 脚本
【解决方案2】:

我的问题已通过更改我的 npm 脚本得到解决。事实证明,将 npm run --prefix ../emailservice/mock-service dev & npm run --prefix ../server-repo ci:start:server & sleep 3 与其他脚本链接会导致 Concourse 出现一些问题。

我修改了 npm 脚本以使用 npm-run-all 并在我的测试完成后使用 -r 参数来完成脚本

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 2020-10-29
    • 2017-06-29
    • 2011-05-07
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多