Команда 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 не так?

0 ответов

Другие вопросы по тегам