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

开启FF_NETWORK_PER_BUILD后GitLab CI无法测试SocketIO端点

问题描述

使用GitLab CI对SocketIO端点执行E2E测试,此前运行正常,但在.gitlab-ci.yml中设置FF_NETWORK_PER_BUILD: 1后,测试无法正常执行,且无具体错误抛出。

测试代码(Socket连接部分)

const address = app.listen().address(); // 返回 { address: '::', family: 'IPv6', port: 42073 }
const baseAddress = `http://${address.host}:${address.port}`;
socket = io(baseAddress, {
  transports: ['websocket'],
  auth: { token: response.body.token },
  forceNew: true,
});

GitLab CI配置(.gitlab-ci.yml)

image: node:16

stages:
    - dependencies
    - e2e
    - build

cache:
    paths:
        - node_modules

dependency_job:
    stage: dependencies
    script:
        - npm ci

test_e2e:
    stage: test
    variables:
        NODE_ENV: test
        PORT: 3000
        THROTTLE_TTL: 60000
        THROTTLE_LIMIT: 1
        SESSION_SECRET: somesecret
        DOMAIN: console.okhtapos.com
        POSTGRES_PASSWORD: password
        DATABASE_URL: "postgresql://postgres:password@postgres:5432/postgres?schema=public"
        REDIS_HOST: redis
        REDIS_PORT: 6379
        REDIS_VOLATILE_HOST: redis
        REDIS_VOLATILE_PORT: 6379
        SESSIONS_REDIS_PREFIX: "sess:"
        SESSIONS_SECRET: somesecret
        SESSIONS_NAME: omni-session
        GRPC_URL: localhost:5004
        OCTO_CENTRAL_GRPC_URL: localhost:5005
        CUSTOMERS_ATTRIBUTES_DATABASE_NAME: omnichannel-customer-attributes
        CUSTOMERS_ATTRIBUTES_MAX: 100
        CUSTOMERS_ATTRIBUTES_MAX_TOTAL_SIZE_IN_BYTES: 5000
        MONGODB_URL: mongodb://mongo:27017
        CUSTOMERS_ATTRIBUTES_MAX_QUARANTINE_DAYS: 7
        KAFKA_BROKERS: kafka:9092
        KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092,INTERNAL://localhost:9093"
        KAFKA_BROKER_ID: "1"
        KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
        KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092,INTERNAL://0.0.0.0:9093"
        KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT"
        KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
        LABELS_MAX_QUARANTINE_DAYS: 7
        LABELS_MAX: 100
        DEPARTMENTS_MAX: 100
        AUTHENTICATION_GATEWAY_SECRET: someGatewaySecret
        CASSANDRA_CONTACT_POINTS: cassandra:9042
        CASSANDRA_LOCAL_DATA_CENTER: datacenter1
        CASSANDRA_KEYSPACE: omnichannel
        FF_NETWORK_PER_BUILD: 1
        ZOOKEEPER_CONNECT: zookeeper:2181
        BROKER_ID: 1

    services:
        - redis:latest
        - postgres:15beta3
        - mongo:latest
        - cassandra:latest
        - name: debezium/zookeeper:2.0.0.Beta1
          alias: zookeeper
        - name: debezium/kafka:2.0.0.Beta1
          alias: kafka

    script:
        - npx prisma generate
        - npx prisma migrate deploy
        - npm run test:e2e

build_job:
    stage: build
    script:
        - npm run build
问题根源

FF_NETWORK_PER_BUILD启用后,GitLab CI会为构建分配独立的网络命名空间,此时SocketIO服务器监听IPv6的::地址,但测试代码存在两个关键错误:

  1. 错误使用address.host属性:app.listen().address()返回的对象中没有host字段,正确的地址字段是address。直接使用address.host会得到undefined,生成的连接地址为http://undefined:42073,导致客户端无法连接。
  2. IPv6地址格式问题:即使正确使用address.address,::作为IPv6地址在URL中需要用方括号包裹(即[::]),否则URL格式无效。
修复方案

方案1:修正地址解析逻辑

修改测试代码中的地址生成部分,正确处理IPv6格式:

const address = app.listen().address();
// 处理IPv6地址的URL格式,或直接使用localhost简化
const host = address.family === 'IPv6' ? '[::]' : 'localhost';
const baseAddress = `http://${host}:${address.port}`;
socket = io(baseAddress, {
  transports: ['websocket'],
  auth: { token: response.body.token },
  forceNew: true,
});

方案2:明确绑定服务器到localhost

启动服务器时直接绑定localhost,避免地址解析的兼容性问题:

// 启动服务器时指定绑定localhost
const server = app.listen(address.port, 'localhost');
const baseAddress = `http://localhost:${server.address().port}`;
socket = io(baseAddress, {
  transports: ['websocket'],
  auth: { token: response.body.token },
  forceNew: true,
});

可选:添加连通性验证

在CI脚本中增加端口监听检查,确认服务器正常启动:

# 在npm run test:e2e前添加
netstat -tulpn | grep ${PORT} || echo "Server not listening on port ${PORT}"

内容的提问来源于stack exchange,提问作者omidh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:39:23