9

OSGiベースのアプリケーションの場合に継続的デプロイを機能させる方法を理解するために数時間を費やした後、私はついにスタックオーバーフローに関する最初の質問を提起し、私が間違ったことや見逃したことについてのいくつかの兆候を期待しています-どういうわけか間違った方向に進んでいるように感じます...

これが私が達成したいことです:

  1. いくつかのバンドルをビルドし、それらをMavenリポジトリにインストールします(ここでは問題ありません。bndを使用します)

  2. これで、アプリケーションを構成するすべてのバンドル(すべてのテストに合格するなど)ができたので、アプリケーションをデプロイして実行します。つまり、それらのバンドルを使用してOSGiフレームワークを起動します。

  3. 開始は問題ではありません-「mvnpax:provision -Dframework=equinox」がトリックを行います。私のアプリケーションはjettyを起動するので、ブラウザーを介して問題がないかどうかを簡単に確認できます(すべてのテストに加えて)

  4. しかし、今、「継続的」であることを試みて、次にこの手順を適用したいときは、最初にアプリケーションの実行中のインスタンスをシャットダウンすることを確認する必要があります(少なくとも使用されているポートを解放します)。したがって、すべてを再実行するには、最初に古いインストールをシャットダウンする必要があります。

そして、これが私の質問の始まりです。これを手伝ってくれるものはありますか?maven-deploy-pluginがあることは理解していますが、これはWAR / EARファイルを標準のアプリケーションコンテナーにデプロイする場合にのみ役立つようです(再起動する必要はないようです)。

私は本当にOSGi環境を起動するためにいくつかのスクリプトを実行する必要があるだけです-そして次に、それを再び起動する前にそれを正常にシャットダウンします。tomcat、jetty、jbossなどには、shutdown.shスクリプトまたはmvn jetty:stop命令がいくつかありますが、これらの種類のスクリプトを自分で作成する必要がありますか?これは私が間違った方向に進み始めていると思うところです、誰かが私の前にそれらの問題を抱えていて、私が推測するそれらを解決したに違いありません;)

どういうわけかJMXを使用するか、telnetコンソールを使用して実行中のインスタンスにアクセスして「stop0」コマンドを発行できることを理解しましたが、これは間違っていると感じます

jenkinsから開始されたプロセスは、プロジェクトをコンパイル/ビルド/デプロイする必要がありますが、実行時間の長いスレッドは開始しないと思います。そのため、次に再試行するときに最初に強制終了したいプロセスを「外部」で開始する必要があります。

何か案は?多分私は何かが欠けていますか?これに関するご意見をよろしくお願いします!

4

4 に答える 4

4

私の意見では、telnet方式が最もクリーンなようです。

ただし、創造性を発揮したい場合は、再デプロイの準備をする前にインストールする単純なシャットダウンバンドルを作成できます。インストール時にバンドルがアクティブ化されるように、自動デプロイがオンになっていることを確認してください。このバンドルがアクティブ化されたときの仕事は、現在実行中のEquinoxコンテナをクリーンにシャットダウンすることです。

再デプロイを試みる前にコンテナがシャットダウンされていることを確認する必要があるため、Telnetアプローチをお勧めします。

これらのアプローチのいずれかが気に入らない場合は、ApacheKarafをご覧ください。実行中のコンテナコマンドを送信できます。Karafを停止することなく、すべてのバンドルを停止、アンインストール、再インストールすることもできます。

Karafは、ApacheFelixまたはEclipseEquinox上で実行できます。

于 2012-06-02T20:14:38.870 に答える
3

何かが足りないかもしれませんが、アプリケーションを再デプロイ/更新するときに、なぜOSGiフレームワーク全体をシャットダウンしたいのですか?OSGiの要点は、システム全体を再起動しなくてもバンドルを更新できることです(「変更を有効にするには、Windowsを再起動する必要がある」ということを覚えていますか?)。さらに、フレームワーク全体を再起動すると、バンドルのstopメソッドでのリソースの解放に関するエラーが非表示になるため、バンドルのみを更新してテストすることを強くお勧めします(また、数回の開始/停止サイクル後にログとリソース消費を確認します! )。

もし私がそれをしていたら、私はOSGiフレームワークをMavenから完全に独立して一度だけ起動し、フレームワークを再起動せずにバンドルをデプロイおよび更新するための多くの可能な方法の1つを使用しました。

次に例を示します。*バンドルの更新バージョンが常にディスク上の特定の場所に配置されるようにシステムを構成してから、OSGiコンソール/telnet/呼び出すことを選択したOSGiフレームワークに付属する管理ツールを使用できます。 "アップデート "。

  • または、実行中のフレームワークインスタンスに接続してバンドルを更新できるツールを使用することもできます。たとえば、Eclipseには、まさにそれを実行するProSystのプラグインがあります。

  • または、実際のリモート管理ソフトウェアを使用することもできます。これは、複数のターゲットで同時にリモート展開をテストし、展開ステータスを直接監視するのに役立ちます。そのようなシステムの1つは、たとえばmPowerRemoteManagerです。

ポートの解放に関して-これに問題がある場合、理由はおそらくバンドル自体であり、OSGiフレームワークを再起動しても解決されません。実際のシナリオでは、fwの更新時にfwが再起動されることは想定されていないためです。単一のバンドル。バンドルのBundleActivatorのstop()メソッドで、すべてのスレッドを停止し、すべてのリソースを正しく解放しているかどうかを確認します。

于 2012-06-04T08:32:05.450 に答える
2

いくつかの新しい洞察とかなりの数のアプローチを確認した後、OSGiベースのアプリケーションの継続的デプロイメントに関する私自身の最初の質問に対して最も効果的であるとわかったことを文書化したいと思います。

ここでの主な問題は、実行中のOSGiアプリケーションのバンドルをディレクトリにドロップするだけで更新できないことでした(たとえば、org.apache.felix.fileinstallで実行できます)が、現在のバンドルを継続的にデプロイできるようにすることでした。 SCMからのソフトウェアの状態-最初にデプロイされたときとまったく同じように、jenkinsを介して自動的に。

私にとっての解決策は、実際にはかなり単純でした。pax-runnerのデーモンバージョンがあり、次のように利用できます。

jenkinsプロジェクト構成のポストステップで、シェルを実行します。次のようなものを配置します。

export BUILD_ID=dontKillMe
myproject/etc/scripts/postDeploy.sh &

postDeployスクリプトは次のようになります

#!/bin/bash

cd <myproject>/workspace/skysail.server.ext.osgimonitor/target
cp project.zip /somepath/pax-runner-1.8.5/

cd /somepath/pax-runner-1.8.5/

unzip project.zip

cd project
./rund.sh

次のような最終的なrund.shスクリプトを使用します

java $JAVA_OPTS -cp .:bin/pax-runner-1.8.5.jar org.ops4j.pax.runner.daemon.DaemonLauncher \
--startd --clean scan-composite:file:rund.composite \
--log=DEBUG

rund.compositeは、このようないくつかのプロビジョニングファイルを参照する単なるファイルです

scan-file:bundledefs/core.setup
scan-file:bundledefs/logging.setup
scan-file:bundledefs/restlet.setup

そして、最後にそれらのファイルの例として:

mvn:commons-lang/commons-lang/2.6
mvn:org.codehaus.jackson/jackson-core-lgpl/1.9.5
mvn:org.codehaus.jackson/jackson-mapper-lgpl/1.9.5
mvn:javax.xml.stream/com.springsource.javax.xml.stream/1.0.1
mvn:org.xmlpull/com.springsource.org.xmlpull/1.1.4.c
mvn:com.thoughtworks.xstream/com.springsource.com.thoughtworks.xstream/1.3.1
mvn:org.codehaus.jettison/com.springsource.org.codehaus.jettison/1.0.1
...

この設定では、プロジェクトがjenkinsによってビルドされるたびに、デプロイ後のスクリプトがトリガーされ、アプリケーションはクリーンな初期状態で再起動されます。

于 2013-01-13T19:39:01.913 に答える
2

bndtoolsでは、これはすべて自動化されています...ソースファイルを保存すると、jarがビルドされ、新しいバンドルを更新またはインストールするようにフレームワークに指示します。試してみてください。約3秒の驚くほど短いedit-compile-build-run-debugサイクルです。

于 2013-06-03T11:49:31.110 に答える