0

我已经设置了一个像这里描述的元命令https://symfony.com/doc/3.4/console/calling_commands.html

它首先删除数据库,然后从头开始运行迁移,最后初始化我的数据。

自从我最近从创建模式切换doctrine:schema:createdoctrine: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 执行有点错误?

4

0 回答 0