首页/开发/CI/CD 与发布速查/GitLab CI 的 services(旁路服务)
工具链要点63 条

GitLab CI 的 services(旁路服务)

为作业启动伴随容器(数据库、缓存、模拟服务),测试作业可以连接真实的 MySQL/PostgreSQL 实例,而不是全部依赖桩件。

CI/CD 与发布速查开发更新于 2026-10-13

services 是什么

GitLab CI 的 services 机制为每个作业启动伴随容器:数据库、缓存、浏览器或模拟服务与作业容器同时运行,作业通过服务别名(alias)访问它们。这样集成测试可以连真实的 PostgreSQL/MySQL/Redis 实例跑,而不是全部依赖桩件,测试置信度更高。写法上声明镜像与别名,服务镜像的初始化参数通过变量传入(如 POSTGRES_PASSWORD);服务可用前可能有启动延迟,脚本里要做重试或等待就绪。注意 shell 执行器不支持 services 特性,需要 docker 或 kubernetes 执行器;不同执行器的网络实现不同,统一用别名访问是兼容写法。

基本信息

写法services 声明镜像与 alias
访问通过服务别名或主机名(如 db)
参数通过 CI 变量传入(POSTGRES_PASSWORD 等)
就绪服务启动慢,脚本里重试或健康检查
替代testcontainers 等作业内方案
执行器docker/kubernetes 支持,shell 不支持

典型使用场景

  • 集成测试连真库:迁移脚本、SQL 兼容性验证需要真实数据库实例。
  • 缓存与搜索服务:临时起 Redis、Elasticsearch 验证代码路径。
  • 浏览器测试:浏览器类服务容器为端到端测试提供运行环境。
  • 第三方模拟:用 WireMock 等镜像模拟外部接口,测试不打外网。
  • 并行矩阵:多个作业各自起服务容器,互不干扰。
  • 隔离升级验证:换服务镜像版本即可验证新版本兼容性。

连数据库跑测试

连数据库跑测试
test:
  image: postgres:16  # 作业容器
  services:
    - name: postgres:16
      alias: db
  variables:
    POSTGRES_PASSWORD: test  # 初始化服务
  script:
    - until pg_isready -h db; do sleep 1; done  # 等就绪
    - psql -h db -U postgres -c 'select 1'

连通方式读法

写法实际指向说明
db(别名)服务容器推荐方式,跨执行器通用
localhost作业容器自身连不到服务,最常见误用
127.0.0.1作业容器自身同上
服务 IP动态分配会变化,不要硬编码
作业镜像要带客户端工具(psql、redis-cli 等):服务镜像只提供端服务,命令在作业容器里执行。
就绪等待是稳定性的关键:服务容器启动比作业脚本晚几百毫秒到几秒,重试循环能消掉大量偶发失败。
服务镜像版本贴近生产主版本:版本差距过大时测试通过不代表生产可用。

易错点

  • 用 localhost 连服务:实际连到作业容器自己,连接被拒;改用服务别名。
  • 不等就绪直接执行测试:服务仍在初始化,用例随机失败;加重试或健康检查。
  • 凭据写死在仓库:服务密码应走 CI 变量并用掩码保护。
  • 服务版本与生产差太多:测试全绿但上线即挂,主版本保持一致。
  • 每个作业都起重型服务:流水线拥挤、等待时间飞涨;按需拆分并控制并发。

数据来源与参考

  • GitLab Docs《Services》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌