我已经设置了一个像这里描述的元命令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”作为确认。
请注意,我提供了 BOTH--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 执行有点错误?