2010-02-15 41 views
1

Je travaille sur un projet de serveur Java Enterprise hérité, en essayant de mettre en place des versions nocturnes. Nous utilisons Java 5, Maven 2, JBoss 4.2 et Atlassian Bamboo 2.1.5. L'idée est que nous avons un agent Bamboo sur l'un de nos serveurs de développement, et que la version Maven est configurée pour déployer le fichier .ear résultant, puis redémarrer le serveur. (Nous ne pouvons pas utiliser le déploiement logiciel parce que notre application héritée utilise une bibliothèque qui provoque une exception lors du déploiement ... nous allons nous débarrasser de cette foutue bibliothèque à un moment donné, mais pas encore.) J'utilise le plugin JBoss Maven pour ce. Cela fonctionne bien quand je lance une construction Maven sur ma propre machine (ordinateur portable, Win XP Professional): le serveur est arrêté et redémarré avec la dernière version, et la construction se termine.Pourquoi ma build Bamboo est-elle bloquée par un sous-processus Java?

Cependant, lorsque j'essaie d'exécuter la génération nocturne sur notre serveur (Win 2003), après le démarrage du serveur JBoss, le processus de construction s'arrête. L'agent bambou affiche dans le journal:

Build MYPROJECT-NIGHTLY-44 completed. 

Et il attend là, la construction ne finition - à moins que je ferme le serveur JBoss manuellement, à quel point le processus de construction de bambou reprend et dirige ses activités post-construction , se termine alors avec

Finished building MYPROJECT-NIGHTLY-44. 

Apparemment, le processus pour démarrer le serveur JBoss se bloque en quelque sorte le processus parent sur Win 2003, alors que le même processus fonctionne indépendamment sur Win XP. Le code correspondant du plugin JBoss ressemble à ceci (reformaté par souci de concision):

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(); 
} 

La méthode dump() est nécessaire pour vider les tampons de sortie du processus - sans que le processus ne peut pas fonctionner, comme cela est documenté dans le API docs aussi. Cependant, cela ne fonctionne toujours pas sur Win 2003. Y a-t-il quelque chose qui manque ou est incorrect dans ce code? Est-ce un problème de bambou? Toute aide est appréciée.

Mise à jour: J'ai testé la construction Maven à partir de la ligne de commande sur le serveur et cela fonctionne parfaitement. Donc, c'est apparemment un problème de bambou. On dirait que l'agent Bamboo lie tous les sous-processus issus de son processus de construction directement ou indirectement, et attend qu'ils se terminent tous avant de déclarer que la construction est terminée. Ce qui semble logique de sorte pour un agent de construction ... juste a des conséquences fâcheuses pour moi :-(

Mise à jour 2: J'ai posté la question sur le forum de discussion Bamboo aussi eu quelques réponses un gars de soutien, mais Atlassian . pas encore des résultats décisifs

Répondre

1

le résultat de mon lié discussion on the Bamboo forum est: cela semble être une caractéristique de bambou, donc il n'y a pas de solution directe la solution proposée est d'utiliser le post build command plugin pour déployer l'application après le processus de construction a.

Je n'ai pas essayé cela, car j'ai trouvé une solution alternative pour déployer notre serveur un service Windows via Tanuki, en utilisant le Exec Maven Plugin.