如何在没有Sudo的情况下在Travis CI上添加到MySQL配置

时间:2016-11-17 17:33:25

标签: php mysql travis-ci

我试图弄清楚如何在Travis CI测试运行之前更改MySQL配置。我们正在使用“sudo:false”指令,我认为使用容器......我不是最好的devops人。

但即使我将sudo设置为true,我尝试向“/etc/mysql/my.cnf”添加行后也无法重启MySQL。

所以,

  - cat "some/directory/my.cnf" | sudo tee -a /etc/mysql/my.cnf
  - sudo /etc/init.d/mysql restart

告诉我:“开始:工作未能启动”,但我甚至不想使用sudo。对于PHP配置,我可以执行以下操作:

  - echo "apc.shm_size=256M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini

但我在主文件夹中看不到有关MySQL的任何内容。

我也知道:

  - mysql -e "SET GLOBAL innodb_buffer_pool_size = 512M;"

但是我想要设置的东西给了我:

  ERROR 1238 (HY000) at line 1: Variable 'innodb_buffer_pool_size' is a read only variable

所以,我对如何在Travis CI上完成更改MySQL配置感到茫然,而且我尝试的每一个互联网搜索和方法都让我失望。

2 个答案:

答案 0 :(得分:4)

我提供了一个.travis.yml配置,允许您在不使用mysqld的情况下运行并重新启动sudo - 逻辑如下:

  • 只是出于兴趣,为什么不能使用sudo

  • 使用before_scriptwget中的https://dev.mysql.com/downloads/mysql/获取通用linux .tar.gz - 将.tar.gz存储在将被缓存的目录中 - 不要如果文件已存在,请执行此操作

  • 将.tar.gz解压缩到缓存目录 - 如果unpack目标已经存在,请不要这样做

  • 清除错误日志并重新创建.cnf文件

  • 现在在script,第一次启动mysqld,等待一下,检查它是否正在运行,然后停止

  • 对您想要的配置进行任何更改

  • 第二次启动mysqld,等待一下,检查配置更改,然后停止

  • 证明.travis.yml(mysql 5.6.40通用linux 64位)在这里:https://github.com/knyrb/mysql-travisci/blob/master/.travis.yml - 这是(非工作)粗略的想法内容:

before_script:
  <..snip..>
  - if [ -f 'scripts/mysql_install_db' ]; then ./scripts/mysql_install_db --defaults-file="$TCI_D_MYSQL_ROOT/my.cnf"; fi

script:
  <..snip..>
  - bin/mysqld --defaults-file="$TCI_D_MYSQL_ROOT/my.cnf" --socket=/tmp/.thesock &
  - bin/mysqladmin --defaults-file="$TCI_D_MYSQL_ROOT/my.cnf" --socket=/tmp/.thesock ping
  - export TCI_MYSQL_PID_1="`cat $TCI_D_MYSQL_ROOT/mysql.pid`"
  - kill -SIGTERM $TCI_MYSQL_PID_1
  <..snip..>

after_success:
  <..snip..>

after_failure:
  <..snip..>
  - cat "$TCI_D_MYSQL_ROOT/mysql.err"
为后人留下的讨论:

正如您所知,mysql中有一些配置参数只能在服务器启动之前设置。对于mysql 5.6,table 14.13中的任何“动态:否” - 我重申了明显的fwiw:php参数是通过 php.ini

动态地在php进程中造成的

(从未测试过这个 - 不知道它是否有效 - 约束是'没有sudo',这个方法显然需要sudo)首先关闭,你尝试过使用service二进制文件({ {3}})而不是直接调用mysql?即https://linux.die.net/man/8/service

before_install:
- sudo mysql -e "use mysql; update user set authentication_string=PASSWORD('new_password') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;"
- sudo mysql_upgrade
- sudo service mysql restart

您在每个测试运行时之前更改这些mysql参数进行测试的情况与在测试实例数据库服务器中“永久”配置它们不同?

  • 假设您的mysqld在容器启动时通过services: mysql启动?你可以配置travis以mysqldbefore_install专门启动script并在开始时指定你想要的参数,并在ci框架下运行mysqld travis (我认为这应该允许它在没有sudo使用的情况下启动/停止/重启等,但我还没有测试过它)参见:{ {3}}用于概念验证

  • (从未对此进行测试,但它也可以正常工作)另一个选项可能是为每个要执行的特定环境测试创建一个github项目,并将mysqld配置为运行并设置其限制参数:您的测试将是每个容器,而不是临时重启(可能是疯了,取决于你想要它有多糟糕!)

  • (如果您的测试与性能相关,请记住在开始测量之前给db一个/一些热身查询)

  • 我纯粹是出于兴趣:在测试不同的环境和配置限制时,我的拙见总是倾向于“更多更多”的方法!

(从未对此进行过测试)不确定你是否使用最新版本的mysql来使用此选项,但我看到mysql 8中有一条指令https://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_user

这可能对你有用,如果你有一个mysql存储过程触发器从一个调用存储过程的priveleged帐户重启数据库服务 - 你会调用这个存储过程然后等待服务器重启,比如说其中一个以下方法:

  • sleep的调用完成了证明中的工作(它不会导致失败 - 但如果任何进程返回,则ci构建失败!= 0)

  • 如果您使用本地unix / domain套接字,请使用以下任何方法等待文件/tmp/mysql.sock(或等效文件):https://dev.mysql.com/doc/mysql-security-excerpt/5.6/en/changing-mysql-user.html while .. sleep,{{来自inotify工具的1}};或者使用inotifywait来自python内部(可能是矫枉过正!)

  • 尝试使用超时超时inotify.adapters.InotifyTree().eventgen()

  • 进行连接
  • restartmysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password使用wait .. sleep来点击一个网络服务,然后连接到数据库:也许你的应用程序有一个“状态”页面?也许它等待一段时间,并在返回到http客户端之前重试数据库连接)

  • https://superuser.com/questions/878640/unix-script-wait-until-a-file-existscurl使用wait .. sleepnetcatnetstat,但我认为这些都需要lsof,除非您从ci框架内启动mysql,其中来自ci框架的sudo应该提供信息)

答案 1 :(得分:3)

在MySQL 5.7.5之前,

innodb_buffer_pool_size无法动态更改。你用的是哪个版本?

在该版本之前,以下是一些选项:

  • 修改/etc/my.cnf(或其位置)
  • 假设my.cnf最后有一个'include',那么暂时将文件添加到提到的目录中。它需要2行[mysqld]innodb_buffer_pool_size=512M;然后重新启动mysqld。
  • --innodb_buffer_pool_size=512M添加到mysqld
  • 的启动中

其他“VARIABLES”可以动态设置,也可以不动态设置。分别研究每一个。