Отключение сборки Ant - Ctrl C - PullRequest
       16

Отключение сборки Ant - Ctrl C

4 голосов
/ 01 декабря 2010

У меня есть набор задач ant, которые я использую для запуска своего набора тестов, иногда один из этих тестов зависает, и весь мой набор тестов зависает.Я добавил обработчик выключения, поэтому, когда я нажму Ctrl + C , муравей будет корректно выключен и выдаст мне отчет с окончательным тестом, помеченным как не выполненный.(Это важно, потому что это интеграционные тесты, которые могут работать часами). Это прекрасно работает, за исключением Windows, где не вызывается мой хук отключения.Есть ли способ заставить муравья реагировать на любые входные данные и корректно завершать работу?

1 Ответ

2 голосов
/ 03 декабря 2010

Похоже, это давно известная проблема .

Проблема в том, что в Windows Ant Ctrl + C , как вы заметили, не распространяется на дочерние виртуальные машины.Вещи, которые вы могли бы рассмотреть:

  • Разбейте тест на более мелкие части и используйте timeout, чтобы убить все, что зависает.Это ограничит потерянные данные одним зависшим тестом.
  • В вашем тестовом прогоне добавьте поток «слушателя», который ожидает сигнала «завершения работы» (возможно, наличие файла флага), и организуйтеэтот сигнал должен быть установлен Ant по команде с консоли, если обнаружен зависание.

Это кажется сложным, но, возможно, того стоит.Вам нужно будет объединить задачи Ant parallel и input, чтобы запустить тесты в одном потоке, и ожидать ввода от консоли во втором потоке.Когда выбрано прерывание, файл сигнала записывается, это обнаруживается в тестовом прогоне «слушатель», вызывая его прекращение.Любой другой ввод приведет к чистому завершению цикла.Проблема в том, что если тест завершится успешно, Ant останется в ожидании ввода данных пользователем, но вы можете установить общее время ожидания для этого.(Я не привел пример того, как код тестового прогона может обнаружить файл сигнала.)

Psuedo-Ant:

<property name="signal.abort" value="stop.txt" />
<target name="runner">
    <delete file="${signal.abort}" />
    <parallel timeout="86400000">
        <sequential>

            <!-- run tests here -->

        </sequential>
        <sequential>
            <input validargs="y,n"
                   message="Abort the test (y/n)?"
                   addproperty="abort.test" />
            <condition property="do.abort">
                <equals arg1="y" arg2="${abort.test}"/>
            </condition>
            <ant target="terminator" />
        </sequential>
    </parallel>
</target>

<target name="terminator" if="do.abort">
    <echo message="abort" file="${signal.abort}" />
</target>
...