我已经设置了一个元命令,如此处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.');
}
}
好的,这确实可行-有时。 当我在本地执行此操作时就可以使用。
但是我正在docker容器和Gitlab CI工具链中使用所有这些。
为此,我有一个shell脚本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
上执行,脚本将正确运行!
我在Docker主机上使用本地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执行专家有些不对吗?