Трэвис: как запустить тесты на разных серверах MySQL - PullRequest
0 голосов
/ 08 мая 2018

Как запустить тесты для разных бэкэндов MySQL, используя один файл .travis.yml?

Что-то вроде здесь , используя matrix->include. Например:

  • Запуск тестов для MySQL 5.5
  • Запуск тестов на MySQL 5.6
  • Запуск тестов на MySQL 5.7
  • Запуск тестов на MySQL 8.0

То, что я сейчас нашел, это:

Последние упоминания

Вы также можете установить MySQL 5.7 на Ubuntu Trusty с поддержкой sudo.

Но не упоминается, например, как использовать 5.6 и 5.7.

Возможные обходные пути (если не существует способа «Travis» для его решения):

  1. Подход: создайте различные настройки Docker, каждая с определенной версией MySQL, и протестируйте мой скрипт вручную. Но это очень сильно раздувает мою среду разработки и отнимает много времени.

  2. Установите требуемый сервер MySQL из источников / через apt, в зависимости от связанной переменной среды (например, MYSQL_VERSION == 5.5). Использование определенной конфигурации для доступа к ней.

Спасибо за ваш отзыв!

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я взял пример, на который @ k00ni ссылается в сценарии PyMySQL initializedb.sh , и свел его к чему-то более простому, поскольку в моих тестах не требуется TLS или пользовательский пользователь. Вот сценарий Sqitch linux-mysql :

#!/bin/bash

if [ $MYSQL = 'system' ]; then
    exit
fi

# Derived from https://github.com/PyMySQL/PyMySQL/blob/master/.travis/initializedb.sh
set -e
sudo service mysql stop
docker pull ${MYSQL}
RUN_MYSQL="docker run -it --name=mysqld -d -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306"
export MYSQL_URI=db:mysql://root@127.0.0.1/information_schema

if [ $MYSQL == 'mysql:8.0' ]; then
    ${RUN_MYSQL} ${MYSQL} --default-authentication-plugin=mysql_native_password
else
    ${RUN_MYSQL} ${MYSQL}
fi

Экспортирует MYSQL_URI, поэтому в тестах нет соединения; измените в соответствии с вашими собственными тестами.

Этот скрипт не дожидается окончания запуска MySQL, потому что тесты Sqitch занимают минуту или две, перед тем как запускать тесты, которые подключаются к базе данных, делают кучу других вещей. Если вашему проекту нужно дождаться запуска MySQL, добавьте его в конец скрипта:

while ! docker exec mysqld mysqladmin ping --host localhost --silent &> /dev/null ; do
    echo "Waiting for database connection..."
    sleep 2
done

В любом случае, вот как `.travis.yml создает этап сборки для запуска нескольких версий MySQL:

jobs:
  include:
    # https://hub.docker.com/_/mysql
    # https://hub.docker.com/_/mariadb
    - &mysql
      stage: ? MySQL
      if: branch = master
      services: docker
      env: MYSQL=mysql:8.0
      before_install:
        - source dev/linux-mysql
        - source dev/linux-prereqs
      script:
        - LIVE_MYSQL_REQUIRED=1 prove -lr --directives --comments t/mysql.t
    - <<: *mysql
      env: MYSQL=mysql:5.7
    - <<: *mysql
      env: MYSQL=mysql:5.6
    - <<: *mysql
      env: MYSQL=mysql:5.5
    - <<: *mysql
      env: MYSQL=mariadb:10.4
    - <<: *mysql
      env: MYSQL=mariadb:10.3
    - <<: *mysql
      env: MYSQL=mariadb:10.2
    - <<: *mysql
      env: MYSQL=mariadb:10.1
    - <<: *mysql
      env: MYSQL=mariadb:10.0
    - <<: *mysql
      env: MYSQL=mariadb:5.5

См. в этой сборке о том, как все закончится (наряду с множеством других тестов базы данных).

0 голосов
/ 13 мая 2018

Я отвечу на свой вопрос, но я открыт для других подходов.

Решение

Следующее решение основано на .travis.yml из проекта PyMySQL: https://github.com/PyMySQL/PyMySQL/blob/master/.travis.yml

Вам нужна комбинация скрипта и конфигурации .travis.yml.

Сценарий

Если вы хотите повторно использовать следующий код, используйте следующий путь в вашем проекте: .travis / install-and-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

.travis.yml

Вы должны использовать матрицу-> включить блок. Для 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',
);
...