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

Ale*_*arn 16 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
Run Code Online (Sandbox Code Playgroud)

给我:"开始:工作未能开始",但我甚至不想使用sudo.对于PHP配置,我可以这样做:

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

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

我也知道:

  - mysql -e "SET GLOBAL innodb_buffer_pool_size = 512M;"
Run Code Online (Sandbox Code Playgroud)

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

  ERROR 1238 (HY000) at line 1: Variable 'innodb_buffer_pool_size' is a read only variable
Run Code Online (Sandbox Code Playgroud)

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

bry*_*ynk 4

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

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

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

  • 将 .tar.gz 解压到缓存目录 - 如果解压目标已存在,请勿执行此操作

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

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

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

  • 第二次启动mysqld,稍等一下,检查配置变化,然后停止

  • 证明.travis.yml(mysql 5.6.40 generic linux 64-bit)在这里: 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"
Run Code Online (Sandbox Code Playgroud)

留给后人的讨论:

正如您所确定的,mysql 中有某些配置参数只能在服务器启动之前设置。对于 mysql 5.6,表 14.13中的任何“动态:否” - 我重申了明显的 fwiw:php 参数通过php.ini 动态地施加在 php 进程上


(从未测试过这个 - 不知道它是否有效 - 约束是“无 sudo”,并且此方法显然需要sudo)首先,您是否尝试过使用service二进制文件(https://linux.die.net/man/8/服务)而不是直接调用mysql? 即。https://docs.travis-ci.com/user/database-setup/#MySQL-5.7

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
Run Code Online (Sandbox Code Playgroud)

您通过在每个测试运行之前更改这些 mysql 参数来测试什么情况,而不是在测试实例数据库服务器中“永久”配置它们?

  • 假设您mysqld在容器启动时通过services: mysql? 您可以将 travis 配置为mysqldbefore_install或 中专门启动script,并在启动时指定您想要的参数,并mysqld在 ci 框架下运行travis (我认为这应该允许它启动/停止/重新启动等而无需任何sudo使用,但我还没有测试过它)有关概念证明,请参阅:https ://github.com/knyrb/mysql-travisci )

  • (从未测试过这个,但它应该也能工作)另一种选择可能是为您想要执行的每个特定环境测试建立一个 github 项目,将 mysqld 配置为在已设置的限制参数下运行:您的测试将针对每个容器,而不是比临时重新启动要好(可能很疯狂,取决于你有多想要它!)

  • (如果您的测试与性能相关,请记住在开始测量之前向数据库提供一些预热查询)

  • 我纯粹出于兴趣而问:当谈到测试不同的环境和配置限制时,我的愚见总是倾向于“越多越好”的方法!


(也从未测试过这个)不确定您是否使用足够新的 mysql 版本来使此选项起作用,但我看到 mysql 8 中有一条指令restart

如果您可以让 mysql 存储过程从调用存储过程的特权帐户触发数据库服务的重新启动,这可能对您有用 - 您可以调用此存储过程,然后等待服务器重新启动,例如使用以下方法之一:

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

  • 如果您使用本地 unix/ 域套接字,请/tmp/mysql.sock使用此处的任何方法等待文件(或等效文件): https: //superuser.com/questions/878640/unix-script-wait-until-a-file-存在 while .. sleepinotifywait来自 inotify 工具;或者从 python 内部使用inotify.adapters.InotifyTree().eventgen()(可能有点过头了!)

  • 尝试建立一个慷慨的超时连接,mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password

  • /sf/answers/1483260831/wait .. sleep用于curl启动一个网络服务,该服务又连接到数据库:也许您的应用程序有一个“状态”页面?也许它会等待一段时间并在之前重试数据库连接它返回到http客户端)

  • https://unix.stackexchange.com/a/5279wait .. sleep使用netcat,netstatlsof,但我认为这些都需要sudo,除非你从 ci 框架内启动 mysql,其中netstatci 框架应该提供信息)