【GitLab】CI集成之mysql service的使用
背景
利用 GitLab 的持续集成功能,在 CI 的 Pipeline 中集成 API 测试,希望测试环境每次都能基于仅有空表的 MySQL 数据库进行测试,于是在 CI 过程中引入 MySQL service。
问题
目前 GitLab service 启动的容器无法做路径映射,于是就无法利用 MySQL image 的启动项的 //docker-entrypoint-initdb.d/ 目录映射来自动加载数据库初始化脚本。查阅官方文档,也没有这方面的支持。
解决方案一
1. 将数据库初始化过程直接重新打包成一个新的镜像,在 GitLab service 中加载新的镜像,Dockerfile 如下
FROM mysql:5.6 ENV MYSQL_DATABASE database_name ENV MYSQL_ROOT_PASSWORD root ENV MYSQL_USER user ENV MYSQL_PASSWORD password # ./initdb/table-scheme.sql 包含了数据库初始化的脚本 COPY ./initdb/table-scheme.sql /docker-entrypoint-initdb.d/table-scheme.sql
2. 编译镜像
docker build -t my-image/mysql:latest .
3. 将镜像 push 到 Docker Hub 或 私有镜像库
4. 在 .gitlab-ci.yml 增加以下一段来引入使用,剩下的就是在应用代码中直接连接 host 为 mysql 的数据库
apitest: stage: test environment: name: test services: - name: my-image/mysql:latest alias: mysql script: #run test command - ...
解决方案二
利用 MySQL 客户端来导入数据库初始化脚本
apitest: variables: MYSQL_DATABASE: database_name MYSQL_ROOT_PASSWORD: mysql MYSQL_USER: user MYSQL_PASSWORD: password services: - mysql image: mysql before_script: - mysql --version script: - mysql --user=root --password="${MYSQL_ROOT_PASSWORD}" --host=mysql "${MYSQL_DATABASE}" < ./initdb/table-scheme.sql #run test command - ...
方案对比
- 方案一:事先打好镜像,使用的稳定性和效率更高,适用于初始化脚本不太变动的场景
- 方案二:对于初始化脚本经常变化的情况比较适用
P.S. 特别注意:MySQL 镜像需要用 mysql:5.6,不能用mysql/mysql-server:latest,后者在 CI service 方式启动的过程中不会加载设置的环境变量,导致启动报错。一个小坑,备忘。
参考文档
- Configuration of your jobs with .gitlab-ci.yml
- Using MySQL
- Can't connect to MySQL service with .gitlab-ci.yml
- Using Docker images
还没有人抢沙发呢~