[聚合文章] 【GitLab】CI集成之mysql service的使用

MySQL 2017-11-26 13 阅读

背景

利用 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 
    - ...

方案对比

  1. 方案一:事先打好镜像,使用的稳定性和效率更高,适用于初始化脚本不太变动的场景
  2. 方案二:对于初始化脚本经常变化的情况比较适用

P.S. 特别注意:MySQL 镜像需要用 mysql:5.6,不能用mysql/mysql-server:latest,后者在 CI service 方式启动的过程中不会加载设置的环境变量,导致启动报错。一个小坑,备忘。

参考文档

  1. Configuration of your jobs with .gitlab-ci.yml
  2. Using MySQL
  3. Can't connect to MySQL service with .gitlab-ci.yml
  4. Using Docker images

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。