Как выполнить команду docker-compose из теста Cypress

#docker #makefile #cypress

#docker #makefile #cypress

Вопрос:

Корень моего проекта приложения содержит мои docker-compose и Makefile, а также папку с именем apps. В приложениях есть api и интерфейс. Моя установка Cypress находится в папке интерфейса.

Я хотел бы иметь возможность запускать команду cy.exec('make reset-fixtures') из Cypress. Это возвращает ошибку «Нет правила для создания целевых настроек сброса», которая, как я полагал, может быть вызвана тем, что я выполняю из папки, которая находится глубже в дереве, чем мой Makefile. Итак, я изменил свою команду cy.exec('cd ../.. amp;amp; make reset-fixtures') , которая привела к следующему:

 Stderr:
the input device is not a TTY
make[1]: *** [reset-fixtures] Error 1
 

Каков наилучший способ выполнить эти команды make из Cypress?

РЕДАКТИРОВАТЬ: это команда make:

 reset-fixtures:     
@docker-compose exec mongodb /scripts/reset-fixtures.sh
 

Комментарии:

1. Эта ошибка не выводится make. Он печатается любой командой, которая выполняется в рецепте для целевого reset-fixtures объекта . Поскольку вы не показали это правило или команду, которая печатается перед этой ошибкой, мы не можем сказать об этом больше, кроме того, что, по-видимому, ожидается, что stdin будет терминалом, а это не так.

2. Это рецепт создания: reset-fixtures: @docker-compose exec mongodb /scripts/reset-fixtures.sh

3. Пожалуйста, отредактируйте свой вопрос, а не добавляйте комментарии: комментарии не могут быть правильно отформатированы. Вы вызываете make сами по себе или предоставляете другие аргументы, в частности -j ? Похоже, что для одной из вызываемых операций требуется, чтобы stdin был TTY . Если вы вызываете команду docker-compose exec mongodb /scripts/reset-fixtures.sh </dev/null для получения stdin /dev/null вместо терминала, работает ли она или вы получаете ту же ошибку устройства ввода?

4. Похоже, это та же ошибка устройства ввода. Я не использую -j, что это делает?

5. -j обновляет цели (которые не зависят друг от друга) параллельно. Поскольку одновременно выполняется несколько рецептов, только один из них (по сути, случайным образом) получит стандартный идентификатор, а остальные — нет. Однако, насколько мне известно, при последовательном запуске (без -j ) GNU make выдает каждой команде, которую она вызывает, тот же stdin, который она получила. Так что я не уверен, в чем здесь проблема. Если вы напишете правило check_tty: ; test -t 0 amp;amp; echo is a tty , а затем запустите make check_tty , оно говорит is a tty ? Если это так, то, похоже, это не проблема make, по крайней мере, напрямую.

Ответ №1:

Что сработало для меня, так это использование -T опции с docker-compos exec. Это предотвращает использование TTY:

 -T, --no-TTY docker compose exec     Disable pseudo-TTY allocation. By default docker compose exec allocates a TTY.
 

Это сделало бы его похожим на следующее:

тест cypress

 cy.exec('(cd ../; make your_command)')
 

Makefile

 your_command:
  docker-compose exec -T your_container path_to_executable