You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中搭配容器化PostgreSQL运行Nightwatch?

如何在GitHub Actions中搭配容器化PostgreSQL运行Nightwatch?

看起来你本地跑Nightwatch连Docker PostgreSQL没问题,但到GitHub Actions里就卡壳了,我来帮你一步步排查解决~

1. 先把GitHub Actions里的PostgreSQL服务配置好

首先得在你的GitHub Actions工作流文件里,用services字段启动PostgreSQL容器,这是CI环境里跑依赖服务的标准方式。注意要给容器设置好必要的环境变量(比如数据库用户名、密码、库名),还要配置健康检查,确保PostgreSQL完全启动就绪后再跑后续步骤。

举个配置示例:

services:
  postgres:
    image: postgres:14 # 选你项目需要的PostgreSQL版本
    env:
      POSTGRES_USER: test_user
      POSTGRES_PASSWORD: test_pass
      POSTGRES_DB: test_db
    ports:
      - 5432:5432
    options: >-
      --health-cmd pg_isready
      --health-interval 10s
      --health-timeout 5s
      --health-retries 5

2. 调整数据库连接参数适配CI环境

本地你用localhost能连PostgreSQL,但在GitHub Actions里,PostgreSQL是作为独立服务容器运行的,和你的测试Job处于同一个虚拟网络,所以连接主机名要改成你在services里定义的服务名(比如上面的postgres),而不是localhost。

最好用环境变量来区分本地和CI环境:

  • 在GitHub Actions的Job步骤里设置环境变量DB_HOST=postgres
  • 你的应用/测试代码里,读取DB_HOST环境变量,默认本地用localhost,CI环境用postgres

比如连接字符串可以这么写:

const dbHost = process.env.DB_HOST || 'localhost';
const connectionString = `postgres://${process.env.POSTGRES_USER}:${process.env.POSTGRES_PASSWORD}@${dbHost}:5432/${process.env.POSTGRES_DB}`;

3. 给服务启动加个“等待就绪”的步骤

有时候PostgreSQL容器虽然启动了,但内部还没完全初始化好,这时候你的应用一启动就去连数据库,肯定会报错。所以要在启动应用前,加个等待脚本,等PostgreSQL真正能接受连接了再往下走。

你可以在工作流里加这么一步:

- name: Wait for PostgreSQL to be ready
  run: |
    until pg_isready -h postgres -U test_user; do
      sleep 1
    done

这个脚本会每隔1秒检查一次PostgreSQL的状态,直到它就绪为止。

4. 检查Nightwatch的Chrome配置(CI环境专属)

GitHub Actions的Ubuntu runner是没有图形界面的,你用xvfb-run是对的,但还要确保Nightwatch里Chrome的启动参数加了CI环境必需的配置:

  • --no-sandbox:因为CI环境没有完整的沙箱环境
  • --disable-dev-shm-usage:避免共享内存不足的问题

你的Nightwatch配置里的ci.chrome环境可以这么写:

ci: {
  chrome: {
    desiredCapabilities: {
      browserName: 'chrome',
      'goog:chromeOptions': {
        args: ['--no-sandbox', '--disable-dev-shm-usage', '--headless=new']
      }
    }
  }
}

5. 完整的工作流参考

把上面的步骤整合起来,一个完整的GitHub Actions工作流大概是这样:

name: Nightwatch Tests with PostgreSQL
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_USER: test_user
          POSTGRES_PASSWORD: test_pass
          POSTGRES_DB: test_db
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - uses: actions/checkout@v4
      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20 # 选你项目用的Node版本
      - name: Install dependencies
        run: npm ci
      - name: Build your app
        run: npm run build # 如果你的项目需要编译的话
      - name: Wait for PostgreSQL to be ready
        run: |
          until pg_isready -h postgres -U test_user; do
            sleep 1
          done
      - name: Run Nightwatch tests
        run: xvfb-run --auto-servernum npm run test:ci
        env:
          DB_HOST: postgres
          POSTGRES_USER: test_user
          POSTGRES_PASSWORD: test_pass
          POSTGRES_DB: test_db
          NODE_ENV: test

按照这些步骤调整后,应该就能在GitHub Actions里顺利跑通Nightwatch测试,同时连接到容器化的PostgreSQL了~

备注:内容来源于stack exchange,提问作者Eva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:35:30