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 等):服务镜像只提供端服务,命令在作业容器里执行。
就绪等待是稳定性的关键:服务容器启动比作业脚本晚几百毫秒到几秒,重试循环能消掉大量偶发失败。
服务镜像版本贴近生产主版本:版本差距过大时测试通过不代表生产可用。