在 .gitlab-ci.yml 中通过 services 启动 Redis 和 MySQL 辅助容器,与主作业容器自动组网互通,使用服务名(mysql/redis)而非 localhost 连接,配合环境变量实现开箱即用的集成测试环境。

直接在 .gitlab-ci.yml 中用 services 启动 Redis 和 MySQL,无需手动安装、配置或维护本地服务实例。核心是让 CI 作业容器与服务容器通过内置网络自动互通,实现开箱即用的集成测试环境。
明确 services 的定位和工作方式
services 不是“在当前容器里装软件”,而是启动一个**独立的、可联网的辅助容器**,与主作业容器(由 image 指定)共享 DNS、主机名和网络命名空间。它们之间通过服务名(如 mysql、redis)直接通信,不走 localhost 或 127.0.0.1。
- MySQL 服务容器默认监听
3306端口,可通过主机名mysql访问 - Redis 服务容器默认监听
6379端口,可通过主机名redis访问 - GitLab Runner 会自动等待这些端口就绪;若超时未响应,会打印警告但作业仍可能继续运行
基础 YAML 配置示例
以下是一个最小可用的 .gitlab-ci.yml 片段,同时启用 MySQL 和 Redis:
当用户提及 GitHub URL,或要求分析、审查、探索或理解任意 GitHub 项目、仓库或代码库时,请使用此技能。触发条件包括以下短语:“分析这个项目”、“看看这个仓库”、“analyze this repo”、“what does this project do”,或消息中包含任何 github.com URL。
test-with-db-and-cache:
image: python:3.11
services:
- mysql:8.0
- redis:7-alpine
variables:
MYSQL_ROOT_PASSWORD: "password"
MYSQL_DATABASE: "testdb"
MYSQL_USER: "ciuser"
MYSQL_PASSWORD: "cipass"
script:
- pip install mysql-connector-python redis
- python -c "import mysql.connector; conn = mysql.connector.connect(host='mysql', user='ciuser', password='cipass', database='testdb'); print('✅ MySQL connected')"
- python -c "import redis; r = redis.Redis(host='redis', port=6379, decode_responses=True); r.set('ci:key', 'hello'); print('✅ Redis OK:', r.get('ci:key'))"
-
mysql:8.0和redis:7-alpine直接从 Docker Hub 拉取,轻量且稳定 - 所有
MYSQL_*变量会被 MySQL 容器自动识别并初始化数据库与用户 - 脚本中连接地址必须写
mysql/redis,不能写localhost
常见问题与绕过技巧
实际运行中可能遇到服务启动慢、端口未及时就绪等问题。可针对性优化:
- 为 MySQL 加上健康检查等待逻辑:
mysql -h mysql -u root -ppassword -e "SELECT 1" || sleep 2,循环重试最多 5 次 - 若需自定义 MySQL 配置(如调整字符集),改用完整镜像路径 +
command覆盖启动命令,例如:mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci - 使用私有镜像时,在
services中写全路径:registry.example.com/my-redis:stable,确保 Runner 已配置对应认证 - 避免在
script中执行service mysql start类命令——services 容器本身已托管进程,手动操作无效且报错
进阶:组合多个服务并复用配置
你可以在不同 job 中复用同一组 services,也可以叠加更多组件(如 PostgreSQL、Docker-in-Docker):
integration-test:
image: node:18
services:
- mysql:8.0
- redis:7-alpine
- postgres:15
variables:
POSTGRES_DB: "app_test"
POSTGRES_USER: "pguser"
POSTGRES_PASSWORD: "pgpass"
script:
- npm ci
- npm run test:integration
- 每个 service 容器彼此隔离,互不影响
- 所有服务与作业容器共用相同的
/builds工作目录挂载(只读),方便共享测试数据或 dump 文件 - 不需要额外配置网络或端口映射,GitLab Runner 内部已自动完成链接










