私はレガシー Java Enterprise サーバー プロジェクトに取り組んでおり、ナイトリー ビルドをセットアップしようとしています。Java 5、Maven 2、JBoss 4.2、Atlassian Bamboo 2.1.5 を使用しています。アイデアは、開発サーバーの 1 つに Bamboo エージェントがあり、Maven ビルドは、結果の .ear ファイルをハード デプロイするように構成されてから、サーバーを再起動するというものです。(レガシーアプリケーションはアンデプロイ中に例外を引き起こすライブラリを使用しているため、ソフトデプロイを使用できません...ある時点でそのいまいましいライブラリを取り除きますが、まだではありません。)私はJBoss Mavenプラグインを使用していますこれ。自分のマシン (ラップトップ、Win XP Professional) で Maven ビルドを実行するとうまく動作します。サーバーが停止され、最新のビルドで再起動され、ビルドが終了します。
しかし、私たちのサーバー (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();
}
このメソッドは、プロセスの出力バッファーをフラッシュするために必要です。これがないと、 API ドキュメントdump()
にも記載されているように、プロセスを実行できません。ただし、これはまだ Win 2003 では機能しません。このコードに抜けているものや間違っているものはありますか? これは竹の問題ですか?どんな助けでも大歓迎です。
更新:サーバーのコマンドラインから Maven ビルドをテストしたところ、完全に動作しました。したがって、明らかにBambooの問題です。Bamboo エージェントは、ビルド プロセスから直接的または間接的にフォークされたすべてのサブプロセスを結び付け、ビルドの終了を宣言する前に、それらすべてが終了するまで待機しているようです。これは、ビルド エージェントにとって論理的に聞こえますが、私にとっては残念な結果です :-(
更新 2:この問題を Bamboo ディスカッション ボードにも投稿しました。アトラシアンのサポート担当者からいくつかの回答を得ましたが、まだ決定的な結果は得られていません。