特拉维斯:如何对不同的MySQL后端运行测试?

特拉维斯:如何对不同的MySQL后端运行测试?,mysql,travis-ci,multi-database,Mysql,Travis Ci,Multi Database,如何使用一个.travis.yml文件对不同的MySQL后端运行测试? 类似于,使用matrix->include。例如: 对MySQL 5.5运行测试 对MySQL 5.6运行测试 对MySQL 5.7运行测试 对MySQL 8.0运行测试 我目前发现的是: 在Travis中使用MySQL 5.7: 有关如何在Travis上设置数据库的一般信息: 后者提到 您还可以在支持sudo的Ubuntu Trusty上安装MySQL 5.7 但没有提到如何使用5.6和5.7,例如 可能的解决方法

如何使用一个.travis.yml文件对不同的MySQL后端运行测试?

类似于,使用
matrix->include
。例如:

  • 对MySQL 5.5运行测试
  • 对MySQL 5.6运行测试
  • 对MySQL 5.7运行测试
  • 对MySQL 8.0运行测试
我目前发现的是:

  • 在Travis中使用MySQL 5.7:
  • 有关如何在Travis上设置数据库的一般信息:
后者提到

您还可以在支持sudo的Ubuntu Trusty上安装MySQL 5.7

但没有提到如何使用5.6和5.7,例如

可能的解决方法(如果没有“Travis”解决方法):

  • 方法:创建不同的Docker设置,每个都有特定的MySQL版本,并手动测试我的脚本。但这会严重影响我的开发环境,而且相当耗时

  • 根据相关环境变量(例如MySQL_VERSION==5.5),从源代码/通过apt安装所需的MySQL服务器。使用特定的配置来访问它


  • 谢谢你的反馈

    我将回答我自己的问题,但我对其他方法持开放态度

    解决方案 以下解决方案基于PyMySQL项目中的.travis.yml:

    您需要脚本和.travis.yml配置的组合

    剧本 如果要重用以下代码,请在项目中使用以下路径:.travis/install和init db.sh

    以下脚本以所需版本安装数据库:

    # debug
    set -x
    # verbose
    set -v
    
    if [ ! -z "${DB}" ]; then
        # disable existing database server in case of accidential connection
        sudo service mysql stop
    
        docker pull ${DB}
        docker run -it --name=mysqld -d -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 ${DB}
        sleep 10
    
        mysql() {
            docker exec mysqld mysql "${@}"
        }
        while :
        do
            sleep 5
            mysql -e 'select version()'
            if [ $? = 0 ]; then
                break
            fi
            echo "server logs"
            docker logs --tail 5 mysqld
        done
    
        mysql -e 'select VERSION()'
    
        if [ $DB == 'mysql:8.0' ]; then
            WITH_PLUGIN='with mysql_native_password'
            mysql -e 'SET GLOBAL local_infile=on'
            docker cp mysqld:/var/lib/mysql/public_key.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/ca.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/server-cert.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/client-key.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/client-cert.pem "${HOME}"
        else
            WITH_PLUGIN=''
        fi
    
        mysql -uroot -e 'create database testdb DEFAULT CHARACTER SET utf8mb4'
    else
        cat ~/.my.cnf
    
        mysql -e 'select VERSION()'
        mysql -e 'create database testdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;'
    fi
    
    特拉维斯·伊梅尔先生 您必须使用矩阵->包含块。对于PHP,请参阅以下代码。在前面提到的PyMySQL中,您将找到Python的一种方法

    sudo: required
    
    language: php
    
    services:
      - docker
    
    matrix:
        fast_finish: true
        include:
            #
            # Define versions of MySQL and MariaDB to test against.
            #
            # mysql 5.5
            - php: 5.6
              env: DB=mysql:5.5
            - php: 7.0
              env: DB=mysql:5.5
            - php: 7.1
              env: DB=mysql:5.5
            - php: 7.2
              env: DB=mysql:5.5
            # mysql 5.6
            - php: 5.6
              env: DB=mysql:5.6
            # ...
            # mariadb 10.0
            - php: 5.6
              env: DB=mariadb:10.0
            - php: 7.0
              env: DB=mariadb:10.0
            - php: 7.1
              env: DB=mariadb:10.0
            - php: 7.2
              env: DB=mariadb:10.0
            # ...
    
    before_script:
        #
        # install and init database (see matrix => include => env)
        #
        - ./.travis/install-and-init-db.sh
    
        #
        # setup and run tests
        #
        # Install composer packages, will also trigger dump-autoload
        - travis_retry composer install --no-interaction
    
    script:
        - vendor/bin/phpunit --coverage-clover gen/coverage/clover.xml
    
    创建和使用连接 使用以下参数创建到数据库服务器的连接:

    $dbConfig = array(
        'db_name' => 'testdb',
        'db_user' => 'root',
        'db_pwd'  => '',
        'db_host' => '127.0.0.1',
    );
    

    我将回答我自己的问题,但我对其他方法持开放态度

    解决方案 以下解决方案基于PyMySQL项目中的.travis.yml:

    您需要脚本和.travis.yml配置的组合

    剧本 如果要重用以下代码,请在项目中使用以下路径:.travis/install和init db.sh

    以下脚本以所需版本安装数据库:

    # debug
    set -x
    # verbose
    set -v
    
    if [ ! -z "${DB}" ]; then
        # disable existing database server in case of accidential connection
        sudo service mysql stop
    
        docker pull ${DB}
        docker run -it --name=mysqld -d -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 ${DB}
        sleep 10
    
        mysql() {
            docker exec mysqld mysql "${@}"
        }
        while :
        do
            sleep 5
            mysql -e 'select version()'
            if [ $? = 0 ]; then
                break
            fi
            echo "server logs"
            docker logs --tail 5 mysqld
        done
    
        mysql -e 'select VERSION()'
    
        if [ $DB == 'mysql:8.0' ]; then
            WITH_PLUGIN='with mysql_native_password'
            mysql -e 'SET GLOBAL local_infile=on'
            docker cp mysqld:/var/lib/mysql/public_key.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/ca.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/server-cert.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/client-key.pem "${HOME}"
            docker cp mysqld:/var/lib/mysql/client-cert.pem "${HOME}"
        else
            WITH_PLUGIN=''
        fi
    
        mysql -uroot -e 'create database testdb DEFAULT CHARACTER SET utf8mb4'
    else
        cat ~/.my.cnf
    
        mysql -e 'select VERSION()'
        mysql -e 'create database testdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;'
    fi
    
    特拉维斯·伊梅尔先生 您必须使用矩阵->包含块。对于PHP,请参阅以下代码。在前面提到的PyMySQL中,您将找到Python的一种方法

    sudo: required
    
    language: php
    
    services:
      - docker
    
    matrix:
        fast_finish: true
        include:
            #
            # Define versions of MySQL and MariaDB to test against.
            #
            # mysql 5.5
            - php: 5.6
              env: DB=mysql:5.5
            - php: 7.0
              env: DB=mysql:5.5
            - php: 7.1
              env: DB=mysql:5.5
            - php: 7.2
              env: DB=mysql:5.5
            # mysql 5.6
            - php: 5.6
              env: DB=mysql:5.6
            # ...
            # mariadb 10.0
            - php: 5.6
              env: DB=mariadb:10.0
            - php: 7.0
              env: DB=mariadb:10.0
            - php: 7.1
              env: DB=mariadb:10.0
            - php: 7.2
              env: DB=mariadb:10.0
            # ...
    
    before_script:
        #
        # install and init database (see matrix => include => env)
        #
        - ./.travis/install-and-init-db.sh
    
        #
        # setup and run tests
        #
        # Install composer packages, will also trigger dump-autoload
        - travis_retry composer install --no-interaction
    
    script:
        - vendor/bin/phpunit --coverage-clover gen/coverage/clover.xml
    
    创建和使用连接 使用以下参数创建到数据库服务器的连接:

    $dbConfig = array(
        'db_name' => 'testdb',
        'db_user' => 'root',
        'db_pwd'  => '',
        'db_host' => '127.0.0.1',
    );
    

    我以@k00ni在中链接到的示例为例,将其归结为更简单的内容,因为我的测试不需要TLS或自定义用户。以下是:

    #/bin/bash
    如果[$MYSQL='system'];然后
    出口
    fi
    #源自https://github.com/PyMySQL/PyMySQL/blob/master/.travis/initializedb.sh
    set-e
    sudo服务mysql停止
    docker pull${MYSQL}
    RUN\u MYSQL=“docker RUN-it--name=mysqld-d-e MYSQL\u ALLOW\u EMPTY\u PASSWORD=yes-p3306:3306”
    导出MYSQL_URI=db:mysql://root@127.0.0.1/information_schema
    如果[$MYSQL=='MYSQL:8.0'];然后
    ${RUN\u MYSQL}${MYSQL}——默认身份验证插件=MYSQL\u native\u密码
    其他的
    ${RUN_MYSQL}${MYSQL}
    fi
    
    它导出
    MYSQL\u URI
    ,因此测试不需要连接;根据您自己的测试进行适当的修改

    这个脚本不需要等待MySQL完成启动,因为Sqitch测试需要一到两分钟的时间,在运行连接到数据库的测试之前,还需要做一些其他的事情。如果您的项目需要等待MySQL启动,请将以下内容附加到脚本末尾:

    while!docker exec mysqld mysqladmin ping--主机localhost--静默&>/dev/null;做
    echo“正在等待数据库连接…”
    睡眠2
    完成
    
    无论哪种方式,下面介绍如何创建一个构建阶段来运行多个版本的MySQL:

    作业:
    包括:
    # https://hub.docker.com/_/mysql
    # https://hub.docker.com/_/mariadb
    -&mysql
    
    阶段:我以@k00ni在中链接到的示例为例,将其归结为更简单的内容,因为我的测试不需要TLS或自定义用户。以下是:

    #/bin/bash
    如果[$MYSQL='system'];然后
    出口
    fi
    #源自https://github.com/PyMySQL/PyMySQL/blob/master/.travis/initializedb.sh
    set-e
    sudo服务mysql停止
    docker pull${MYSQL}
    RUN\u MYSQL=“docker RUN-it--name=mysqld-d-e MYSQL\u ALLOW\u EMPTY\u PASSWORD=yes-p3306:3306”
    导出MYSQL_URI=db:mysql://root@127.0.0.1/information_schema
    如果[$MYSQL=='MYSQL:8.0'];然后
    ${RUN\u MYSQL}${MYSQL}——默认身份验证插件=MYSQL\u native\u密码
    其他的
    ${RUN_MYSQL}${MYSQL}
    fi
    
    它导出
    MYSQL\u URI
    ,因此测试不需要连接;根据您自己的测试进行适当的修改

    这个脚本不需要等待MySQL完成启动,因为Sqitch测试需要一到两分钟的时间,在运行连接到数据库的测试之前,还需要做一些其他的事情。如果您的项目需要等待MySQL启动,请将以下内容附加到脚本末尾:

    while!docker exec mysqld mysqladmin ping--主机localhost--静默&>/dev/null;做
    echo“正在等待数据库连接…”
    睡眠2
    完成
    
    无论哪种方式,下面介绍如何创建一个构建阶段来运行多个版本的MySQL:

    作业:
    包括:
    # https://hub.docker.com/_/mysql
    # https://hub.docker.com/_/mariadb
    -&mysql
    阶段: