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

Мне бы хотелось, чтобы моя задача gradle:

  • Выполнить команду (внешний процесс для запуска моего сервера).
  • Подождите, пока какой-то вывод из моего внешнего процесса скажет: "Сервер готов" в стандартном режиме.
  • Сделайте что-то в моей задаче gradle (в основном, чтобы поговорить с моей внешней задачей).
  • Когда я закончил делать свои вещи, завершите внешний процесс, запустив еще одну команду "остановить мой сервер".
  • Когда обе команды завершены, завершите задачу.

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

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

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

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

Ответ 1

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

Ответ 2

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

Но просто создать собственную логику с набором задач. Самой сложной частью является ожидание внешнего процесса, который 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, чтобы делать разные вещи - например, проверить, чтобы сервер сказал: "сервер готов" в файле где-нибудь ( "в stdout" будет очень сильно зависеть от того, как вы запускали свой процесс).

Или вы можете проверить, что "сервер готов" или что-то подобное в определенном URL-адресе, см. fooobar.com/info/484814/...