Задача Gradle для обработки, когда внешний процесс готов

Я хотел бы, чтобы моя задача Gradle:

  1. Выполните команду (внешний процесс для «запуска моего сервера»).
  2. Дождитесь определенного вывода моего внешнего процесса, который скажет «Сервер готов» в стандартном выводе.
  3. Сделайте что-нибудь в моей задаче gradle (в основном, чтобы поговорить с моей внешней задачей).
  4. Когда я закончу делать свои дела, завершите внешний процесс, запустив другую команду «остановить мой сервер».
  5. Когда обе команды будут выполнены, завершите задачу.

Это похоже на запуск сервера для запуска интеграционных тестов, но это не сервер типа tomcat/jetty, поэтому его нужно запускать из командной строки и ждать, пока сервер будет «готов» через стандартный вывод сервера.

В настоящее время я могу использовать задачу exec для запуска моей задачи и получения результата. Поэтому я думаю, что, вероятно, смогу кодировать на Groovy/Java, чтобы добиться того, чего хочу.

Однако кодирование этого, казалось бы, распространенного шаблона кажется утомительным. Поэтому мне интересно, есть ли более простой способ решить такие проблемы без лишнего кодирования - т.е. это общий шаблон, для которого у Gradle есть DSL?

Обратите внимание, что я новичок в Gradle, поэтому любые советы по этой теме также будут оценены.


person kctang    schedule 21.12.2012    source источник
comment
Насколько я знаю, готовой поддержки для него нет. Я реализовал задача, которая делает что-то подобное. Этот код может дать вам начало.   -  person Benjamin Muschko    schedule 27.12.2012
comment
@kctang, если вы укажете конкретные технологии, которые вы используете, мы можем предоставить вам точное решение. Не то чтобы вам действительно нужно было использовать кодирование градации, но также некоторая среда тестирования интегратора, которая запускает встроенную среду тестирования.   -  person Rajmahendra    schedule 27.12.2012
comment
@Rajmahendra Это специальный сервер / клиент Java RMI для разработки. Мне нужно, чтобы серверное приложение написало stdout ===Server Ready===, прежде чем я смогу подключиться с помощью клиента Java RMI, чтобы убедиться, что сервер работает правильно, затем выключите и продолжите.   -  person kctang    schedule 28.12.2012


Ответы (2)


Насколько я знаю, текущая версия Gradle (1.4) не имеет специальной поддержки DSL для запуска/завершения внешних процессов. Вы можете реализовать это в groovy прямо внутри скрипта сборки, это не должно быть слишком сложно.

person Nikita Skvortsov    schedule 19.03.2013

Общий шаблон: вероятно, нет - слишком много различных возможностей/комбинаций для любого стандартного шаблона.

Но построить собственную логику с набором задач несложно. Самая сложная часть — это ожидание внешнего процесса, для которого у Gradle есть DSL (на самом деле у Ant есть основная логика/DSL, Gradle просто оборачивает его).

Это моя задача дождаться, пока Postgres появится внутри локального контейнера докеров:

task waitForLocalDb(){
  group = 'docker.db'
  mustRunAfter localApiSvcDbRunCleanContainer
  doFirst{
    println "waiting for Postgres to come up"
    ant.waitfor(
      maxwait:"10", maxwaitunit:"second", 
      checkevery:"500", checkeveryunit: "millisecond"
    ){
      socket(server:"192.168.99.100", port:"5544")
    }
  }
}

Это ожидает Postgres, проверяя, прослушивает ли он указанный порт.

Вы можете использовать задачу Ant waitfor, чтобы выполнять различные действия, например проверять server, чтобы сказать «сервер готов» где-то в файле («в стандартном выводе» очень сильно зависит от того, как вы запускали свой процесс).

Или вы можете проверить «сервер готов» или что-то подобное в определенном URL-адресе, см. https://stackoverflow.com/a/2548226/924597

person Shorn    schedule 17.10.2017