Ответ 1
Я представляю конфигурацию.travis.yml, которая позволяет запускать и перезапускать mysqld
без использования sudo
- логика идет по строкам:
-
просто из интереса, почему вы не можете использовать
sudo
? -
получить общий linux.tar.gz с https://dev.mysql.com/downloads/mysql/ в
before_script
с помощьюwget
- сохранить.tar.gz в каталоге, который будет кэшироваться - не делайте этого, если файл уже существует -
распакуйте.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"
обсуждение осталось для потомков:
как вы определили, в mysql есть определенные параметры конфигурации, которые могут быть установлены только до запуска сервера, а именно. все, что является "динамическим: нет" в таблице 14.13 для mysql 5.6 - я повторяю очевидное fwiw: параметры php динамически накладываются на процесс php через php.ini
(никогда не тестировал это - не знаю, работает ли это - ограничение было "no sudo", и этот метод явно требует sudo
), вы пробовали использовать service
двоичный файл (https://linux.die.net/man/8/service) вместо прямого вызова 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
какой случай вы тестируете, изменяя эти параметры mysql перед каждой тестовой версией, отличной от настройки "постоянно" на сервере db тестового экземпляра?
-
предполагая, что вашmysqld
запускается при запуске контейнера черезservices: mysql
?вы могли бынастроить travis для запускаmysqld
специально вbefore_install
илиscript
и указать параметры, которые вы хотите во время запуска, аmysqld
работает подtravis
ci framework(я думаю, что это должно позволить ему запускать/останавливать/перезапускать и т.д. без какого-либо использования(см. https://github.com/knyrb/mysql-travisci для доказательства концепции)sudo
, но я его не тестировал)-
см. https://docs.travis-ci.com/user/database-Setup/#MySQL, в котором намекает на возможность (хотя и с помощью jackrabbit),
-
no: должен запускать
mysqld
как root для переключения пользователя,хотя вы бы запустили(https://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_user),mysqld --user=travis
или, может быть, в файле cnf с помощью команды(https://dev.mysql.com/doc/mysql-Security-excerpt/5.6/en/changing-mysql-user.html)[mysqld] user=travis
-
-
(никогда не тестировал это, но он также должен был работать), другой вариант может заключаться в том, чтобы иметь проект github для каждого конкретного теста среды, который вы хотите выполнить, при этом mysqld настроен на запуск с уже установленными предельными параметрами: ваши тесты будут на один контейнер, а чем с промежуточными перезапусками (возможно, безумными, в зависимости от того, насколько вам это плохо)!
-
(если ваши тесты связаны с производительностью, не забудьте дать db a/некоторые разминочные запросы перед началом измерения)
-
я спрашиваю чисто из интереса: когда дело доходит до тестирования разных условий и ограничений конфигурации, мое скромное мнение всегда будет поддерживать подход "больше - больше"!
(никогда не тестировал это тоже) не уверен, что вы используете последнюю версию mysql для этой опции, но я вижу, что есть инструкция по restart
mysql 8
это может сработать для вас, если вы можете заставить хранимый процесс mysql запускать перезапуск службы базы данных из привилегированной учетной записи, вызывая хранимую процедуру - вы должны вызвать этот сохраненный процесс, а затем дождаться перезагрузки сервера, скажем одним из следующих способов:
-
вызов
sleep
выполнил задание в доказательстве (он не будет учитывать отказ), но ci build не удастся, если какой-либо процесс вернется! = 0) -
если вы используете локальный сокет unix/domain, подождите файл
/tmp/mysql.sock
(или ваш эквивалент), используя любой из методов здесь: https://superuser.com/questions/878640/unix-Script- wait-inotifywait
-a-file-existswhile.. sleep
,inotifywait
из инструментов inotify; или изнутри python, используяinotify.adapters.InotifyTree().eventgen()
(возможно, overkill!) -
mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password
соединение сmysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password
таймаутом,mysql -S/tmp/mysql.sock --connect-timeout=# --user=youruser --password
-
fooobar.com/questions/112308/... (
wait.. sleep
используяcurl
чтобы попасть в веб-сервис, который, в свою очередь, подключается к db: возможно, ваше приложение имеет страницу статуса и возможно ждет некоторое время и повторяет соединение db, прежде чем он вернется к http-клиенту) -
https://unix.stackexchange.com/a/5279 (
wait.. sleep
используяnetcat
,netstat
иlsof
, но они, я думаю, все потребуютsudo
если вы не запустите mysql изнутри ci framework, в которомnetstat
из ci framework должен предоставить информацию)