如何在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

