【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 
        - ...
    

    方案对比

    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


    本博客所有文章如无特别注明均为原创。
    复制或转载请以超链接形式注明转自枫芸志,原文地址《【GitLab】CI集成之mysql service的使用
    分享:

还没有人抢沙发呢~

无觅相关文章插件,快速提升流量