Почему моя сборка Bamboo заблокирована подпроцессом Java? - PullRequest
1 голос
/ 15 февраля 2010

Я работаю над устаревшим проектом сервера 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, но пока не дал решающих результатов.

1 Ответ

1 голос
/ 10 марта 2010

Результат моей связанной дискуссии на форуме Bamboo таков: кажется, что это особенность Bamboo, поэтому прямого обходного пути нет. Предлагаемое решение состоит в том, чтобы использовать плагин команды post build для развертывания приложения после завершения процесса сборки.

Я не пробовал этого, поскольку нашел альтернативное решение для развертывания нашего сервера в качестве службы Windows через Tanuki с использованием Exec Maven Plugin .

...