Travis:如何 运行 针对不同的 MySQL 后端进行测试?
Travis: how to run tests against different MySQL backends?
如何使用一个 .travis.yml 文件 运行 针对不同的 MySQL 后端进行测试?
类似于 here,使用 matrix->include
。例如:
- 运行 测试 MySQL 5.5
- 运行 测试 MySQL 5.6
- 运行 测试 MySQL 5.7
- 运行 测试 MySQL 8.0
我目前发现的是:
- 在 Travis 中使用 MySQL 5.7:https://gist.github.com/gocanto/46b8d39576f612f9c6b8b4ffb3efac98
- 关于如何在 Travis 上设置数据库的一般信息:https://docs.travis-ci.com/user/database-setup/
后面提到
You can also install MySQL 5.7 on sudo-enabled Ubuntu Trusty.
但是没有提到如何使用 5.6 和 5.7,例如。
可能的解决方法(如果没有"Travis"方法解决):
方法:创建不同的 Docker 设置,每个设置都有特定的 MySQL 版本并手动测试我的脚本。但这会使我的开发环境非常膨胀并且非常耗时。
根据相关的环境变量(例如MYSQL_VERSION == 5.5)从sources/via apt 安装所需的MySQL 服务器。使用特定配置访问它。
感谢您的反馈!
我会回答我自己的问题,但我愿意接受其他方法。
解决方案
以下解决方案基于 PyMySQL 项目中的 .travis.yml: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
您必须使用 matrix->include 块。对于 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 链接到 PyMySQL initializedb.sh
script and boiled it down to something a bit simpler, since my tests don't require TLS or a custom user. Here's the Sqitch linux-mysql
script 中的示例为例:
#!/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
请参阅 this build 了解结果如何(以及许多其他数据库测试)。
如何使用一个 .travis.yml 文件 运行 针对不同的 MySQL 后端进行测试?
类似于 here,使用 matrix->include
。例如:
- 运行 测试 MySQL 5.5
- 运行 测试 MySQL 5.6
- 运行 测试 MySQL 5.7
- 运行 测试 MySQL 8.0
我目前发现的是:
- 在 Travis 中使用 MySQL 5.7:https://gist.github.com/gocanto/46b8d39576f612f9c6b8b4ffb3efac98
- 关于如何在 Travis 上设置数据库的一般信息:https://docs.travis-ci.com/user/database-setup/
后面提到
You can also install MySQL 5.7 on sudo-enabled Ubuntu Trusty.
但是没有提到如何使用 5.6 和 5.7,例如。
可能的解决方法(如果没有"Travis"方法解决):
方法:创建不同的 Docker 设置,每个设置都有特定的 MySQL 版本并手动测试我的脚本。但这会使我的开发环境非常膨胀并且非常耗时。
根据相关的环境变量(例如MYSQL_VERSION == 5.5)从sources/via apt 安装所需的MySQL 服务器。使用特定配置访问它。
感谢您的反馈!
我会回答我自己的问题,但我愿意接受其他方法。
解决方案
以下解决方案基于 PyMySQL 项目中的 .travis.yml: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
您必须使用 matrix->include 块。对于 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 链接到 PyMySQL initializedb.sh
script and boiled it down to something a bit simpler, since my tests don't require TLS or a custom user. Here's the Sqitch linux-mysql
script 中的示例为例:
#!/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
请参阅 this build 了解结果如何(以及许多其他数据库测试)。