对詹金斯基于OSGi的应用程序的持续部署(Continuous deployment of OSGi

2019-07-29 17:06发布

花了几个小时,试图了解如何使持续部署的工作在基于OSGi的应用程序的情况后,我终于摆在我的计算器的第一个问题,希望对我可能做错了或漏掉某些适应症-不知何故我觉得是在错误的轨道上......

这是我想达到的目标:

  1. 建立一些包 ,并将其安装到Maven仓库(这里没有问题,使用BND)

  2. 现在有所有让我的应用程序(通过所有测试等)捆,我要部署和运行应用程序,也就是使用这些捆绑启动一些OSGi框架。

  3. 开始是不是问题- “MVN PAX:提供-Dframework =春分”的伎俩。 我的应用程序启动码头,所以很容易通过浏览器来验证,看看事情看起来OK(附加于所有测试)

  4. 但是,现在,试图为“连续”,下一次我想申请这个过程中,我真的应该确保先关闭我的应用程序的运行实例 (至少释放正在使用的端口)。 因此, 重新运行一切,我无论如何都必须先关闭旧的安装。

这是我的问题开始的地方:有什么帮助我吗? 我知道有行家-部署-插件 ,但这似乎只部署一些WAR / EAR文件到一些标准的应用程序容器(无需重新启动它似乎的)时是有用的。

我真的只需要运行一些脚本来启动 OSGi的环境-然后,接下来的时间,从容之前,我再次启动它, 将它关闭。 而对于Tomcat,码头,JBoss和等等,还有一些shutdown.sh脚本或MVN码头:停止指令,但是我真的有写的那种剧本我自己的? 这是我觉得我开始是错误的轨道上,一定是有人在我之前有这些问题,并解决了他们,我猜;)

我明白,我可以以某种方式尝试使用JMX或使用telnet控制台访问正在运行的实例发出“停止0”的命令,但这种感觉是错误的

流程从詹金斯开始应该编译/构建/部署项目,但没有启动长时间运行的线程我想,所以我无论如何都必须开始处理一些“外部”,我想下一次我再试试先杀死。

有任何想法吗? 也许我失去了一些东西? 在此先感谢有这方面的投入!

Answer 1:

远程登录的方式似乎是在我看来,最干净的。

但是,如果你想成为创意,你可以你准备重新部署之前创建要安装一个简单的关机包。 请确保你有那么安装的时候包被激活的自动部署。 当这束激活它的工作是正常关闭当前运行的Equinox容器。

我仍然建议远程登录的方式,你需要确保你的容器是关机尝试重新部署之前。

如果你不喜欢任何这些方法来看看阿帕奇Karaf 。 您可以发送运行的容器命令。 你甚至可以停止,卸载,然后重新安装所有的包没有人停下Karaf。

Karaf可以在Apache菲利克斯或者Eclipse的Equinox上运行。



Answer 2:

也许我失去了一些东西,但是你为什么要关闭整个OSGi框架时要重新部署/更新应用程序? OSGi的整点是,你可以更新包,而无需重启整个系统(记得爱“你必须重新启动Windows以使更改生效”的东西?)。 更重要的是,重启整个框架将隐藏关于你的包的停止方式释放资源的任何错误,所以我肯定会推荐通过仅更新包(经过几次开始检查日志和资源消耗测试/停止循环呢! )

如果我这样做,我会完全独立于行家启动OSGi框架只有一次,然后使用许多可能的方法之一部署和它更新包,无需重新启动框架。

例如:*您可以配置系统,以便捆绑的更新版本始终放在磁盘上的指定位置,然后使用OSGi的控制台/ Telnet /任何管理工具自带您选择调用OSGi框架“更新”。

  • 或者你可以使用一些工具,它可以连接到正在运行的框架实例和更新包。 例如,对于Eclipse中有一个来自ProSyst插件,这正是这么做的。

  • 或者你可以使用一些真正的远程管理软件,它可以帮助你在同一时间测试在几个目标的远程部署,也可以直接监控的部署状态。 一个这样的系统例如的mPower远程管理

关于释放的端口 - 如果你有这样的问题,其原因很可能是捆绑本身,并重新启动OSGi框架不会解决这个问题,因为在现实生活中的情况下是不应该的固件后的更新重新启动单束。 检查您是否停止所有线程和你捆绑的BundleActivator的的stop()方法正确地释放所有资源。



Answer 3:

一些新的见解后,检查出了不少办法,我想记录我发现我自己最初的问题工作最好的关于基于OSGi的应用程序的持续部署

这里的主要问题是能够仅仅通过在某些目录拖放(可与org.apache.felix.fileinstall例如完成)以更新运行OSGi应用程序包,但能连续部署当前从SCM软件的权利状态 - 自动,通过詹金斯,正是因为它看起来当正在部署的第一次等。

对我来说,解决方案是相当简单的,真的:有一个守护进程版本 PAX-亚军,这是我可以利用如下:

在詹金斯项目配置,后处理步骤,执行shell我把这样的:

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
...

有了这个设置,只要项目是由詹金斯建成,后期部署脚本,并触发应用程序在一个干净,inital状态重新启动。



Answer 4:

在bndtools这是所有自动...一旦保存源文件,它建立的罐子,并告诉它捆绑了更新,或者当它们是新安装的框架。 试试吧,约3秒神奇短编辑 - 编译 - 构建 - 运行 - 调试周期。



文章来源: Continuous deployment of OSGi-based application on jenkins