【问题标题】:CircleCI Postgres connection fails in build but not when SSH'd inCircleCI Postgres 连接在构建中失败,但在 SSH 中没有
【发布时间】:2018-07-01 11:58:24
【问题描述】:

我正在使用 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 会话之间的环境,差异很小且完全不相关,因此不会产生任何影响。我还尝试强制我的脚本等待 2 秒,以防 postgres 实例尚未完成启动。这些都没有帮助。

我不确定还可以做些什么来调试这个问题,因为当我在 CircleCI 上的 VM 中运行脚本时它可以工作。

我是否缺少某些东西会导致这些行为的行为如此不同?

【问题讨论】:

  • 这是一个在 CircleCI 讨论中提出的好问题。我的第一个想法是,在 Postgres/Docker 完全初始化之前,该脚本正在尝试连接。我会尝试添加一些延迟,或者等待端口打开并准备好。
  • @FelicianoTech 正如我在问题中指出的那样,我尝试添加延迟。事实证明这不是问题 - 我已经在我的答案中详细说明了解决方案(尽管它仍然有点奇怪)。
  • 啊,这对我来说并不明显。感谢您回来回答。

标签: node.js postgresql circleci node-postgres


【解决方案1】:

事实证明,答案与 此脚本的 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 运行的其他脚本却不是。

不管怎样,这完全解决了问题。

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多