开启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的::地址,但测试代码存在两个关键错误:
- 错误使用
address.host属性:app.listen().address()返回的对象中没有host字段,正确的地址字段是address。直接使用address.host会得到undefined,生成的连接地址为http://undefined:42073,导致客户端无法连接。 - 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
相关产品推荐
相关产品推荐

