Symfony命令会调用其他命令并等待确认

时间:2018-08-03 12:09:44

标签: symfony docker gitlab-ci symfony-console doctrine-migrations

我已经设置了一个元命令,如此处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执行专家有些不对吗?

0 个答案:

没有答案