CircleCI Postgres连接在构建时失败,但在SSH没有进入时却没有

时间:2018-01-22 19:04:29

标签: node.js postgresql circleci node-postgres

我使用CircleCI为node.js项目运行测试/构建(节点8.9)。我必须使用机器执行器,因为我需要ipv6支持,我也使用postgres运行我的测试。本地postgres实例使用docker(docker run -d -p \"5432:5432\" postgres:9.6)运行。我使用pg@7.4.1连接到postgres。

我有一个脚本,用于设置postgres容器启动后在后续步骤中运行的测试数据库(用户,数据库等)。在构建中运行此脚本时,出现以下错误:

Connecting to PG
Error occurred Error: Connection terminated unexpectedly
    at Connection.con.once (/home/circleci/converge-ingest/node_modules/pg/lib/client.js:179:21)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Connection.emit (events.js:208:7)
    at Socket.<anonymous> (/home/circleci/converge-ingest/node_modules/pg/lib/connection.js:122:10)
    at emitNone (events.js:111:20)
    at Socket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1055:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
Exited with code 1

如果我然后尝试通过SSH重建并手动运行脚本,它可以正常工作。我已经转储并比较了构建和SSH会话之间的环境,并且差异很小且完全不相关,因此不会产生任何影响。我还尝试强制我的脚本等待2s,以防postgres实例没有完成启动。这些都没有帮助。

我不知道还能做些什么来调试此问题,因为当我在CircleCI上的VM中运行脚本时它会起作用。

是否有一些我错过的东西会导致这些事情表现得如此不同?

1 个答案:

答案 0 :(得分:0)

事实证明,答案是针对此脚本的shell配置。它仍然有点奇怪,但我不得不将shell更改为登录shell:

  - run:
      name: "Setup clean test db"
      command: "node ./scripts/clean_test_db.js"
      shell: /bin/bash --login

这使得它的行为与我的shell在SSH会话期间的行为相同。我不清楚为什么这个脚本(使用node运行)而不是使用npm run X运行的其他脚本的原因。

无论哪种方式,这都完全解决了这个问题。