首页/开发/CI/CD 与发布速查/GitHub Actions 服务容器
工具链要点63 条

GitHub Actions 服务容器

为作业启动伴随服务:数据库、缓存等以 service 容器运行,配合健康检查等待就绪;访问地址按作业是否容器化而不同。

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

服务容器是什么

为作业启动伴随服务:数据库、缓存等以 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 代替检查。
服务名就是容器网络内的主机名:容器作业里直接连服务名即可,先在步骤里做一次连通性自检更稳妥。
服务容器支持挂载卷:数据库初始化脚本可挂在初始化目录,测试开局即有数据。
服务容器每次都会拉取镜像:镜像较大时会给作业开始增加等待,可预拉取或改用精简镜像。

易错点

  • 忘记端口映射:宿主作业访问不到服务,测试一开始就超时
  • 容器化作业仍用 localhost:应使用服务名作为主机名
  • 健康检查不充分或直接 sleep:数据库还在初始化就开跑,测试随机失败
  • 服务镜像用浮动标签:数据库行为随上游变化,钉住版本更稳
  • 初始化脚本与健康检查结论脱节:脚本尚未执行完就开测,先确认初始化完成再连接

数据来源与参考

  • GitHub Docs《Using containerized services》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌