服务容器是什么
为作业启动伴随服务:数据库、缓存等以 service 容器随作业启动,配合健康检查等待就绪后再跑测试。访问地址取决于作业运行位置:作业跑在宿主虚拟机上用 localhost 加映射端口;作业本身容器化(container)时用服务名作为主机名、访问容器端口。服务容器适合把测试依赖声明化:需要什么数据库、什么版本,都写在作业定义里,环境差异随配置走而不是随机器走。
基本信息
| 写法 | jobs.<id>.services.<name> |
|---|---|
| 端口映射 | ports 映射宿主端口;宿主作业用 localhost |
| 健康检查 | options 中配置 --health-cmd 等参数 |
| 容器作业 | 用服务名访问,不用 localhost |
| 与容器作业 | 两者可组合,主机名规则要区分 |
| 生命周期 | 随作业创建,作业结束即销毁 |
典型使用场景
- 集成测试:拉起 Postgres/MySQL/Redis 跑真实数据库用例
- 端到端验证:启动 mock 服务或消息队列走完整链路
- 多服务组合:一次作业同时拉起数据库与缓存
- 版本矩阵:同一测试在不同数据库版本上各跑一组
- 数据库压测:临时拉起更高规格的服务实例跑压力脚本
- 隔离环境:每个作业自带干净服务,不再共用公共测试实例
Postgres 服务
Postgres 服务
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_PASSWORD: test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- run: PGPASSWORD=test psql -h localhost -U postgres -c 'select 1'访问方式对照
| 作业形式 | 服务主机名 | 端口 |
|---|---|---|
| 宿主虚拟机作业 | localhost | 宿主映射端口 |
| 容器作业 | 服务名 | 容器内端口 |
| 多服务 | 各自服务名 | 按各自映射 |
健康检查不充分会出现偶发连接失败:等就绪再跑测试是稳定性的关键,别用 sleep 代替检查。
服务名就是容器网络内的主机名:容器作业里直接连服务名即可,先在步骤里做一次连通性自检更稳妥。
服务容器支持挂载卷:数据库初始化脚本可挂在初始化目录,测试开局即有数据。
服务容器每次都会拉取镜像:镜像较大时会给作业开始增加等待,可预拉取或改用精简镜像。