Команда Symfony вызывает другие команды и ожидает подтверждения
Я настроил мета-команду, как описано здесь https://symfony.com/doc/3.4/console/calling_commands.html
Сначала он удаляет базу данных, затем запускает миграцию с нуля и, наконец, инициализирует мои данные.
Я сталкиваюсь с этой проблемой, так как недавно я перешел от создания схемы через doctrine:schema:create
в doctrine:migrations:migrate
class ResetDatabaseCommand extends ContainerAwareCommand {
protected function configure()
{
$this
->setName('app:resetDb')
->setDescription('Reset database')
->setHelp('Resets the database (only for testing)');
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$command = $this->getApplication()->find('doctrine:schema:drop');
$dropInput = new ArrayInput([
'command' => 'doctrine:schema:drop',
'--full-database' => true,
'--force' => true,]);
$returnCode = $command->run($dropInput, $output);
$command = $this->getApplication()->find('doctrine:migrations:migrate');
$migrateInput = new ArrayInput([
'command' => 'doctrine:migrations:migrate',
'--no-interaction' => true
]);
$migrateInput->setInteractive(false);
$returnCode = $command->run($migrateInput, $output);
$command = $this->getApplication()->find('app:initialize');
$initInput = new ArrayInput(['command' => 'app:initialize']);
$returnCode = $command->run($initInput, $output);
$output->writeln('done.');
}
}
хорошо, это работает - ИНОГДА. Когда я выполняю это локально, это работает.
Но я использую все это внутри контейнеров докеров и инструментария Gitlab CI.
Для этого у меня есть сценарий оболочки init.sh
#!/bin/bash
set -x # <- does not make a difference
php bin/console app:resetDb --env=prod --no-interaction
который я выполняю на этапе настройки моего тестового действия Gitlab-CI (после запуска контейнера:
docker exec php_container bash init.sh
Выходные данные сводят меня с ума:
Dropping database schema...
[OK] Database schema dropped successfully!
Application Migrations
WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)ERROR: Job failed: execution took longer than 1h0m0s seconds
Это означает, что первая команда выполняется так, как и должна (отбрасывание базы данных), но вторая ожидает, пока "пользователь" не введет "y" в качестве подтверждения.
Обратите внимание, что я поставил ОБА --no-interaction
так же как $migrateInput->setInteractive(false);
,
Странно то, что эта команда хорошо работает локально, но не так быстро, как ее запускает Gitlab-CI! Редактировать: даже локально, я использую php docker-контейнер. Если я выполню здесь на моем Mac docker exec php_container bash init.sh
скрипт работает правильно!
Я использую локальный контейнер gitlab-ci-runner на хосте докера (я работаю хорошо более года).
Изменить: я также проверил, чтобы поместить 3 команды в init.sh
с тем же результатом. Второй скрипт ожидает подтверждения при выполнении из gitlab-ci.
Затем я положил три команды в gitlab-ci.yml
непосредственно:
test1:
stage: test
script:
- docker-compose -f docker-compose_deploy.yml up -d
- docker exec php_1 php bin/console doctrine:schema:drop --env=prod --full-database --force
- docker exec php_1 php bin/console doctrine:migrations:migrate --no-interaction --env=prod
- docker exec php_1 php bin/console app:initialize --env=prod
- docker exec php_1 bash docker/php-fpm/initialization.sh # this is the old line that included the 3 previous commands until now
- docker exec php_1 ./vendor/bin/simple-phpunit
И ЭТО РАБОТАЕТ!!! Так что, похоже, выполнение bash не так?