Я работаю над устаревшим проектом сервера Java Enterprise, пытаясь настроить ночные сборки. Мы используем Java 5, Maven 2, JBoss 4.2 и Atlassian Bamboo 2.1.5. Идея состоит в том, что у нас есть агент Bamboo на одном из наших серверов разработки, и сборка Maven настроена для жесткого развертывания полученного файла .ear, а затем перезапускает сервер. (Мы не можем использовать мягкое развертывание, потому что наше устаревшее приложение использует библиотеку, которая вызывает исключение во время отмены развертывания ... мы избавимся от этой чертовой библиотеки в какой-то момент, но не сейчас.) Я использую плагин JBoss Maven для этот. Он прекрасно работает, когда я запускаю сборку Maven на своем собственном компьютере (ноутбук, Win XP Professional): сервер останавливается и перезапускается с последней сборкой, и сборка завершается.
Однако, когда я пытаюсь запустить ночную сборку на нашем сервере (Win 2003), после запуска сервера JBoss процесс сборки останавливается. Bamboo агент отображается в журнале:
Build MYPROJECT-NIGHTLY-44 completed.
И затем он ждет, сборка так и не завершится - если я не выключу сервер JBoss вручную, после чего процесс сборки Bamboo возобновится и запустит свои действия после сборки, а затем завершится с
Finished building MYPROJECT-NIGHTLY-44.
Очевидно, что процесс запуска сервера JBoss каким-то образом блокирует родительский процесс в Win 2003, в то время как тот же процесс выполняется независимо в Win XP. Соответствующий код плагина JBoss выглядит следующим образом (для краткости переформатирован):
protected void launch( String fName, String params )
throws MojoExecutionException {
try {
checkConfig();
String osName = System.getProperty( "os.name" );
Runtime runtime = Runtime.getRuntime();
Process p = null;
if ( osName.startsWith( "Windows" ) ) {
String command[] = { "cmd.exe", "/C", "cd " + jbossHome + "\\bin & " + fName + ".bat " + " " + params };
p = runtime.exec( command );
dump( p.getInputStream() );
dump( p.getErrorStream() );
} else {
String command[] = { "sh", "-c", "cd " + jbossHome + "/bin; ./" + fName + ".sh " + " " + params };
p = runtime.exec( command );
}
} catch ( Exception e ) {
throw new MojoExecutionException( "Mojo error occurred: " + e.getMessage(), e );
}
}
protected void dump( final InputStream input ) {
new Thread( new Runnable() {
public void run() {
try {
byte[] b = new byte[1000];
while ( ( input.read( b ) ) != -1 ) {
}
} catch ( IOException e ) {
e.printStackTrace();
}
}
} ).start();
}
Метод dump()
необходим для очистки выходных буферов процесса - без него процесс не может быть запущен, как описано в документации API . Тем не менее, это все еще не работает на Win 2003. Есть ли что-то отсутствует или неправильно в этом коде? Это проблема с бамбуком? Любая помощь приветствуется.
Обновление: Я протестировал сборку Maven из командной строки на сервере, и она отлично работает. Так что это, видимо, проблема с бамбуком. Похоже, что агент Bamboo напрямую или косвенно связывает все подпроцессы, разветвленные в процессе сборки, и ждет, пока все они завершатся, прежде чем объявить сборку завершенной. Это звучит логично для агента сборки ... просто для меня это печально: - (
Обновление 2: Я также опубликовал вопрос на доске обсуждений Bamboo, получил некоторые ответы от сотрудника службы поддержки Atlassian, но пока не дал решающих результатов.