特拉维斯:如何对不同的MySQL后端运行测试?
如何使用一个.travis.yml文件对不同的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,例如 可能的解决方法
matrix->include
。例如:
- 对MySQL 5.5运行测试
- 对MySQL 5.6运行测试
- 对MySQL 5.7运行测试
- 对MySQL 8.0运行测试
- 在Travis中使用MySQL 5.7:
- 有关如何在Travis上设置数据库的一般信息:
谢谢你的反馈 我将回答我自己的问题,但我对其他方法持开放态度 解决方案 以下解决方案基于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
阶段: